From e0cf6b5e37eb0c7ff31dd620226db52c96ebeb10 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Mon, 3 Jun 2019 22:35:03 +0100 Subject: [PATCH] Compressed vertex data even more --- voxygen/shaders/terrain.frag | 2 +- voxygen/shaders/terrain.vert | 35 ++++++++++++++----------- voxygen/src/render/pipelines/terrain.rs | 25 +++++++++++------- world/src/sim.rs | 4 +-- 4 files changed, 37 insertions(+), 29 deletions(-) diff --git a/voxygen/shaders/terrain.frag b/voxygen/shaders/terrain.frag index cb3ea31f8d..2c9cdb6c44 100644 --- a/voxygen/shaders/terrain.frag +++ b/voxygen/shaders/terrain.frag @@ -26,7 +26,7 @@ void main() { float static_light = glob_ambience + min(sun_light, f_light); - vec3 light = static_light; + vec3 light = vec3(static_light); tgt_color = vec4(f_col * light, 1.0); } diff --git a/voxygen/shaders/terrain.vert b/voxygen/shaders/terrain.vert index 0f4d4bd306..cbf11d2747 100644 --- a/voxygen/shaders/terrain.vert +++ b/voxygen/shaders/terrain.vert @@ -2,9 +2,8 @@ #include -in uint v_pos; -in uint v_col_norm; -in uint v_light; +in uint v_pos_norm; +in uint v_col_light; layout (std140) uniform u_locals { @@ -18,24 +17,28 @@ out float f_light; void main() { f_pos = vec3( - float((v_pos >> 0) & 0x00FFu), - float((v_pos >> 8) & 0x00FFu), - float((v_pos >> 16) & 0xFFFFu) + float((v_pos_norm >> 0) & 0x00FFu), + float((v_pos_norm >> 8) & 0x00FFu), + float((v_pos_norm >> 16) & 0x1FFFu) ) + model_offs; - f_norm = vec3( - float((v_col_norm >> 0) & 0x3u), - float((v_col_norm >> 2) & 0x3u), - float((v_col_norm >> 4) & 0x3u) - ) - 1.0; - f_col = vec3( - float((v_col_norm >> 8) & 0xFFu), - float((v_col_norm >> 16) & 0xFFu), - float((v_col_norm >> 24) & 0xFFu) + float((v_col_light >> 8) & 0xFFu), + float((v_col_light >> 16) & 0xFFu), + float((v_col_light >> 24) & 0xFFu) ) / 255.0; - f_light = float(v_light) / 4096.0; + uint norm_axis = (v_pos_norm >> 30) & 0x3u; + float norm_dir = float((v_pos_norm >> 29) & 0x1u) * 2.0 - 1.0; + if (norm_axis == 0u) { + f_norm = vec3(1.0, 0.0, 0.0) * norm_dir; + } else if (norm_axis == 1u) { + f_norm = vec3(0.0, 1.0, 0.0) * norm_dir; + } else { + f_norm = vec3(0.0, 0.0, 1.0) * norm_dir; + } + + f_light = float(v_col_light & 0xFFu) / 255.0; gl_Position = proj_mat * diff --git a/voxygen/src/render/pipelines/terrain.rs b/voxygen/src/render/pipelines/terrain.rs index 6a4b720396..adb12b3b88 100644 --- a/voxygen/src/render/pipelines/terrain.rs +++ b/voxygen/src/render/pipelines/terrain.rs @@ -17,9 +17,8 @@ use vek::*; gfx_defines! { vertex Vertex { - pos: u32 = "v_pos", - col_norm: u32 = "v_col_norm", - light: u16 = "v_light", + pos_norm: u32 = "v_pos_norm", + col_light: u32 = "v_col_light", } constant Locals { @@ -39,19 +38,25 @@ gfx_defines! { impl Vertex { pub fn new(pos: Vec3, norm: Vec3, col: Rgb, light: f32) -> Self { + let (norm_axis, norm_dir) = norm + .as_slice() + .into_iter() + .enumerate() + .find(|(i, e)| **e != 0.0) + .unwrap_or((0, &1.0)); + let norm_bits = (norm_axis << 1) | if *norm_dir > 0.0 { 1 } else { 0 }; + Self { - pos: 0 + pos_norm: 0 | ((pos.x as u32) & 0x00FF) << 0 | ((pos.y as u32) & 0x00FF) << 8 - | ((pos.z as u32) & 0xFFFF) << 16, - col_norm: 0 + | ((pos.z as u32) & 0x1FFF) << 16 + | ((norm_bits as u32) & 0x7) << 29, + col_light: 0 | ((col.r.mul(255.0) as u32) & 0xFF) << 8 | ((col.g.mul(255.0) as u32) & 0xFF) << 16 | ((col.b.mul(255.0) as u32) & 0xFF) << 24 - | ((norm.x.add(1.0) as u32) & 0x3) << 0 - | ((norm.y.add(1.0) as u32) & 0x3) << 2 - | ((norm.z.add(1.0) as u32) & 0x3) << 4, - light: light.mul(4096.0) as u16, + | ((light.mul(255.0) as u32) & 0xFF) << 0, } } } diff --git a/world/src/sim.rs b/world/src/sim.rs index 8d5d867f02..411a18e02f 100644 --- a/world/src/sim.rs +++ b/world/src/sim.rs @@ -182,8 +182,8 @@ impl<'a> Sampler<'a> { .mul(0.5); // Colours - let cold_grass = Rgb::new(0.05, 0.5, 0.3); - let warm_grass = Rgb::new(0.4, 1.0, 0.05); + let cold_grass = Rgb::new(0.1, 0.6, 0.3); + let warm_grass = Rgb::new(0.25, 0.8, 0.05); let cold_stone = Rgb::new(0.55, 0.7, 0.75); let warm_stone = Rgb::new(0.65, 0.65, 0.35); let beach_sand = Rgb::new(0.93, 0.84, 0.33);