From 7af96e4655308d402b223a18666ccfec4d1a052e Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Thu, 14 Nov 2019 16:34:34 +0000 Subject: [PATCH 01/27] Added moon --- assets/voxygen/shaders/include/sky.glsl | 48 +++++++++++++++++++------ 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index 59a27f00a8..dd16252b43 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -23,9 +23,14 @@ vec3 get_sun_dir(float time_of_day) { const float TIME_FACTOR = (PI * 2.0) / (3600.0 * 24.0); float sun_angle_rad = time_of_day * TIME_FACTOR; - vec3 sun_dir = vec3(sin(sun_angle_rad), 0.0, cos(sun_angle_rad)); + return vec3(sin(sun_angle_rad), 0.0, cos(sun_angle_rad)); +} - return sun_dir; +vec3 get_moon_dir(float time_of_day) { + const float TIME_FACTOR = (PI * 2.0) / (3600.0 * 24.0); + + float moon_angle_rad = time_of_day * TIME_FACTOR; + return -vec3(sin(moon_angle_rad), 0.0, cos(moon_angle_rad)); } const float PERSISTENT_AMBIANCE = 0.1; @@ -34,12 +39,18 @@ float get_sun_brightness(vec3 sun_dir) { return max(-sun_dir.z + 0.6, 0.0) * 0.9; } +float get_moon_brightness(vec3 moon_dir) { + return max(-moon_dir.z + 0.6, 0.0) * 0.05; +} + void get_sun_diffuse(vec3 norm, float time_of_day, out vec3 light, out vec3 diffuse_light, out vec3 ambient_light, float diffusion) { const float SUN_AMBIANCE = 0.1; vec3 sun_dir = get_sun_dir(time_of_day); + vec3 moon_dir = get_moon_dir(time_of_day); float sun_light = get_sun_brightness(sun_dir); + float moon_light = get_moon_brightness(moon_dir); // clamp() changed to max() as sun_dir.z is produced from a cos() function and therefore never greater than 1 @@ -53,11 +64,17 @@ void get_sun_diffuse(vec3 norm, float time_of_day, out vec3 light, out vec3 diff max(-sun_dir.z, 0) ); - vec3 sun_chroma = sun_color * sun_light; + vec3 moon_color = vec3(0.1, 0.1, 1) * 2.5; - light = sun_chroma + PERSISTENT_AMBIANCE; - diffuse_light = sun_chroma * mix(1.0, max(dot(-norm, sun_dir) * 0.6 + 0.4, 0.0), diffusion) + PERSISTENT_AMBIANCE; - ambient_light = vec3(SUN_AMBIANCE * sun_light); + vec3 sun_chroma = sun_color * sun_light; + vec3 moon_chroma = moon_color * moon_light; + + light = sun_chroma + moon_chroma + PERSISTENT_AMBIANCE; + diffuse_light = + sun_chroma * mix(1.0, max(dot(-norm, sun_dir) * 0.6 + 0.4, 0.0), diffusion) + + moon_chroma * mix(1.0, pow(max(dot(-norm, moon_dir), 0.0), 2.0), diffusion) + + PERSISTENT_AMBIANCE; + ambient_light = vec3(SUN_AMBIANCE * sun_light + moon_light); } // This has been extracted into a function to allow quick exit when detecting a star. @@ -90,6 +107,7 @@ float is_star_at(vec3 dir) { vec3 get_sky_color(vec3 dir, float time_of_day, bool with_stars) { // Sky color vec3 sun_dir = get_sun_dir(time_of_day); + vec3 moon_dir = get_moon_dir(time_of_day); // Add white dots for stars. Note these flicker and jump due to FXAA float star = 0.0; @@ -139,21 +157,29 @@ vec3 get_sky_color(vec3 dir, float time_of_day, bool with_stars) { max(dir.z, 0) ); + // Sun + const vec3 SUN_SURF_COLOR = vec3(1.5, 0.9, 0.35) * 200.0; + vec3 sun_halo_color = mix( SUN_HALO_DUSK, SUN_HALO_DAY, max(-sun_dir.z, 0) ); - // Sun - - const vec3 SUN_SURF_COLOR = vec3(1.5, 0.9, 0.35) * 200.0; - vec3 sun_halo = pow(max(dot(dir, -sun_dir) + 0.1, 0.0), 8.0) * sun_halo_color; vec3 sun_surf = pow(max(dot(dir, -sun_dir) - 0.001, 0.0), 3000.0) * SUN_SURF_COLOR; vec3 sun_light = (sun_halo + sun_surf) * clamp(dir.z * 10.0, 0, 1); - return sky_color + sun_light; + // Moon + const vec3 MOON_SURF_COLOR = vec3(0.7, 1.0, 1.5) * 500.0; + + vec3 moon_halo_color = vec3(0.01, 0.01, 0.02); + + vec3 moon_halo = pow(max(dot(dir, -moon_dir) + 0.1, 0.0), 8.0) * moon_halo_color; + vec3 moon_surf = pow(max(dot(dir, -moon_dir) - 0.001, 0.0), 3000.0) * MOON_SURF_COLOR; + vec3 moon_light = clamp(moon_halo + moon_surf, vec3(0), vec3(clamp(dir.z * 3.0, 0, 1))); + + return sky_color + sun_light + moon_light; } float fog(vec3 f_pos, vec3 focus_pos, uint medium) { From 9aa2bfe591eaaf642b2b239dc4060b31b81c8f44 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Thu, 14 Nov 2019 16:36:36 +0000 Subject: [PATCH 02/27] Better moonlight --- assets/voxygen/shaders/include/sky.glsl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index dd16252b43..db2bf542b9 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -40,7 +40,7 @@ float get_sun_brightness(vec3 sun_dir) { } float get_moon_brightness(vec3 moon_dir) { - return max(-moon_dir.z + 0.6, 0.0) * 0.05; + return max(-moon_dir.z + 0.6, 0.0) * 0.07; } void get_sun_diffuse(vec3 norm, float time_of_day, out vec3 light, out vec3 diffuse_light, out vec3 ambient_light, float diffusion) { @@ -64,7 +64,7 @@ void get_sun_diffuse(vec3 norm, float time_of_day, out vec3 light, out vec3 diff max(-sun_dir.z, 0) ); - vec3 moon_color = vec3(0.1, 0.1, 1) * 2.5; + vec3 moon_color = vec3(0.1, 0.1, 1) * 1.5; vec3 sun_chroma = sun_color * sun_light; vec3 moon_chroma = moon_color * moon_light; From 07262fa39907df7d044a97a5e7395e519b96d495 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Thu, 14 Nov 2019 16:42:02 +0000 Subject: [PATCH 03/27] Prevented the moon rising/setting too early/late --- assets/voxygen/shaders/include/sky.glsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index db2bf542b9..d60345f962 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -30,7 +30,7 @@ vec3 get_moon_dir(float time_of_day) { const float TIME_FACTOR = (PI * 2.0) / (3600.0 * 24.0); float moon_angle_rad = time_of_day * TIME_FACTOR; - return -vec3(sin(moon_angle_rad), 0.0, cos(moon_angle_rad)); + return normalize(-vec3(sin(moon_angle_rad), 0.0, cos(moon_angle_rad) - 0.5)); } const float PERSISTENT_AMBIANCE = 0.1; From 2c5d21ddf5e54a8578c0536081f611dacab5b2d7 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Sun, 17 Nov 2019 22:41:00 +0000 Subject: [PATCH 04/27] Added clouds --- assets/voxygen/shaders/figure-frag.glsl | 2 +- assets/voxygen/shaders/fluid-frag.glsl | 6 +- assets/voxygen/shaders/include/sky.glsl | 101 ++++++++++++++++++++--- assets/voxygen/shaders/skybox-frag.glsl | 2 +- assets/voxygen/shaders/sprite-frag.glsl | 2 +- assets/voxygen/shaders/terrain-frag.glsl | 2 +- assets/voxygen/texture/noise.png | Bin 0 -> 9532 bytes voxygen/src/render/pipelines/figure.rs | 2 + voxygen/src/render/pipelines/fluid.rs | 1 + voxygen/src/render/pipelines/skybox.rs | 2 + voxygen/src/render/pipelines/sprite.rs | 2 + voxygen/src/render/pipelines/terrain.rs | 2 + voxygen/src/render/renderer.rs | 33 +++++--- voxygen/src/render/texture.rs | 44 +++++----- voxygen/src/scene/terrain.rs | 2 +- voxygen/src/ui/cache.rs | 6 +- voxygen/src/ui/graphic/mod.rs | 13 +-- 17 files changed, 158 insertions(+), 64 deletions(-) create mode 100644 assets/voxygen/texture/noise.png diff --git a/assets/voxygen/shaders/figure-frag.glsl b/assets/voxygen/shaders/figure-frag.glsl index 06156e2cf2..88d757817e 100644 --- a/assets/voxygen/shaders/figure-frag.glsl +++ b/assets/voxygen/shaders/figure-frag.glsl @@ -39,7 +39,7 @@ void main() { vec3 surf_color = illuminate(srgb_to_linear(model_col.rgb * f_col), light, diffuse_light, ambient_light); float fog_level = fog(f_pos.xyz, focus_pos.xyz, medium.x); - vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, true); + vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, true); vec3 color = mix(surf_color, fog_color, fog_level); tgt_color = vec4(color, 1.0); diff --git a/assets/voxygen/shaders/fluid-frag.glsl b/assets/voxygen/shaders/fluid-frag.glsl index 2d4f3bae7b..276cd7ccef 100644 --- a/assets/voxygen/shaders/fluid-frag.glsl +++ b/assets/voxygen/shaders/fluid-frag.glsl @@ -50,7 +50,7 @@ float wave_height(vec3 pos) { 0.0 ); - return pow(abs(height), 0.5) * sign(height) * 3.0; + return pow(abs(height), 0.5) * sign(height) * 1.5; } void main() { @@ -113,13 +113,13 @@ void main() { vec3 surf_color = illuminate(srgb_to_linear(f_col), light, diffuse_light, ambient_light); float fog_level = fog(f_pos.xyz, focus_pos.xyz, medium.x); - vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, true); + vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, true); vec3 reflect_ray_dir = reflect(cam_to_frag, norm); // Hack to prevent the reflection ray dipping below the horizon and creating weird blue spots in the water reflect_ray_dir.z = max(reflect_ray_dir.z, 0.05); - vec3 reflect_color = get_sky_color(reflect_ray_dir, time_of_day.x, false) * f_light; + vec3 reflect_color = get_sky_color(reflect_ray_dir, time_of_day.x, f_pos, false) * f_light; // 0 = 100% reflection, 1 = translucent water float passthrough = pow(dot(faceforward(f_norm, f_norm, cam_to_frag), -cam_to_frag), 0.5); diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index d60345f962..2cefc6ab16 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -1,5 +1,7 @@ #include +uniform sampler2D t_noise; + const float PI = 3.141592; const vec3 SKY_DAY_TOP = vec3(0.1, 0.2, 0.9); @@ -43,6 +45,22 @@ float get_moon_brightness(vec3 moon_dir) { return max(-moon_dir.z + 0.6, 0.0) * 0.07; } +vec3 get_sun_color(vec3 sun_dir) { + return mix( + mix( + DUSK_LIGHT, + NIGHT_LIGHT, + max(sun_dir.z, 0) + ), + DAY_LIGHT, + max(-sun_dir.z, 0) + ); +} + +vec3 get_moon_color(vec3 moon_dir) { + return vec3(0.15, 0.15, 1.5); +} + void get_sun_diffuse(vec3 norm, float time_of_day, out vec3 light, out vec3 diffuse_light, out vec3 ambient_light, float diffusion) { const float SUN_AMBIANCE = 0.1; @@ -54,17 +72,9 @@ void get_sun_diffuse(vec3 norm, float time_of_day, out vec3 light, out vec3 diff // clamp() changed to max() as sun_dir.z is produced from a cos() function and therefore never greater than 1 - vec3 sun_color = mix( - mix( - DUSK_LIGHT, - NIGHT_LIGHT, - max(sun_dir.z, 0) - ), - DAY_LIGHT, - max(-sun_dir.z, 0) - ); + vec3 sun_color = get_sun_color(sun_dir); - vec3 moon_color = vec3(0.1, 0.1, 1) * 1.5; + vec3 moon_color = get_moon_color(moon_dir); vec3 sun_chroma = sun_color * sun_light; vec3 moon_chroma = moon_color * moon_light; @@ -104,7 +114,70 @@ float is_star_at(vec3 dir) { return 0.0; } -vec3 get_sky_color(vec3 dir, float time_of_day, bool with_stars) { +vec3 pos_at_height(vec3 dir, float height) { + float dist = height / dir.z; + return dir * dist; +} + +const float CLOUD_AVG_HEIGHT = 1500.0; +const float CLOUD_HEIGHT_MIN = CLOUD_AVG_HEIGHT - 100.0; +const float CLOUD_HEIGHT_MAX = CLOUD_AVG_HEIGHT + 100.0; +const float CLOUD_THRESHOLD = 0.3; +const float CLOUD_SCALE = 1.0; +const float CLOUD_DENSITY = 50.0; + +float spow(float x, float e) { + return sign(x) * pow(abs(x), e); +} + +vec4 cloud_at(vec3 pos) { + float hdist = distance(pos.xy, cam_pos.xy) / 100000.0; + if (hdist > 1.0) { // Maximum cloud distance + return vec4(0.0); + } + + float value = ( + 0.0 + + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0003 - tick.x * 0.01).x + + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0009 + tick.x * 0.03).x * 0.5 + + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0025 - tick.x * 0.05).x * 0.25 + ) / 2.75; + + float density = max((value - CLOUD_THRESHOLD) - abs(pos.z - CLOUD_AVG_HEIGHT) / 2000.0, 0.0) * CLOUD_DENSITY; + + vec3 color = vec3(1.0) * (1.0 - pow(max(CLOUD_AVG_HEIGHT - pos.z, 0.0), 0.25) / 2.5); + + return vec4(color, density / max((hdist - 0.7) * 100.0, 1.0)); +} + +vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist) { + float mind = (CLOUD_HEIGHT_MIN - cam_pos.z) / dir.z; + float maxd = (CLOUD_HEIGHT_MAX - cam_pos.z) / dir.z; + + float start = max(min(mind, maxd), 0.0); + float delta = abs(mind - maxd); + + if (delta <= 0.0) { + return vec4(0); + } + + vec3 cloud_col = vec3(1); + float passthrough = 1.0; + const float INCR = 0.05; + for (float d = 0.0; d < 1.0; d += INCR) { + float dist = start + d * delta; + vec3 pos = cam_pos.xyz + dir * dist; + vec4 sample = cloud_at(pos); + if (dist < max_dist) { + passthrough *= (1.0 - sample.a * INCR); + cloud_col = mix(cloud_col, sample.rgb, passthrough * sample.a * INCR); + } + } + + return vec4(cloud_col, 1.0 - passthrough / (1.0 + delta * 0.0003)); +} + +vec3 get_sky_color(vec3 dir, float time_of_day, vec3 f_pos, bool with_stars) { // Sky color vec3 sun_dir = get_sun_dir(time_of_day); vec3 moon_dir = get_moon_dir(time_of_day); @@ -179,7 +252,11 @@ vec3 get_sky_color(vec3 dir, float time_of_day, bool with_stars) { vec3 moon_surf = pow(max(dot(dir, -moon_dir) - 0.001, 0.0), 3000.0) * MOON_SURF_COLOR; vec3 moon_light = clamp(moon_halo + moon_surf, vec3(0), vec3(clamp(dir.z * 3.0, 0, 1))); - return sky_color + sun_light + moon_light; + // Clouds + vec4 clouds = get_cloud_color(dir, time_of_day, distance(cam_pos.xyz, f_pos)); + clouds.rgb *= get_sun_brightness(sun_dir) * get_sun_color(sun_dir) + get_moon_brightness(moon_dir) * get_moon_color(moon_dir); + + return mix(sky_color + sun_light + moon_light, clouds.rgb, clouds.a); } float fog(vec3 f_pos, vec3 focus_pos, uint medium) { diff --git a/assets/voxygen/shaders/skybox-frag.glsl b/assets/voxygen/shaders/skybox-frag.glsl index 9277816577..ac5624aea9 100644 --- a/assets/voxygen/shaders/skybox-frag.glsl +++ b/assets/voxygen/shaders/skybox-frag.glsl @@ -13,5 +13,5 @@ uniform u_locals { out vec4 tgt_color; void main() { - tgt_color = vec4(get_sky_color(normalize(f_pos), time_of_day.x, true), 1.0); + tgt_color = vec4(get_sky_color(normalize(f_pos), time_of_day.x, vec3(100000), true), 1.0); } diff --git a/assets/voxygen/shaders/sprite-frag.glsl b/assets/voxygen/shaders/sprite-frag.glsl index d243cb5368..50add1e0d7 100644 --- a/assets/voxygen/shaders/sprite-frag.glsl +++ b/assets/voxygen/shaders/sprite-frag.glsl @@ -27,7 +27,7 @@ void main() { vec3 surf_color = illuminate(f_col, light, diffuse_light, ambient_light); float fog_level = fog(f_pos.xyz, focus_pos.xyz, medium.x); - vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, true); + vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, true); vec3 color = mix(surf_color, fog_color, fog_level); tgt_color = vec4(color, 1.0 - clamp((distance(focus_pos.xy, f_pos.xy) - (RENDER_DIST - FADE_DIST)) / FADE_DIST, 0, 1)); diff --git a/assets/voxygen/shaders/terrain-frag.glsl b/assets/voxygen/shaders/terrain-frag.glsl index 7727afe185..6067dbfee7 100644 --- a/assets/voxygen/shaders/terrain-frag.glsl +++ b/assets/voxygen/shaders/terrain-frag.glsl @@ -40,7 +40,7 @@ void main() { vec3 surf_color = illuminate(srgb_to_linear(f_col), light, diffuse_light, ambient_light); float fog_level = fog(f_pos.xyz, focus_pos.xyz, medium.x); - vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, true); + vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, true); vec3 color = mix(surf_color, fog_color, fog_level); tgt_color = vec4(color, 1.0); diff --git a/assets/voxygen/texture/noise.png b/assets/voxygen/texture/noise.png new file mode 100644 index 0000000000000000000000000000000000000000..1ffcbb1be0dab9b57ba1f0e79b26e548b10b33a4 GIT binary patch literal 9532 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 a#eV^6`g1SZVJvR|0000 = "u_lights", shadows: gfx::ConstantBuffer = "u_shadows", + noise: gfx::TextureSampler = "t_noise", + tgt_color: gfx::RenderTarget = "tgt_color", tgt_depth: gfx::DepthTarget = gfx::preset::depth::LESS_EQUAL_WRITE, } diff --git a/voxygen/src/render/pipelines/fluid.rs b/voxygen/src/render/pipelines/fluid.rs index e387437da1..67264323ad 100644 --- a/voxygen/src/render/pipelines/fluid.rs +++ b/voxygen/src/render/pipelines/fluid.rs @@ -29,6 +29,7 @@ gfx_defines! { lights: gfx::ConstantBuffer = "u_lights", shadows: gfx::ConstantBuffer = "u_shadows", + noise: gfx::TextureSampler = "t_noise", waves: gfx::TextureSampler<[f32; 4]> = "t_waves", tgt_color: gfx::BlendTarget = ("tgt_color", ColorMask::all(), gfx::preset::blend::ALPHA), diff --git a/voxygen/src/render/pipelines/skybox.rs b/voxygen/src/render/pipelines/skybox.rs index 35aed1d861..06446c0468 100644 --- a/voxygen/src/render/pipelines/skybox.rs +++ b/voxygen/src/render/pipelines/skybox.rs @@ -28,6 +28,8 @@ gfx_defines! { locals: gfx::ConstantBuffer = "u_locals", globals: gfx::ConstantBuffer = "u_globals", + noise: gfx::TextureSampler = "t_noise", + tgt_color: gfx::RenderTarget = "tgt_color", tgt_depth: gfx::DepthTarget = gfx::preset::depth::PASS_TEST, } diff --git a/voxygen/src/render/pipelines/sprite.rs b/voxygen/src/render/pipelines/sprite.rs index be80c49afd..9dcfef88c9 100644 --- a/voxygen/src/render/pipelines/sprite.rs +++ b/voxygen/src/render/pipelines/sprite.rs @@ -38,6 +38,8 @@ gfx_defines! { lights: gfx::ConstantBuffer = "u_lights", shadows: gfx::ConstantBuffer = "u_shadows", + noise: gfx::TextureSampler = "t_noise", + tgt_color: gfx::BlendTarget = ("tgt_color", ColorMask::all(), gfx::preset::blend::ALPHA), tgt_depth: gfx::DepthTarget = gfx::preset::depth::LESS_EQUAL_WRITE, } diff --git a/voxygen/src/render/pipelines/terrain.rs b/voxygen/src/render/pipelines/terrain.rs index cb264261e2..073185630e 100644 --- a/voxygen/src/render/pipelines/terrain.rs +++ b/voxygen/src/render/pipelines/terrain.rs @@ -34,6 +34,8 @@ gfx_defines! { lights: gfx::ConstantBuffer = "u_lights", shadows: gfx::ConstantBuffer = "u_shadows", + noise: gfx::TextureSampler = "t_noise", + tgt_color: gfx::RenderTarget = "tgt_color", tgt_depth: gfx::DepthTarget = gfx::preset::depth::LESS_EQUAL_WRITE, } diff --git a/voxygen/src/render/renderer.rs b/voxygen/src/render/renderer.rs index 94c2330915..7097be53cd 100644 --- a/voxygen/src/render/renderer.rs +++ b/voxygen/src/render/renderer.rs @@ -72,6 +72,8 @@ pub struct Renderer { shader_reload_indicator: ReloadIndicator, + noise_tex: Texture<(gfx::format::R8, gfx::format::Unorm)>, + aa_mode: AaMode, } @@ -102,6 +104,13 @@ impl Renderer { let sampler = factory.create_sampler_linear(); + let noise_tex = Texture::new( + &mut factory, + &assets::load_expect("voxygen.texture.noise"), + Some(gfx::texture::FilterMethod::Trilinear), + Some(gfx::texture::WrapMode::Tile), + )?; + Ok(Self { device, encoder: factory.create_command_buffer().into(), @@ -126,6 +135,8 @@ impl Renderer { shader_reload_indicator, + noise_tex, + aa_mode, }) } @@ -351,27 +362,24 @@ impl Renderer { } /// Create a new texture from the provided image. - pub fn create_texture( + pub fn create_texture( &mut self, image: &image::DynamicImage, filter_method: Option, wrap_mode: Option, - ) -> Result, RenderError> { + ) -> Result { Texture::new(&mut self.factory, image, filter_method, wrap_mode) } /// Create a new dynamic texture (gfx::memory::Usage::Dynamic) with the specified dimensions. - pub fn create_dynamic_texture( - &mut self, - dims: Vec2, - ) -> Result, RenderError> { + pub fn create_dynamic_texture(&mut self, dims: Vec2) -> Result { Texture::new_dynamic(&mut self.factory, dims.x, dims.y) } /// Update a texture with the provided offset, size, and data. - pub fn update_texture( + pub fn update_texture( &mut self, - texture: &Texture

, + texture: &Texture, offset: [u16; 2], size: [u16; 2], data: &[[u8; 4]], @@ -444,6 +452,7 @@ impl Renderer { vbuf: model.vbuf.clone(), locals: locals.buf.clone(), globals: globals.buf.clone(), + noise: (self.noise_tex.srv.clone(), self.noise_tex.sampler.clone()), tgt_color: self.tgt_color_view.clone(), tgt_depth: self.tgt_depth_view.clone(), }, @@ -476,6 +485,7 @@ impl Renderer { bones: bones.buf.clone(), lights: lights.buf.clone(), shadows: shadows.buf.clone(), + noise: (self.noise_tex.srv.clone(), self.noise_tex.sampler.clone()), tgt_color: self.tgt_color_view.clone(), tgt_depth: self.tgt_depth_view.clone(), }, @@ -506,6 +516,7 @@ impl Renderer { globals: globals.buf.clone(), lights: lights.buf.clone(), shadows: shadows.buf.clone(), + noise: (self.noise_tex.srv.clone(), self.noise_tex.sampler.clone()), tgt_color: self.tgt_color_view.clone(), tgt_depth: self.tgt_depth_view.clone(), }, @@ -520,7 +531,7 @@ impl Renderer { locals: &Consts, lights: &Consts, shadows: &Consts, - waves: &Texture, + waves: &Texture, ) { self.encoder.draw( &gfx::Slice { @@ -537,6 +548,7 @@ impl Renderer { globals: globals.buf.clone(), lights: lights.buf.clone(), shadows: shadows.buf.clone(), + noise: (self.noise_tex.srv.clone(), self.noise_tex.sampler.clone()), waves: (waves.srv.clone(), waves.sampler.clone()), tgt_color: self.tgt_color_view.clone(), tgt_depth: self.tgt_depth_view.clone(), @@ -568,6 +580,7 @@ impl Renderer { globals: globals.buf.clone(), lights: lights.buf.clone(), shadows: shadows.buf.clone(), + noise: (self.noise_tex.srv.clone(), self.noise_tex.sampler.clone()), tgt_color: self.tgt_color_view.clone(), tgt_depth: self.tgt_depth_view.clone(), }, @@ -578,7 +591,7 @@ impl Renderer { pub fn render_ui_element( &mut self, model: &Model, - tex: &Texture, + tex: &Texture, scissor: Aabr, globals: &Consts, locals: &Consts, diff --git a/voxygen/src/render/texture.rs b/voxygen/src/render/texture.rs index 66d0af88c4..08fa7ac69b 100644 --- a/voxygen/src/render/texture.rs +++ b/voxygen/src/render/texture.rs @@ -1,26 +1,32 @@ -use super::{gfx_backend, Pipeline, RenderError}; +use super::{gfx_backend, RenderError}; use gfx::{self, traits::Factory}; use image::{DynamicImage, GenericImageView}; use std::marker::PhantomData; use vek::Vec2; -type ShaderFormat = (gfx::format::R8_G8_B8_A8, gfx::format::Srgb); +type DefaultShaderFormat = (gfx::format::R8_G8_B8_A8, gfx::format::Srgb); /// Represents an image that has been uploaded to the GPU. -pub struct Texture { - pub tex: gfx::handle::Texture< - gfx_backend::Resources, - ::Surface, - >, +pub struct Texture +where + F::Surface: gfx::format::TextureSurface, + F::Channel: gfx::format::TextureChannel, + ::DataType: Copy, +{ + pub tex: gfx::handle::Texture::Surface>, pub srv: gfx::handle::ShaderResourceView< gfx_backend::Resources, - ::View, + ::View, >, pub sampler: gfx::handle::Sampler, - _phantom: PhantomData

, } -impl Texture

{ +impl Texture +where + F::Surface: gfx::format::TextureSurface, + F::Channel: gfx::format::TextureChannel, + ::DataType: Copy, +{ pub fn new( factory: &mut gfx_backend::Factory, image: &DynamicImage, @@ -28,14 +34,14 @@ impl Texture

{ wrap_mode: Option, ) -> Result { let (tex, srv) = factory - .create_texture_immutable_u8::( + .create_texture_immutable_u8::( gfx::texture::Kind::D2( image.width() as u16, image.height() as u16, gfx::texture::AaMode::Single, ), gfx::texture::Mipmap::Provided, - &[&image.to_rgba().into_raw()], + &[&image.raw_pixels()], ) .map_err(|err| RenderError::CombinedError(err))?; @@ -46,7 +52,6 @@ impl Texture

{ filter_method.unwrap_or(gfx::texture::FilterMethod::Scale), wrap_mode.unwrap_or(gfx::texture::WrapMode::Clamp), )), - _phantom: PhantomData, }) } @@ -64,16 +69,12 @@ impl Texture

{ 1 as gfx::texture::Level, gfx::memory::Bind::SHADER_RESOURCE, gfx::memory::Usage::Dynamic, - Some(<::Channel as gfx::format::ChannelTyped>::get_channel_type()), + Some(<::Channel as gfx::format::ChannelTyped>::get_channel_type()), ) .map_err(|err| RenderError::CombinedError(gfx::CombinedError::Texture(err)))?; let srv = factory - .view_texture_as_shader_resource::( - &tex, - (0, 0), - gfx::format::Swizzle::new(), - ) + .view_texture_as_shader_resource::(&tex, (0, 0), gfx::format::Swizzle::new()) .map_err(|err| RenderError::CombinedError(gfx::CombinedError::Resource(err)))?; Ok(Self { @@ -83,7 +84,6 @@ impl Texture

{ gfx::texture::FilterMethod::Scale, gfx::texture::WrapMode::Clamp, )), - _phantom: PhantomData, }) } @@ -93,7 +93,7 @@ impl Texture

{ encoder: &mut gfx::Encoder, offset: [u16; 2], size: [u16; 2], - data: &[[u8; 4]], + data: &[::DataType], ) -> Result<(), RenderError> { let info = gfx::texture::ImageInfoCommon { xoffset: offset[0], @@ -106,7 +106,7 @@ impl Texture

{ mipmap: 0, }; encoder - .update_texture::<::Surface, ShaderFormat>( + .update_texture::<::Surface, F>( &self.tex, None, info, data, ) .map_err(|err| RenderError::TexUpdateError(err)) diff --git a/voxygen/src/scene/terrain.rs b/voxygen/src/scene/terrain.rs index 3a7c93f6bf..382859b60e 100644 --- a/voxygen/src/scene/terrain.rs +++ b/voxygen/src/scene/terrain.rs @@ -212,7 +212,7 @@ pub struct Terrain { // GPU data sprite_models: HashMap<(BlockKind, usize), Model>, - waves: Texture, + waves: Texture, phantom: PhantomData, } diff --git a/voxygen/src/ui/cache.rs b/voxygen/src/ui/cache.rs index 51727c39e2..36604f2bfb 100644 --- a/voxygen/src/ui/cache.rs +++ b/voxygen/src/ui/cache.rs @@ -14,7 +14,7 @@ const POSITION_TOLERANCE: f32 = 0.1; pub struct Cache { glyph_cache: GlyphCache<'static>, - glyph_cache_tex: Texture, + glyph_cache_tex: Texture, graphic_cache: GraphicCache, } @@ -38,10 +38,10 @@ impl Cache { graphic_cache: GraphicCache::new(renderer), }) } - pub fn glyph_cache_tex(&self) -> &Texture { + pub fn glyph_cache_tex(&self) -> &Texture { &self.glyph_cache_tex } - pub fn glyph_cache_mut_and_tex(&mut self) -> (&mut GlyphCache<'static>, &Texture) { + pub fn glyph_cache_mut_and_tex(&mut self) -> (&mut GlyphCache<'static>, &Texture) { (&mut self.glyph_cache, &self.glyph_cache_tex) } pub fn graphic_cache(&self) -> &GraphicCache { diff --git a/voxygen/src/ui/graphic/mod.rs b/voxygen/src/ui/graphic/mod.rs index 7bdb59c3db..8fba234e68 100644 --- a/voxygen/src/ui/graphic/mod.rs +++ b/voxygen/src/ui/graphic/mod.rs @@ -84,7 +84,7 @@ pub struct GraphicCache { // Atlases with the index of their texture in the textures vec atlases: Vec<(SimpleAtlasAllocator, usize)>, - textures: Vec>, + textures: Vec, // Stores the location of graphics rendered at a particular resolution and cached on the cpu cache_map: HashMap, } @@ -131,7 +131,7 @@ impl GraphicCache { self.graphic_map.get(&id) } /// Used to aquire textures for rendering - pub fn get_tex(&self, id: TexId) -> &Texture { + pub fn get_tex(&self, id: TexId) -> &Texture { self.textures.get(id.0).expect("Invalid TexId used") } pub fn clear_cache(&mut self, renderer: &mut Renderer) { @@ -302,7 +302,7 @@ fn draw_graphic(graphic_map: &GraphicMap, graphic_id: Id, dims: Vec2) -> Op } } -fn create_atlas_texture(renderer: &mut Renderer) -> (SimpleAtlasAllocator, Texture) { +fn create_atlas_texture(renderer: &mut Renderer) -> (SimpleAtlasAllocator, Texture) { let (w, h) = renderer.get_resolution().into_tuple(); let max_texture_size = renderer.max_texture_size(); @@ -326,12 +326,7 @@ fn aabr_from_alloc_rect(rect: guillotiere::Rectangle) -> Aabr { } } -fn upload_image( - renderer: &mut Renderer, - aabr: Aabr, - tex: &Texture, - image: &RgbaImage, -) { +fn upload_image(renderer: &mut Renderer, aabr: Aabr, tex: &Texture, image: &RgbaImage) { let offset = aabr.min.into_array(); let size = aabr.size().into_array(); if let Err(err) = renderer.update_texture( From e9d01da35812d6f68bf0cb43aae8837a3ce068ba Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Mon, 18 Nov 2019 01:01:15 +0000 Subject: [PATCH 05/27] Faster and more visually pleasing clouds --- assets/voxygen/shaders/fluid-frag.glsl | 2 +- assets/voxygen/shaders/include/sky.glsl | 61 ++++++++++++++----------- assets/voxygen/shaders/skybox-frag.glsl | 2 +- assets/voxygen/shaders/skybox-vert.glsl | 3 +- voxygen/src/scene/mod.rs | 2 +- 5 files changed, 39 insertions(+), 31 deletions(-) diff --git a/assets/voxygen/shaders/fluid-frag.glsl b/assets/voxygen/shaders/fluid-frag.glsl index 276cd7ccef..5e537b8948 100644 --- a/assets/voxygen/shaders/fluid-frag.glsl +++ b/assets/voxygen/shaders/fluid-frag.glsl @@ -119,7 +119,7 @@ void main() { // Hack to prevent the reflection ray dipping below the horizon and creating weird blue spots in the water reflect_ray_dir.z = max(reflect_ray_dir.z, 0.05); - vec3 reflect_color = get_sky_color(reflect_ray_dir, time_of_day.x, f_pos, false) * f_light; + vec3 reflect_color = get_sky_color(reflect_ray_dir, time_of_day.x, vec3(-100000), false) * f_light; // 0 = 100% reflection, 1 = translucent water float passthrough = pow(dot(faceforward(f_norm, f_norm, cam_to_frag), -cam_to_frag), 0.5); diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index 2cefc6ab16..335fc0dca7 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -6,7 +6,7 @@ const float PI = 3.141592; const vec3 SKY_DAY_TOP = vec3(0.1, 0.2, 0.9); const vec3 SKY_DAY_MID = vec3(0.02, 0.08, 0.8); -const vec3 SKY_DAY_BOT = vec3(0.02, 0.01, 0.3); +const vec3 SKY_DAY_BOT = vec3(0.02, 0.1, 0.3); const vec3 DAY_LIGHT = vec3(1.2, 1.0, 1.0); const vec3 SUN_HALO_DAY = vec3(0.35, 0.35, 0.0); @@ -114,63 +114,72 @@ float is_star_at(vec3 dir) { return 0.0; } -vec3 pos_at_height(vec3 dir, float height) { - float dist = height / dir.z; - return dir * dist; -} - -const float CLOUD_AVG_HEIGHT = 1500.0; +const float CLOUD_AVG_HEIGHT = 1200.0; const float CLOUD_HEIGHT_MIN = CLOUD_AVG_HEIGHT - 100.0; const float CLOUD_HEIGHT_MAX = CLOUD_AVG_HEIGHT + 100.0; const float CLOUD_THRESHOLD = 0.3; const float CLOUD_SCALE = 1.0; -const float CLOUD_DENSITY = 50.0; +const float CLOUD_DENSITY = 100.0; float spow(float x, float e) { return sign(x) * pow(abs(x), e); } vec4 cloud_at(vec3 pos) { - float hdist = distance(pos.xy, cam_pos.xy) / 100000.0; - if (hdist > 1.0) { // Maximum cloud distance - return vec4(0.0); - } + float tick_offs = 0.0 + + texture(t_noise, pos.xy * 0.0001).x + + texture(t_noise, pos.xy * 0.000003).x * 10.0; float value = ( 0.0 - + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0003 - tick.x * 0.01).x - + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0009 + tick.x * 0.03).x * 0.5 - + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0025 - tick.x * 0.05).x * 0.25 - ) / 2.75; + + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0003 - tick.x * 0.003 + tick_offs).x + + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0009 + tick.x * 0.01).x * 0.5 + + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0025 - tick.x * 0.02).x * 0.25 + + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0075 - tick.x * 0.03).x * 0.07 + ) / 2.85; - float density = max((value - CLOUD_THRESHOLD) - abs(pos.z - CLOUD_AVG_HEIGHT) / 2000.0, 0.0) * CLOUD_DENSITY; + float density = max((value - CLOUD_THRESHOLD) - abs(pos.z - CLOUD_AVG_HEIGHT) / 800.0, 0.0) * CLOUD_DENSITY; - vec3 color = vec3(1.0) * (1.0 - pow(max(CLOUD_AVG_HEIGHT - pos.z, 0.0), 0.25) / 2.5); + vec3 color = vec3(1.0) * (0.5 - min(pow(max(CLOUD_AVG_HEIGHT - pos.z, 0.0), 0.5), 1.0) / 1.0); - return vec4(color, density / max((hdist - 0.7) * 100.0, 1.0)); + return vec4(color, density / (1.0 + distance(pos, cam_pos.xyz) / 10000)); } vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist) { + const float INCR = 0.04; + float mind = (CLOUD_HEIGHT_MIN - cam_pos.z) / dir.z; float maxd = (CLOUD_HEIGHT_MAX - cam_pos.z) / dir.z; float start = max(min(mind, maxd), 0.0); float delta = abs(mind - maxd); + float incr = INCR;//min(INCR + start / 100000.0, INCR * 2.0); + + float fuzz = texture(t_noise, dir.xy * 1000000.0).x * 0.75 * incr * delta; + if (delta <= 0.0) { return vec4(0); } vec3 cloud_col = vec3(1); float passthrough = 1.0; - const float INCR = 0.05; - for (float d = 0.0; d < 1.0; d += INCR) { - float dist = start + d * delta; + for (float d = 0.0; d < 1.0; d += incr) { + float dist = start + d * delta + fuzz; vec3 pos = cam_pos.xyz + dir * dist; vec4 sample = cloud_at(pos); + float factor; if (dist < max_dist) { - passthrough *= (1.0 - sample.a * INCR); - cloud_col = mix(cloud_col, sample.rgb, passthrough * sample.a * INCR); + factor = 1.0; + } else { + factor = incr * (dist - max_dist) / delta; + } + + passthrough *= (1.0 - sample.a * incr * factor); + cloud_col = mix(cloud_col, sample.rgb, passthrough * sample.a * incr * factor); + + if (factor < 1.0) { + break; } } @@ -246,7 +255,7 @@ vec3 get_sky_color(vec3 dir, float time_of_day, vec3 f_pos, bool with_stars) { // Moon const vec3 MOON_SURF_COLOR = vec3(0.7, 1.0, 1.5) * 500.0; - vec3 moon_halo_color = vec3(0.01, 0.01, 0.02); + vec3 moon_halo_color = vec3(0.015, 0.015, 0.03); vec3 moon_halo = pow(max(dot(dir, -moon_dir) + 0.1, 0.0), 8.0) * moon_halo_color; vec3 moon_surf = pow(max(dot(dir, -moon_dir) - 0.001, 0.0), 3000.0) * MOON_SURF_COLOR; @@ -254,7 +263,7 @@ vec3 get_sky_color(vec3 dir, float time_of_day, vec3 f_pos, bool with_stars) { // Clouds vec4 clouds = get_cloud_color(dir, time_of_day, distance(cam_pos.xyz, f_pos)); - clouds.rgb *= get_sun_brightness(sun_dir) * get_sun_color(sun_dir) + get_moon_brightness(moon_dir) * get_moon_color(moon_dir); + clouds.rgb *= get_sun_brightness(sun_dir) * (sun_halo + get_sun_color(sun_dir)) + get_moon_brightness(moon_dir) * (moon_halo + get_moon_color(moon_dir)); return mix(sky_color + sun_light + moon_light, clouds.rgb, clouds.a); } diff --git a/assets/voxygen/shaders/skybox-frag.glsl b/assets/voxygen/shaders/skybox-frag.glsl index ac5624aea9..d1d47152bc 100644 --- a/assets/voxygen/shaders/skybox-frag.glsl +++ b/assets/voxygen/shaders/skybox-frag.glsl @@ -13,5 +13,5 @@ uniform u_locals { out vec4 tgt_color; void main() { - tgt_color = vec4(get_sky_color(normalize(f_pos), time_of_day.x, vec3(100000), true), 1.0); + tgt_color = vec4(get_sky_color(normalize(f_pos), time_of_day.x, vec3(-100000), true), 1.0); } diff --git a/assets/voxygen/shaders/skybox-vert.glsl b/assets/voxygen/shaders/skybox-vert.glsl index c1816d4127..41cac30839 100644 --- a/assets/voxygen/shaders/skybox-vert.glsl +++ b/assets/voxygen/shaders/skybox-vert.glsl @@ -18,6 +18,5 @@ void main() { gl_Position = proj_mat * view_mat * - vec4(v_pos + cam_pos.xyz, 1); - gl_Position.z = 0.0; + vec4(v_pos * 2000.0 + cam_pos.xyz, 1); } diff --git a/voxygen/src/scene/mod.rs b/voxygen/src/scene/mod.rs index bf3d6ef7b7..cce853846b 100644 --- a/voxygen/src/scene/mod.rs +++ b/voxygen/src/scene/mod.rs @@ -293,7 +293,7 @@ impl Scene { /// Render the scene using the provided `Renderer`. pub fn render(&mut self, renderer: &mut Renderer, client: &mut Client) { - // Render the skybox first (it appears over everything else so must be rendered first). + // Render the skybox. renderer.render_skybox(&self.skybox.model, &self.globals, &self.skybox.locals); // Render terrain and figures. From 61cfcf4c8b6a74dcd9d34bdfd0aef3f040bb0931 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Mon, 18 Nov 2019 08:00:17 +0000 Subject: [PATCH 06/27] Faster clouds, better water --- assets/voxygen/shaders/fluid-frag.glsl | 18 ++++++++------- assets/voxygen/shaders/include/sky.glsl | 29 ++++++++++++++---------- assets/voxygen/shaders/terrain-frag.glsl | 4 +++- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/assets/voxygen/shaders/fluid-frag.glsl b/assets/voxygen/shaders/fluid-frag.glsl index 5e537b8948..2f77d300f1 100644 --- a/assets/voxygen/shaders/fluid-frag.glsl +++ b/assets/voxygen/shaders/fluid-frag.glsl @@ -35,22 +35,22 @@ float wave_height(vec3 pos) { ); vec3 warp = ( - texture(t_waves, fract(pos.yx * 0.1 + tick.x * 0.02)).xyz * 0.3 + - texture(t_waves, fract(pos.yx * 0.1 - tick.x * 0.02)).xyz * 0.3 + + texture(t_noise, fract(pos.yx * 0.1 + tick.x * 0.02)).xyz * 0.3 + + texture(t_noise, fract(pos.yx * 0.1 - tick.x * 0.02)).xyz * 0.3 + vec3(0) ); float height = ( - (texture(t_waves, pos.xy * 0.03 + big_warp.xy + tick.x * 0.05).y - 0.5) * 1.0 + - (texture(t_waves, pos.yx * 0.03 + big_warp.yx - tick.x * 0.05).y - 0.5) * 1.0 + + (texture(t_noise, pos.xy * 0.03 + big_warp.xy + tick.x * 0.05).y - 0.5) * 1.0 + + (texture(t_noise, pos.yx * 0.03 + big_warp.yx - tick.x * 0.05).y - 0.5) * 1.0 + (texture(t_waves, pos.xy * 0.1 + warp.xy + tick.x * 0.1).x - 0.5) * 0.5 + (texture(t_waves, pos.yx * 0.1 + warp.yx - tick.x * 0.1).x - 0.5) * 0.5 + - (texture(t_waves, pos.yx * 0.3 + warp.xy * 0.5 + tick.x * 0.1).x - 0.5) * 0.2 + - (texture(t_waves, pos.yx * 0.3 + warp.yx * 0.5 - tick.x * 0.1).x - 0.5) * 0.2 + + (texture(t_noise, pos.yx * 0.3 + warp.xy * 0.5 + tick.x * 0.1).x - 0.5) * 0.2 + + (texture(t_noise, pos.yx * 0.3 + warp.yx * 0.5 - tick.x * 0.1).x - 0.5) * 0.2 + 0.0 ); - return pow(abs(height), 0.5) * sign(height) * 1.5; + return pow(abs(height), 0.5) * sign(height) * 5.5; } void main() { @@ -113,7 +113,9 @@ void main() { vec3 surf_color = illuminate(srgb_to_linear(f_col), light, diffuse_light, ambient_light); float fog_level = fog(f_pos.xyz, focus_pos.xyz, medium.x); - vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, true); + vec3 fog_color = vec3(0); + if (fog_level > 0.0) + fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, true); vec3 reflect_ray_dir = reflect(cam_to_frag, norm); // Hack to prevent the reflection ray dipping below the horizon and creating weird blue spots in the water diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index 335fc0dca7..9619ede16e 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -114,7 +114,7 @@ float is_star_at(vec3 dir) { return 0.0; } -const float CLOUD_AVG_HEIGHT = 1200.0; +const float CLOUD_AVG_HEIGHT = 900.0; const float CLOUD_HEIGHT_MIN = CLOUD_AVG_HEIGHT - 100.0; const float CLOUD_HEIGHT_MAX = CLOUD_AVG_HEIGHT + 100.0; const float CLOUD_THRESHOLD = 0.3; @@ -125,7 +125,11 @@ float spow(float x, float e) { return sign(x) * pow(abs(x), e); } -vec4 cloud_at(vec3 pos) { +float vsum(vec3 v) { + return v.x + v.y + v.z; +} + +vec2 cloud_at(vec3 pos) { float tick_offs = 0.0 + texture(t_noise, pos.xy * 0.0001).x + texture(t_noise, pos.xy * 0.000003).x * 10.0; @@ -140,13 +144,13 @@ vec4 cloud_at(vec3 pos) { float density = max((value - CLOUD_THRESHOLD) - abs(pos.z - CLOUD_AVG_HEIGHT) / 800.0, 0.0) * CLOUD_DENSITY; - vec3 color = vec3(1.0) * (0.5 - min(pow(max(CLOUD_AVG_HEIGHT - pos.z, 0.0), 0.5), 1.0) / 1.0); + float shade = 0.5 - min(pow(max(CLOUD_AVG_HEIGHT - pos.z, 0.0), 0.5), 1.0) / 1.0; - return vec4(color, density / (1.0 + distance(pos, cam_pos.xyz) / 10000)); + return vec2(shade, density / (1.0 + vsum(abs(pos - cam_pos.xyz)) / 10000)); } vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist) { - const float INCR = 0.04; + const float INCR = 0.05; float mind = (CLOUD_HEIGHT_MIN - cam_pos.z) / dir.z; float maxd = (CLOUD_HEIGHT_MAX - cam_pos.z) / dir.z; @@ -154,20 +158,20 @@ vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist) { float start = max(min(mind, maxd), 0.0); float delta = abs(mind - maxd); - float incr = INCR;//min(INCR + start / 100000.0, INCR * 2.0); + float incr = min(INCR + start / 100000.0, INCR * 2.0); - float fuzz = texture(t_noise, dir.xy * 1000000.0).x * 0.75 * incr * delta; + float fuzz = texture(t_noise, dir.xy * 1000000.0).x * 1.75 * incr * delta; if (delta <= 0.0) { return vec4(0); } - vec3 cloud_col = vec3(1); + float cloud_shade = 1.0; float passthrough = 1.0; for (float d = 0.0; d < 1.0; d += incr) { float dist = start + d * delta + fuzz; vec3 pos = cam_pos.xyz + dir * dist; - vec4 sample = cloud_at(pos); + vec2 sample = cloud_at(pos); float factor; if (dist < max_dist) { factor = 1.0; @@ -175,15 +179,16 @@ vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist) { factor = incr * (dist - max_dist) / delta; } - passthrough *= (1.0 - sample.a * incr * factor); - cloud_col = mix(cloud_col, sample.rgb, passthrough * sample.a * incr * factor); + float integral = sample.y * incr * factor; + passthrough *= 1.0 - integral; + cloud_shade = mix(cloud_shade, sample.x, passthrough * integral); if (factor < 1.0) { break; } } - return vec4(cloud_col, 1.0 - passthrough / (1.0 + delta * 0.0003)); + return vec4(vec3(cloud_shade), 1.0 - passthrough / (1.0 + delta * 0.0003)); } vec3 get_sky_color(vec3 dir, float time_of_day, vec3 f_pos, bool with_stars) { diff --git a/assets/voxygen/shaders/terrain-frag.glsl b/assets/voxygen/shaders/terrain-frag.glsl index 6067dbfee7..534f3afbc1 100644 --- a/assets/voxygen/shaders/terrain-frag.glsl +++ b/assets/voxygen/shaders/terrain-frag.glsl @@ -40,7 +40,9 @@ void main() { vec3 surf_color = illuminate(srgb_to_linear(f_col), light, diffuse_light, ambient_light); float fog_level = fog(f_pos.xyz, focus_pos.xyz, medium.x); - vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, true); + vec3 fog_color = vec3(0); + if (fog_level > 0.0) + fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, true); vec3 color = mix(surf_color, fog_color, fog_level); tgt_color = vec4(color, 1.0); From fee51a15b461c6665839671b7c739ad86bbbb7fe Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Mon, 18 Nov 2019 10:02:05 +0000 Subject: [PATCH 07/27] Faster cloud reflections --- assets/voxygen/shaders/figure-frag.glsl | 2 +- assets/voxygen/shaders/fluid-frag.glsl | 7 +++++-- assets/voxygen/shaders/include/sky.glsl | 24 ++++++++++++------------ assets/voxygen/shaders/skybox-frag.glsl | 2 +- assets/voxygen/shaders/sprite-frag.glsl | 2 +- assets/voxygen/shaders/terrain-frag.glsl | 2 +- 6 files changed, 21 insertions(+), 18 deletions(-) diff --git a/assets/voxygen/shaders/figure-frag.glsl b/assets/voxygen/shaders/figure-frag.glsl index 88d757817e..0069e98d64 100644 --- a/assets/voxygen/shaders/figure-frag.glsl +++ b/assets/voxygen/shaders/figure-frag.glsl @@ -39,7 +39,7 @@ void main() { vec3 surf_color = illuminate(srgb_to_linear(model_col.rgb * f_col), light, diffuse_light, ambient_light); float fog_level = fog(f_pos.xyz, focus_pos.xyz, medium.x); - vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, true); + vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, 0.5, true); vec3 color = mix(surf_color, fog_color, fog_level); tgt_color = vec4(color, 1.0); diff --git a/assets/voxygen/shaders/fluid-frag.glsl b/assets/voxygen/shaders/fluid-frag.glsl index 2f77d300f1..464f63fb75 100644 --- a/assets/voxygen/shaders/fluid-frag.glsl +++ b/assets/voxygen/shaders/fluid-frag.glsl @@ -47,6 +47,7 @@ float wave_height(vec3 pos) { (texture(t_waves, pos.yx * 0.1 + warp.yx - tick.x * 0.1).x - 0.5) * 0.5 + (texture(t_noise, pos.yx * 0.3 + warp.xy * 0.5 + tick.x * 0.1).x - 0.5) * 0.2 + (texture(t_noise, pos.yx * 0.3 + warp.yx * 0.5 - tick.x * 0.1).x - 0.5) * 0.2 + + (texture(t_noise, pos.yx * 1.0 + warp.yx * 0.0 - tick.x * 0.1).x - 0.5) * 0.05 + 0.0 ); @@ -115,13 +116,15 @@ void main() { float fog_level = fog(f_pos.xyz, focus_pos.xyz, medium.x); vec3 fog_color = vec3(0); if (fog_level > 0.0) - fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, true); + fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, 0.25, true); vec3 reflect_ray_dir = reflect(cam_to_frag, norm); // Hack to prevent the reflection ray dipping below the horizon and creating weird blue spots in the water reflect_ray_dir.z = max(reflect_ray_dir.z, 0.05); - vec3 reflect_color = get_sky_color(reflect_ray_dir, time_of_day.x, vec3(-100000), false) * f_light; + vec3 reflect_color = get_sky_color(reflect_ray_dir, time_of_day.x, vec3(-100000), 0.5, false) * f_light; + // Tint + reflect_color = mix(reflect_color, surf_color, 0.6); // 0 = 100% reflection, 1 = translucent water float passthrough = pow(dot(faceforward(f_norm, f_norm, cam_to_frag), -cam_to_frag), 0.5); diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index 9619ede16e..1749dd5f8b 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -114,7 +114,7 @@ float is_star_at(vec3 dir) { return 0.0; } -const float CLOUD_AVG_HEIGHT = 900.0; +const float CLOUD_AVG_HEIGHT = 1125.0; const float CLOUD_HEIGHT_MIN = CLOUD_AVG_HEIGHT - 100.0; const float CLOUD_HEIGHT_MAX = CLOUD_AVG_HEIGHT + 100.0; const float CLOUD_THRESHOLD = 0.3; @@ -131,25 +131,25 @@ float vsum(vec3 v) { vec2 cloud_at(vec3 pos) { float tick_offs = 0.0 - + texture(t_noise, pos.xy * 0.0001).x - + texture(t_noise, pos.xy * 0.000003).x * 10.0; + + texture(t_noise, pos.xy * 0.0001).x * 1.0 + + texture(t_noise, pos.xy * 0.000003).x * 5.0; float value = ( 0.0 - + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0003 - tick.x * 0.003 + tick_offs).x - + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0009 + tick.x * 0.01).x * 0.5 + + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0003 - tick.x * 0.002 + tick_offs).x + + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0009 + tick.x * 0.005).x * 0.5 + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0025 - tick.x * 0.02).x * 0.25 + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0075 - tick.x * 0.03).x * 0.07 ) / 2.85; float density = max((value - CLOUD_THRESHOLD) - abs(pos.z - CLOUD_AVG_HEIGHT) / 800.0, 0.0) * CLOUD_DENSITY; - float shade = 0.5 - min(pow(max(CLOUD_AVG_HEIGHT - pos.z, 0.0), 0.5), 1.0) / 1.0; + float shade = 1.0 - min(pow(max(CLOUD_AVG_HEIGHT - pos.z, 0.0), 0.5) * 0.5, 1.0) / 0.75; return vec2(shade, density / (1.0 + vsum(abs(pos - cam_pos.xyz)) / 10000)); } -vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist) { +vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist, float quality) { const float INCR = 0.05; float mind = (CLOUD_HEIGHT_MIN - cam_pos.z) / dir.z; @@ -158,9 +158,9 @@ vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist) { float start = max(min(mind, maxd), 0.0); float delta = abs(mind - maxd); - float incr = min(INCR + start / 100000.0, INCR * 2.0); + float incr = min(INCR + start / 100000.0, INCR * 2.0) / quality; - float fuzz = texture(t_noise, dir.xy * 1000000.0).x * 1.75 * incr * delta; + float fuzz = texture(t_noise, dir.xy * 100000.0).x * 1.75 * incr * delta; if (delta <= 0.0) { return vec4(0); @@ -191,7 +191,7 @@ vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist) { return vec4(vec3(cloud_shade), 1.0 - passthrough / (1.0 + delta * 0.0003)); } -vec3 get_sky_color(vec3 dir, float time_of_day, vec3 f_pos, bool with_stars) { +vec3 get_sky_color(vec3 dir, float time_of_day, vec3 f_pos, float quality, bool with_stars) { // Sky color vec3 sun_dir = get_sun_dir(time_of_day); vec3 moon_dir = get_moon_dir(time_of_day); @@ -267,8 +267,8 @@ vec3 get_sky_color(vec3 dir, float time_of_day, vec3 f_pos, bool with_stars) { vec3 moon_light = clamp(moon_halo + moon_surf, vec3(0), vec3(clamp(dir.z * 3.0, 0, 1))); // Clouds - vec4 clouds = get_cloud_color(dir, time_of_day, distance(cam_pos.xyz, f_pos)); - clouds.rgb *= get_sun_brightness(sun_dir) * (sun_halo + get_sun_color(sun_dir)) + get_moon_brightness(moon_dir) * (moon_halo + get_moon_color(moon_dir)); + vec4 clouds = get_cloud_color(dir, time_of_day, distance(cam_pos.xyz, f_pos), quality); + clouds.rgb *= get_sun_brightness(sun_dir) * (sun_halo * 2.5 + get_sun_color(sun_dir)) + get_moon_brightness(moon_dir) * (moon_halo * 2.5 + get_moon_color(moon_dir)); return mix(sky_color + sun_light + moon_light, clouds.rgb, clouds.a); } diff --git a/assets/voxygen/shaders/skybox-frag.glsl b/assets/voxygen/shaders/skybox-frag.glsl index d1d47152bc..9249f6c304 100644 --- a/assets/voxygen/shaders/skybox-frag.glsl +++ b/assets/voxygen/shaders/skybox-frag.glsl @@ -13,5 +13,5 @@ uniform u_locals { out vec4 tgt_color; void main() { - tgt_color = vec4(get_sky_color(normalize(f_pos), time_of_day.x, vec3(-100000), true), 1.0); + tgt_color = vec4(get_sky_color(normalize(f_pos), time_of_day.x, vec3(-100000), 1.0, true), 1.0); } diff --git a/assets/voxygen/shaders/sprite-frag.glsl b/assets/voxygen/shaders/sprite-frag.glsl index 50add1e0d7..776b8f1cbc 100644 --- a/assets/voxygen/shaders/sprite-frag.glsl +++ b/assets/voxygen/shaders/sprite-frag.glsl @@ -27,7 +27,7 @@ void main() { vec3 surf_color = illuminate(f_col, light, diffuse_light, ambient_light); float fog_level = fog(f_pos.xyz, focus_pos.xyz, medium.x); - vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, true); + vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, 0.5, true); vec3 color = mix(surf_color, fog_color, fog_level); tgt_color = vec4(color, 1.0 - clamp((distance(focus_pos.xy, f_pos.xy) - (RENDER_DIST - FADE_DIST)) / FADE_DIST, 0, 1)); diff --git a/assets/voxygen/shaders/terrain-frag.glsl b/assets/voxygen/shaders/terrain-frag.glsl index 534f3afbc1..73723cc3c4 100644 --- a/assets/voxygen/shaders/terrain-frag.glsl +++ b/assets/voxygen/shaders/terrain-frag.glsl @@ -42,7 +42,7 @@ void main() { float fog_level = fog(f_pos.xyz, focus_pos.xyz, medium.x); vec3 fog_color = vec3(0); if (fog_level > 0.0) - fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, true); + fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, 0.5, true); vec3 color = mix(surf_color, fog_color, fog_level); tgt_color = vec4(color, 1.0); From ecf6457c40ceabc76a3ead02814e4e2eaf17bff7 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Mon, 18 Nov 2019 10:36:48 +0000 Subject: [PATCH 08/27] Fixed hill colour blending --- assets/voxygen/shaders/antialias/fxaa.glsl | 4 ++-- assets/voxygen/shaders/include/sky.glsl | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/assets/voxygen/shaders/antialias/fxaa.glsl b/assets/voxygen/shaders/antialias/fxaa.glsl index 700dfa4e90..90fdff7c2b 100644 --- a/assets/voxygen/shaders/antialias/fxaa.glsl +++ b/assets/voxygen/shaders/antialias/fxaa.glsl @@ -1,6 +1,6 @@ uniform sampler2D src_color; -const float FXAA_SCALE = 1.5; +const float FXAA_SCALE = 1.25; /** Basic FXAA implementation based on the code on geeks3d.com with the @@ -134,4 +134,4 @@ vec4 aa_apply(sampler2D tex, vec2 fragCoord, vec2 resolution) { //compute FXAA return fxaa(tex, scaled_fc, scaled_res, v_rgbNW, v_rgbNE, v_rgbSW, v_rgbSE, v_rgbM); -} \ No newline at end of file +} diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index 1749dd5f8b..9b18b53f70 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -160,7 +160,7 @@ vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist, float quality) float incr = min(INCR + start / 100000.0, INCR * 2.0) / quality; - float fuzz = texture(t_noise, dir.xy * 100000.0).x * 1.75 * incr * delta; + float fuzz = texture(t_noise, dir.xz * 100000.0).x * 2.0 * incr * delta; if (delta <= 0.0) { return vec4(0); @@ -188,7 +188,7 @@ vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist, float quality) } } - return vec4(vec3(cloud_shade), 1.0 - passthrough / (1.0 + delta * 0.0003)); + return vec4(vec3(cloud_shade), 1.0 - passthrough / (1.0 + min(delta, max_dist) * 0.0003)); } vec3 get_sky_color(vec3 dir, float time_of_day, vec3 f_pos, float quality, bool with_stars) { @@ -267,8 +267,8 @@ vec3 get_sky_color(vec3 dir, float time_of_day, vec3 f_pos, float quality, bool vec3 moon_light = clamp(moon_halo + moon_surf, vec3(0), vec3(clamp(dir.z * 3.0, 0, 1))); // Clouds - vec4 clouds = get_cloud_color(dir, time_of_day, distance(cam_pos.xyz, f_pos), quality); - clouds.rgb *= get_sun_brightness(sun_dir) * (sun_halo * 2.5 + get_sun_color(sun_dir)) + get_moon_brightness(moon_dir) * (moon_halo * 2.5 + get_moon_color(moon_dir)); + vec4 clouds = get_cloud_color(dir, time_of_day, vsum(abs(cam_pos.xyz - f_pos)), quality); + clouds.rgb *= get_sun_brightness(sun_dir) * (sun_halo * 2.5 + get_sun_color(sun_dir)) + get_moon_brightness(moon_dir) * (moon_halo * 20.5 + get_moon_color(moon_dir)); return mix(sky_color + sun_light + moon_light, clouds.rgb, clouds.a); } From c7ffc3e2adb13a2f40b99a1cb9bbfbe510679332 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Mon, 18 Nov 2019 10:47:52 +0000 Subject: [PATCH 09/27] Prevented cloud overlap on terrain --- assets/voxygen/shaders/include/sky.glsl | 64 +++++++++++-------------- 1 file changed, 29 insertions(+), 35 deletions(-) diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index 9b18b53f70..a2a8288d02 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -173,19 +173,13 @@ vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist, float quality) vec3 pos = cam_pos.xyz + dir * dist; vec2 sample = cloud_at(pos); float factor; - if (dist < max_dist) { - factor = 1.0; - } else { - factor = incr * (dist - max_dist) / delta; - } - - float integral = sample.y * incr * factor; - passthrough *= 1.0 - integral; - cloud_shade = mix(cloud_shade, sample.x, passthrough * integral); - - if (factor < 1.0) { + if (dist > max_dist) { break; } + + float integral = sample.y * incr; + passthrough *= 1.0 - integral; + cloud_shade = mix(cloud_shade, sample.x, passthrough * integral); } return vec4(vec3(cloud_shade), 1.0 - passthrough / (1.0 + min(delta, max_dist) * 0.0003)); @@ -202,12 +196,34 @@ vec3 get_sky_color(vec3 dir, float time_of_day, vec3 f_pos, float quality, bool star = is_star_at(dir); } + // Sun + const vec3 SUN_SURF_COLOR = vec3(1.5, 0.9, 0.35) * 200.0; + + vec3 sun_halo_color = mix( + SUN_HALO_DUSK, + SUN_HALO_DAY, + max(-sun_dir.z, 0) + ); + + vec3 sun_halo = pow(max(dot(dir, -sun_dir) + 0.1, 0.0), 8.0) * sun_halo_color; + vec3 sun_surf = pow(max(dot(dir, -sun_dir) - 0.001, 0.0), 3000.0) * SUN_SURF_COLOR; + vec3 sun_light = (sun_halo + sun_surf) * clamp(dir.z * 10.0, 0, 1); + + // Moon + const vec3 MOON_SURF_COLOR = vec3(0.7, 1.0, 1.5) * 500.0; + + vec3 moon_halo_color = vec3(0.015, 0.015, 0.03); + + vec3 moon_halo = pow(max(dot(dir, -moon_dir) + 0.1, 0.0), 8.0) * moon_halo_color; + vec3 moon_surf = pow(max(dot(dir, -moon_dir) - 0.001, 0.0), 3000.0) * MOON_SURF_COLOR; + vec3 moon_light = clamp(moon_halo + moon_surf, vec3(0), vec3(clamp(dir.z * 3.0, 0, 1))); + // Replaced all clamp(sun_dir, 0, 1) with max(sun_dir, 0) because sun_dir is calculated from sin and cos, which are never > 1 vec3 sky_top = mix( mix( - SKY_DUSK_TOP + star, - SKY_NIGHT_TOP + star, + SKY_DUSK_TOP + star / (1.0 + moon_surf * 100.0), + SKY_NIGHT_TOP + star / (1.0 + moon_surf * 100.0), max(pow(sun_dir.z, 0.2), 0) ), SKY_DAY_TOP, @@ -244,28 +260,6 @@ vec3 get_sky_color(vec3 dir, float time_of_day, vec3 f_pos, float quality, bool max(dir.z, 0) ); - // Sun - const vec3 SUN_SURF_COLOR = vec3(1.5, 0.9, 0.35) * 200.0; - - vec3 sun_halo_color = mix( - SUN_HALO_DUSK, - SUN_HALO_DAY, - max(-sun_dir.z, 0) - ); - - vec3 sun_halo = pow(max(dot(dir, -sun_dir) + 0.1, 0.0), 8.0) * sun_halo_color; - vec3 sun_surf = pow(max(dot(dir, -sun_dir) - 0.001, 0.0), 3000.0) * SUN_SURF_COLOR; - vec3 sun_light = (sun_halo + sun_surf) * clamp(dir.z * 10.0, 0, 1); - - // Moon - const vec3 MOON_SURF_COLOR = vec3(0.7, 1.0, 1.5) * 500.0; - - vec3 moon_halo_color = vec3(0.015, 0.015, 0.03); - - vec3 moon_halo = pow(max(dot(dir, -moon_dir) + 0.1, 0.0), 8.0) * moon_halo_color; - vec3 moon_surf = pow(max(dot(dir, -moon_dir) - 0.001, 0.0), 3000.0) * MOON_SURF_COLOR; - vec3 moon_light = clamp(moon_halo + moon_surf, vec3(0), vec3(clamp(dir.z * 3.0, 0, 1))); - // Clouds vec4 clouds = get_cloud_color(dir, time_of_day, vsum(abs(cam_pos.xyz - f_pos)), quality); clouds.rgb *= get_sun_brightness(sun_dir) * (sun_halo * 2.5 + get_sun_color(sun_dir)) + get_moon_brightness(moon_dir) * (moon_halo * 20.5 + get_moon_color(moon_dir)); From d9e3172727bc987588835689e71831c8f0490b6e Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Mon, 18 Nov 2019 11:00:59 +0000 Subject: [PATCH 10/27] Prevent sun/moon terrain overlap --- assets/voxygen/shaders/include/sky.glsl | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index a2a8288d02..f5fcce7bb0 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -260,11 +260,18 @@ vec3 get_sky_color(vec3 dir, float time_of_day, vec3 f_pos, float quality, bool max(dir.z, 0) ); + // Approximate distance to fragment + float f_dist = vsum(abs(cam_pos.xyz - f_pos)); + // Clouds - vec4 clouds = get_cloud_color(dir, time_of_day, vsum(abs(cam_pos.xyz - f_pos)), quality); + vec4 clouds = get_cloud_color(dir, time_of_day, f_dist, quality); clouds.rgb *= get_sun_brightness(sun_dir) * (sun_halo * 2.5 + get_sun_color(sun_dir)) + get_moon_brightness(moon_dir) * (moon_halo * 20.5 + get_moon_color(moon_dir)); - return mix(sky_color + sun_light + moon_light, clouds.rgb, clouds.a); + if (f_dist > 1000.0) { + sky_color += sun_light + moon_light; + } + + return mix(sky_color, clouds.rgb, clouds.a); } float fog(vec3 f_pos, vec3 focus_pos, uint medium) { From c76bb6c8a71c300ff2418361b58f008e3d6038bb Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Mon, 18 Nov 2019 11:08:43 +0000 Subject: [PATCH 11/27] Better water transparency --- assets/voxygen/shaders/fluid-frag.glsl | 2 +- assets/voxygen/shaders/include/sky.glsl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/voxygen/shaders/fluid-frag.glsl b/assets/voxygen/shaders/fluid-frag.glsl index 464f63fb75..6f041a34c5 100644 --- a/assets/voxygen/shaders/fluid-frag.glsl +++ b/assets/voxygen/shaders/fluid-frag.glsl @@ -128,7 +128,7 @@ void main() { // 0 = 100% reflection, 1 = translucent water float passthrough = pow(dot(faceforward(f_norm, f_norm, cam_to_frag), -cam_to_frag), 0.5); - vec4 color = mix(vec4(reflect_color * 2.0, 1.0), vec4(surf_color, 4.0 / (1.0 + diffuse_light * 2.0)), passthrough); + vec4 color = mix(vec4(reflect_color * 2.0, 1.0), vec4(surf_color, 4.0 / (4.0 + diffuse_light * 1.0)), passthrough); tgt_color = mix(color, vec4(fog_color, 0.0), fog_level); } diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index f5fcce7bb0..d6108877c9 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -267,7 +267,7 @@ vec3 get_sky_color(vec3 dir, float time_of_day, vec3 f_pos, float quality, bool vec4 clouds = get_cloud_color(dir, time_of_day, f_dist, quality); clouds.rgb *= get_sun_brightness(sun_dir) * (sun_halo * 2.5 + get_sun_color(sun_dir)) + get_moon_brightness(moon_dir) * (moon_halo * 20.5 + get_moon_color(moon_dir)); - if (f_dist > 1000.0) { + if (f_dist > 5000.0) { sky_color += sun_light + moon_light; } From f1e5560bdde32d0da7a41934911c18946ab16c42 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Mon, 18 Nov 2019 12:02:10 +0000 Subject: [PATCH 12/27] Made clouds render over terrain --- assets/voxygen/shaders/figure-frag.glsl | 5 +++-- assets/voxygen/shaders/fluid-frag.glsl | 12 ++++++------ assets/voxygen/shaders/include/sky.glsl | 6 +++--- assets/voxygen/shaders/skybox-frag.glsl | 3 ++- assets/voxygen/shaders/sprite-frag.glsl | 5 +++-- assets/voxygen/shaders/terrain-frag.glsl | 9 ++++----- 6 files changed, 21 insertions(+), 19 deletions(-) diff --git a/assets/voxygen/shaders/figure-frag.glsl b/assets/voxygen/shaders/figure-frag.glsl index 0069e98d64..ebae274a2e 100644 --- a/assets/voxygen/shaders/figure-frag.glsl +++ b/assets/voxygen/shaders/figure-frag.glsl @@ -39,8 +39,9 @@ void main() { vec3 surf_color = illuminate(srgb_to_linear(model_col.rgb * f_col), light, diffuse_light, ambient_light); float fog_level = fog(f_pos.xyz, focus_pos.xyz, medium.x); - vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, 0.5, true); - vec3 color = mix(surf_color, fog_color, fog_level); + vec4 clouds; + vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, 0.5, true, clouds); + vec3 color = mix(mix(surf_color, fog_color, fog_level), clouds.rgb, clouds.a); tgt_color = vec4(color, 1.0); } diff --git a/assets/voxygen/shaders/fluid-frag.glsl b/assets/voxygen/shaders/fluid-frag.glsl index 6f041a34c5..443811be68 100644 --- a/assets/voxygen/shaders/fluid-frag.glsl +++ b/assets/voxygen/shaders/fluid-frag.glsl @@ -114,21 +114,21 @@ void main() { vec3 surf_color = illuminate(srgb_to_linear(f_col), light, diffuse_light, ambient_light); float fog_level = fog(f_pos.xyz, focus_pos.xyz, medium.x); - vec3 fog_color = vec3(0); - if (fog_level > 0.0) - fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, 0.25, true); + vec4 clouds; + vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, 0.25, true, clouds); vec3 reflect_ray_dir = reflect(cam_to_frag, norm); // Hack to prevent the reflection ray dipping below the horizon and creating weird blue spots in the water reflect_ray_dir.z = max(reflect_ray_dir.z, 0.05); - vec3 reflect_color = get_sky_color(reflect_ray_dir, time_of_day.x, vec3(-100000), 0.5, false) * f_light; + vec4 _clouds; + vec3 reflect_color = get_sky_color(reflect_ray_dir, time_of_day.x, vec3(-100000), 0.5, false, _clouds) * f_light; // Tint reflect_color = mix(reflect_color, surf_color, 0.6); // 0 = 100% reflection, 1 = translucent water float passthrough = pow(dot(faceforward(f_norm, f_norm, cam_to_frag), -cam_to_frag), 0.5); - vec4 color = mix(vec4(reflect_color * 2.0, 1.0), vec4(surf_color, 4.0 / (4.0 + diffuse_light * 1.0)), passthrough); + vec4 color = mix(vec4(reflect_color * 2.0, 1.0), vec4(surf_color, 1.0 / (1.0 + diffuse_light * 0.25)), passthrough); - tgt_color = mix(color, vec4(fog_color, 0.0), fog_level); + tgt_color = mix(mix(color, vec4(fog_color, 0.0), fog_level), vec4(clouds.rgb, 0.0), clouds.a); } diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index d6108877c9..5a3f857924 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -185,7 +185,7 @@ vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist, float quality) return vec4(vec3(cloud_shade), 1.0 - passthrough / (1.0 + min(delta, max_dist) * 0.0003)); } -vec3 get_sky_color(vec3 dir, float time_of_day, vec3 f_pos, float quality, bool with_stars) { +vec3 get_sky_color(vec3 dir, float time_of_day, vec3 f_pos, float quality, bool with_stars, out vec4 clouds) { // Sky color vec3 sun_dir = get_sun_dir(time_of_day); vec3 moon_dir = get_moon_dir(time_of_day); @@ -261,10 +261,10 @@ vec3 get_sky_color(vec3 dir, float time_of_day, vec3 f_pos, float quality, bool ); // Approximate distance to fragment - float f_dist = vsum(abs(cam_pos.xyz - f_pos)); + float f_dist = distance(cam_pos.xyz, f_pos); // Clouds - vec4 clouds = get_cloud_color(dir, time_of_day, f_dist, quality); + clouds = get_cloud_color(dir, time_of_day, f_dist, quality); clouds.rgb *= get_sun_brightness(sun_dir) * (sun_halo * 2.5 + get_sun_color(sun_dir)) + get_moon_brightness(moon_dir) * (moon_halo * 20.5 + get_moon_color(moon_dir)); if (f_dist > 5000.0) { diff --git a/assets/voxygen/shaders/skybox-frag.glsl b/assets/voxygen/shaders/skybox-frag.glsl index 9249f6c304..b1ead1d596 100644 --- a/assets/voxygen/shaders/skybox-frag.glsl +++ b/assets/voxygen/shaders/skybox-frag.glsl @@ -13,5 +13,6 @@ uniform u_locals { out vec4 tgt_color; void main() { - tgt_color = vec4(get_sky_color(normalize(f_pos), time_of_day.x, vec3(-100000), 1.0, true), 1.0); + vec4 _clouds; + tgt_color = vec4(get_sky_color(normalize(f_pos), time_of_day.x, vec3(-100000), 1.0, true, _clouds), 1.0); } diff --git a/assets/voxygen/shaders/sprite-frag.glsl b/assets/voxygen/shaders/sprite-frag.glsl index 776b8f1cbc..6a2e9e693f 100644 --- a/assets/voxygen/shaders/sprite-frag.glsl +++ b/assets/voxygen/shaders/sprite-frag.glsl @@ -27,8 +27,9 @@ void main() { vec3 surf_color = illuminate(f_col, light, diffuse_light, ambient_light); float fog_level = fog(f_pos.xyz, focus_pos.xyz, medium.x); - vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, 0.5, true); - vec3 color = mix(surf_color, fog_color, fog_level); + vec4 clouds; + vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, 0.5, true, clouds); + vec3 color = mix(mix(surf_color, fog_color, fog_level), clouds.rgb, clouds.a); tgt_color = vec4(color, 1.0 - clamp((distance(focus_pos.xy, f_pos.xy) - (RENDER_DIST - FADE_DIST)) / FADE_DIST, 0, 1)); } diff --git a/assets/voxygen/shaders/terrain-frag.glsl b/assets/voxygen/shaders/terrain-frag.glsl index 73723cc3c4..1bbc799614 100644 --- a/assets/voxygen/shaders/terrain-frag.glsl +++ b/assets/voxygen/shaders/terrain-frag.glsl @@ -20,7 +20,7 @@ out vec4 tgt_color; void main() { // First 3 normals are negative, next 3 are positive - vec3 normals[6] = vec3[]( vec3(-1,0,0), vec3(0,-1,0), vec3(0,0,-1), vec3(1,0,0), vec3(0,1,0), vec3(0,0,1) ); + vec3 normals[6] = vec3[](vec3(-1,0,0), vec3(0,-1,0), vec3(0,0,-1), vec3(1,0,0), vec3(0,1,0), vec3(0,0,1)); // TODO: last 3 bits in v_pos_norm should be a number between 0 and 5, rather than 0-2 and a direction. uint norm_axis = (f_pos_norm >> 30) & 0x3u; @@ -40,10 +40,9 @@ void main() { vec3 surf_color = illuminate(srgb_to_linear(f_col), light, diffuse_light, ambient_light); float fog_level = fog(f_pos.xyz, focus_pos.xyz, medium.x); - vec3 fog_color = vec3(0); - if (fog_level > 0.0) - fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, 0.5, true); - vec3 color = mix(surf_color, fog_color, fog_level); + vec4 clouds; + vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, 0.5, true, clouds); + vec3 color = mix(mix(surf_color, fog_color, fog_level), clouds.rgb, clouds.a); tgt_color = vec4(color, 1.0); } From 1db3aad82ca0cde497641d890aeb37b452082450 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Mon, 18 Nov 2019 12:28:19 +0000 Subject: [PATCH 13/27] Better precision cloud sampling and moon halo highlight --- assets/voxygen/shaders/include/sky.glsl | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index 5a3f857924..bc79758ccd 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -14,7 +14,7 @@ const vec3 SKY_DUSK_TOP = vec3(0.06, 0.1, 0.20); const vec3 SKY_DUSK_MID = vec3(0.35, 0.1, 0.15); const vec3 SKY_DUSK_BOT = vec3(0.0, 0.1, 0.13); const vec3 DUSK_LIGHT = vec3(3.0, 1.5, 0.3); -const vec3 SUN_HALO_DUSK = vec3(0.6, 0.1, 0.0); +const vec3 SUN_HALO_DUSK = vec3(1.2, 0.15, 0.0); const vec3 SKY_NIGHT_TOP = vec3(0.001, 0.001, 0.0025); const vec3 SKY_NIGHT_MID = vec3(0.001, 0.005, 0.02); @@ -115,8 +115,8 @@ float is_star_at(vec3 dir) { } const float CLOUD_AVG_HEIGHT = 1125.0; -const float CLOUD_HEIGHT_MIN = CLOUD_AVG_HEIGHT - 100.0; -const float CLOUD_HEIGHT_MAX = CLOUD_AVG_HEIGHT + 100.0; +const float CLOUD_HEIGHT_MIN = CLOUD_AVG_HEIGHT - 60.0; +const float CLOUD_HEIGHT_MAX = CLOUD_AVG_HEIGHT + 60.0; const float CLOUD_THRESHOLD = 0.3; const float CLOUD_SCALE = 1.0; const float CLOUD_DENSITY = 100.0; @@ -144,7 +144,7 @@ vec2 cloud_at(vec3 pos) { float density = max((value - CLOUD_THRESHOLD) - abs(pos.z - CLOUD_AVG_HEIGHT) / 800.0, 0.0) * CLOUD_DENSITY; - float shade = 1.0 - min(pow(max(CLOUD_AVG_HEIGHT - pos.z, 0.0), 0.5) * 0.5, 1.0) / 0.75; + float shade = 1.0 - min(pow(max(CLOUD_AVG_HEIGHT - pos.z, 0.0), 0.5) * 0.5, 1.0) / 0.8; return vec2(shade, density / (1.0 + vsum(abs(pos - cam_pos.xyz)) / 10000)); } @@ -211,10 +211,9 @@ vec3 get_sky_color(vec3 dir, float time_of_day, vec3 f_pos, float quality, bool // Moon const vec3 MOON_SURF_COLOR = vec3(0.7, 1.0, 1.5) * 500.0; + const vec3 MOON_HALO_COLOR = vec3(0.015, 0.015, 0.05); - vec3 moon_halo_color = vec3(0.015, 0.015, 0.03); - - vec3 moon_halo = pow(max(dot(dir, -moon_dir) + 0.1, 0.0), 8.0) * moon_halo_color; + vec3 moon_halo = pow(max(dot(dir, -moon_dir) + 0.1, 0.0), 8.0) * MOON_HALO_COLOR; vec3 moon_surf = pow(max(dot(dir, -moon_dir) - 0.001, 0.0), 3000.0) * MOON_SURF_COLOR; vec3 moon_light = clamp(moon_halo + moon_surf, vec3(0), vec3(clamp(dir.z * 3.0, 0, 1))); @@ -265,7 +264,7 @@ vec3 get_sky_color(vec3 dir, float time_of_day, vec3 f_pos, float quality, bool // Clouds clouds = get_cloud_color(dir, time_of_day, f_dist, quality); - clouds.rgb *= get_sun_brightness(sun_dir) * (sun_halo * 2.5 + get_sun_color(sun_dir)) + get_moon_brightness(moon_dir) * (moon_halo * 20.5 + get_moon_color(moon_dir)); + clouds.rgb *= get_sun_brightness(sun_dir) * (sun_halo * 2.5 + get_sun_color(sun_dir)) + get_moon_brightness(moon_dir) * (moon_halo * 80.0 + get_moon_color(moon_dir)); if (f_dist > 5000.0) { sky_color += sun_light + moon_light; From b69dc3d93ed7a4c8c98a87a3fc17ca31270964f3 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Mon, 18 Nov 2019 16:00:11 +0000 Subject: [PATCH 14/27] Improved cloud precision from internal perspective --- assets/voxygen/shaders/include/sky.glsl | 37 ++++++++++++++---------- assets/voxygen/shaders/terrain-frag.glsl | 2 +- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index bc79758ccd..f1796dfecc 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -114,12 +114,12 @@ float is_star_at(vec3 dir) { return 0.0; } -const float CLOUD_AVG_HEIGHT = 1125.0; -const float CLOUD_HEIGHT_MIN = CLOUD_AVG_HEIGHT - 60.0; -const float CLOUD_HEIGHT_MAX = CLOUD_AVG_HEIGHT + 60.0; +const float CLOUD_AVG_HEIGHT = 1025.0; +const float CLOUD_HEIGHT_MIN = CLOUD_AVG_HEIGHT - 50.0; +const float CLOUD_HEIGHT_MAX = CLOUD_AVG_HEIGHT + 50.0; const float CLOUD_THRESHOLD = 0.3; const float CLOUD_SCALE = 1.0; -const float CLOUD_DENSITY = 100.0; +const float CLOUD_DENSITY = 150.0; float spow(float x, float e) { return sign(x) * pow(abs(x), e); @@ -140,13 +140,14 @@ vec2 cloud_at(vec3 pos) { + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0009 + tick.x * 0.005).x * 0.5 + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0025 - tick.x * 0.02).x * 0.25 + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0075 - tick.x * 0.03).x * 0.07 + + texture(t_noise, pos.xy / CLOUD_SCALE * 0.02 - tick.x * 0.03).x * 0.03 ) / 2.85; - float density = max((value - CLOUD_THRESHOLD) - abs(pos.z - CLOUD_AVG_HEIGHT) / 800.0, 0.0) * CLOUD_DENSITY; + float density = min(max((value - CLOUD_THRESHOLD) - abs(pos.z - CLOUD_AVG_HEIGHT) / 500.0, 0.0) * CLOUD_DENSITY, 3.0); - float shade = 1.0 - min(pow(max(CLOUD_AVG_HEIGHT - pos.z, 0.0), 0.5) * 0.5, 1.0) / 0.8; + float shade = 1.0 - min(pow(max(CLOUD_AVG_HEIGHT - pos.z, 0.0), 0.15) * 0.5, 1.0) / 0.6; - return vec2(shade, density / (1.0 + vsum(abs(pos - cam_pos.xyz)) / 10000)); + return vec2(shade, density / (1.0 + vsum(abs(pos - cam_pos.xyz)) / 2500)); } vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist, float quality) { @@ -156,11 +157,11 @@ vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist, float quality) float maxd = (CLOUD_HEIGHT_MAX - cam_pos.z) / dir.z; float start = max(min(mind, maxd), 0.0); - float delta = abs(mind - maxd); + float delta = min(abs(mind - maxd), 5000.0); float incr = min(INCR + start / 100000.0, INCR * 2.0) / quality; - float fuzz = texture(t_noise, dir.xz * 100000.0).x * 2.0 * incr * delta; + float fuzz = (texture(t_noise, dir.xz * 100000.0).x - 0.5) * 2.0 * incr * delta; if (delta <= 0.0) { return vec4(0); @@ -169,17 +170,23 @@ vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist, float quality) float cloud_shade = 1.0; float passthrough = 1.0; for (float d = 0.0; d < 1.0; d += incr) { - float dist = start + d * delta + fuzz; - vec3 pos = cam_pos.xyz + dir * dist; + float dist = start + d * delta + fuzz * pow(d, 0.01); + + vec3 pos = cam_pos.xyz + dir * min(dist, max_dist); vec2 sample = cloud_at(pos); - float factor; + + float factor = 1.0; if (dist > max_dist) { - break; + factor -= (dist - max_dist) / (incr * delta); } - float integral = sample.y * incr; - passthrough *= 1.0 - integral; + float integral = sample.y * incr * factor; + passthrough *= clamp(1.0 - integral, 0.0, 1.0); cloud_shade = mix(cloud_shade, sample.x, passthrough * integral); + + if (factor < 1.0) { + break; + } } return vec4(vec3(cloud_shade), 1.0 - passthrough / (1.0 + min(delta, max_dist) * 0.0003)); diff --git a/assets/voxygen/shaders/terrain-frag.glsl b/assets/voxygen/shaders/terrain-frag.glsl index 1bbc799614..e579f12522 100644 --- a/assets/voxygen/shaders/terrain-frag.glsl +++ b/assets/voxygen/shaders/terrain-frag.glsl @@ -42,7 +42,7 @@ void main() { float fog_level = fog(f_pos.xyz, focus_pos.xyz, medium.x); vec4 clouds; vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, 0.5, true, clouds); - vec3 color = mix(mix(surf_color, fog_color, fog_level), clouds.rgb, clouds.a); + vec3 color = mix(mix(surf_color, fog_color, 0.0), clouds.rgb, clouds.a); tgt_color = vec4(color, 1.0); } From 0fc2417b1b83aa7ce80fbd92cdaa9ef56aae2a0d Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Mon, 18 Nov 2019 17:18:51 +0000 Subject: [PATCH 15/27] Better passthrough calculation --- assets/voxygen/shaders/include/sky.glsl | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index f1796dfecc..6852f83445 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -6,19 +6,19 @@ const float PI = 3.141592; const vec3 SKY_DAY_TOP = vec3(0.1, 0.2, 0.9); const vec3 SKY_DAY_MID = vec3(0.02, 0.08, 0.8); -const vec3 SKY_DAY_BOT = vec3(0.02, 0.1, 0.3); +const vec3 SKY_DAY_BOT = vec3(0.1, 0.2, 0.3); const vec3 DAY_LIGHT = vec3(1.2, 1.0, 1.0); const vec3 SUN_HALO_DAY = vec3(0.35, 0.35, 0.0); const vec3 SKY_DUSK_TOP = vec3(0.06, 0.1, 0.20); const vec3 SKY_DUSK_MID = vec3(0.35, 0.1, 0.15); -const vec3 SKY_DUSK_BOT = vec3(0.0, 0.1, 0.13); +const vec3 SKY_DUSK_BOT = vec3(0.0, 0.3, 0.13); const vec3 DUSK_LIGHT = vec3(3.0, 1.5, 0.3); const vec3 SUN_HALO_DUSK = vec3(1.2, 0.15, 0.0); const vec3 SKY_NIGHT_TOP = vec3(0.001, 0.001, 0.0025); const vec3 SKY_NIGHT_MID = vec3(0.001, 0.005, 0.02); -const vec3 SKY_NIGHT_BOT = vec3(0.002, 0.002, 0.005); +const vec3 SKY_NIGHT_BOT = vec3(0.002, 0.004, 0.004); const vec3 NIGHT_LIGHT = vec3(0.002, 0.01, 0.03); vec3 get_sun_dir(float time_of_day) { @@ -58,7 +58,7 @@ vec3 get_sun_color(vec3 sun_dir) { } vec3 get_moon_color(vec3 moon_dir) { - return vec3(0.15, 0.15, 1.5); + return vec3(0.05, 0.05, 0.6); } void get_sun_diffuse(vec3 norm, float time_of_day, out vec3 light, out vec3 diffuse_light, out vec3 ambient_light, float diffusion) { @@ -143,11 +143,13 @@ vec2 cloud_at(vec3 pos) { + texture(t_noise, pos.xy / CLOUD_SCALE * 0.02 - tick.x * 0.03).x * 0.03 ) / 2.85; - float density = min(max((value - CLOUD_THRESHOLD) - abs(pos.z - CLOUD_AVG_HEIGHT) / 500.0, 0.0) * CLOUD_DENSITY, 3.0); + float density = max((value - CLOUD_THRESHOLD) - abs(pos.z - CLOUD_AVG_HEIGHT) / 500.0, 0.0) * CLOUD_DENSITY; + + //density = min(density, 3.0); float shade = 1.0 - min(pow(max(CLOUD_AVG_HEIGHT - pos.z, 0.0), 0.15) * 0.5, 1.0) / 0.6; - return vec2(shade, density / (1.0 + vsum(abs(pos - cam_pos.xyz)) / 2500)); + return vec2(shade, density / (1.0 + vsum(abs(pos - cam_pos.xyz)) / 3000)); } vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist, float quality) { @@ -181,7 +183,7 @@ vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist, float quality) } float integral = sample.y * incr * factor; - passthrough *= clamp(1.0 - integral, 0.0, 1.0); + passthrough *= 1.0 - integral; cloud_shade = mix(cloud_shade, sample.x, passthrough * integral); if (factor < 1.0) { @@ -189,7 +191,11 @@ vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist, float quality) } } - return vec4(vec3(cloud_shade), 1.0 - passthrough / (1.0 + min(delta, max_dist) * 0.0003)); + float total_density = 1.0 - passthrough / (1.0 + min(delta, max_dist) * 0.0003); + + total_density *= min(max_dist * 0.01, 1.0); // Hack + + return vec4(vec3(cloud_shade), total_density); } vec3 get_sky_color(vec3 dir, float time_of_day, vec3 f_pos, float quality, bool with_stars, out vec4 clouds) { From 0ccb1ecef96666c4195ae0b6a59443a47ae495f6 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Mon, 18 Nov 2019 17:44:11 +0000 Subject: [PATCH 16/27] Cleanup and speedup --- assets/voxygen/shaders/include/sky.glsl | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index 6852f83445..054508c915 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -139,14 +139,11 @@ vec2 cloud_at(vec3 pos) { + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0003 - tick.x * 0.002 + tick_offs).x + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0009 + tick.x * 0.005).x * 0.5 + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0025 - tick.x * 0.02).x * 0.25 - + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0075 - tick.x * 0.03).x * 0.07 + texture(t_noise, pos.xy / CLOUD_SCALE * 0.02 - tick.x * 0.03).x * 0.03 ) / 2.85; float density = max((value - CLOUD_THRESHOLD) - abs(pos.z - CLOUD_AVG_HEIGHT) / 500.0, 0.0) * CLOUD_DENSITY; - //density = min(density, 3.0); - float shade = 1.0 - min(pow(max(CLOUD_AVG_HEIGHT - pos.z, 0.0), 0.15) * 0.5, 1.0) / 0.6; return vec2(shade, density / (1.0 + vsum(abs(pos - cam_pos.xyz)) / 3000)); @@ -163,7 +160,7 @@ vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist, float quality) float incr = min(INCR + start / 100000.0, INCR * 2.0) / quality; - float fuzz = (texture(t_noise, dir.xz * 100000.0).x - 0.5) * 2.0 * incr * delta; + float fuzz = sin(texture(t_noise, dir.xz * 100000.0).x * 100.0) * 0.5 * incr * delta; if (delta <= 0.0) { return vec4(0); @@ -172,7 +169,7 @@ vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist, float quality) float cloud_shade = 1.0; float passthrough = 1.0; for (float d = 0.0; d < 1.0; d += incr) { - float dist = start + d * delta + fuzz * pow(d, 0.01); + float dist = start + d * delta + fuzz * pow(d, 0.2); vec3 pos = cam_pos.xyz + dir * min(dist, max_dist); vec2 sample = cloud_at(pos); @@ -193,7 +190,7 @@ vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist, float quality) float total_density = 1.0 - passthrough / (1.0 + min(delta, max_dist) * 0.0003); - total_density *= min(max_dist * 0.01, 1.0); // Hack + total_density *= min(max_dist * 0.02, 1.0); // Hack return vec4(vec3(cloud_shade), total_density); } From 93320ce25a73dca4b430344b24c06295d3d54346 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Mon, 18 Nov 2019 17:50:19 +0000 Subject: [PATCH 17/27] Fixed passthrough reduction curve --- assets/voxygen/shaders/include/sky.glsl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index 054508c915..d8ff3657b1 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -12,7 +12,7 @@ const vec3 SUN_HALO_DAY = vec3(0.35, 0.35, 0.0); const vec3 SKY_DUSK_TOP = vec3(0.06, 0.1, 0.20); const vec3 SKY_DUSK_MID = vec3(0.35, 0.1, 0.15); -const vec3 SKY_DUSK_BOT = vec3(0.0, 0.3, 0.13); +const vec3 SKY_DUSK_BOT = vec3(0.0, 0.1, 0.23); const vec3 DUSK_LIGHT = vec3(3.0, 1.5, 0.3); const vec3 SUN_HALO_DUSK = vec3(1.2, 0.15, 0.0); @@ -119,7 +119,7 @@ const float CLOUD_HEIGHT_MIN = CLOUD_AVG_HEIGHT - 50.0; const float CLOUD_HEIGHT_MAX = CLOUD_AVG_HEIGHT + 50.0; const float CLOUD_THRESHOLD = 0.3; const float CLOUD_SCALE = 1.0; -const float CLOUD_DENSITY = 150.0; +const float CLOUD_DENSITY = 100.0; float spow(float x, float e) { return sign(x) * pow(abs(x), e); @@ -190,7 +190,7 @@ vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist, float quality) float total_density = 1.0 - passthrough / (1.0 + min(delta, max_dist) * 0.0003); - total_density *= min(max_dist * 0.02, 1.0); // Hack + total_density = max(total_density - 10.0 / max_dist, 0.0); // Hack return vec4(vec3(cloud_shade), total_density); } From f858709a9782c3d386a68f45de599d2faa8d0aac Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Mon, 18 Nov 2019 18:51:30 +0000 Subject: [PATCH 18/27] Fixed close cloud precision noise --- assets/voxygen/shaders/include/sky.glsl | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index d8ff3657b1..37b18f57be 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -140,7 +140,8 @@ vec2 cloud_at(vec3 pos) { + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0009 + tick.x * 0.005).x * 0.5 + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0025 - tick.x * 0.02).x * 0.25 + texture(t_noise, pos.xy / CLOUD_SCALE * 0.02 - tick.x * 0.03).x * 0.03 - ) / 2.85; + + texture(t_noise, pos.xy / CLOUD_SCALE * 0.05 - tick.x * 0.03).x * 0.02 + ) / 3.0; float density = max((value - CLOUD_THRESHOLD) - abs(pos.z - CLOUD_AVG_HEIGHT) / 500.0, 0.0) * CLOUD_DENSITY; @@ -157,6 +158,7 @@ vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist, float quality) float start = max(min(mind, maxd), 0.0); float delta = min(abs(mind - maxd), 5000.0); + delta = min(max_dist - start, delta); float incr = min(INCR + start / 100000.0, INCR * 2.0) / quality; @@ -169,7 +171,8 @@ vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist, float quality) float cloud_shade = 1.0; float passthrough = 1.0; for (float d = 0.0; d < 1.0; d += incr) { - float dist = start + d * delta + fuzz * pow(d, 0.2); + float dist = start + d * delta; + dist += fuzz * min(pow(dist * 0.005, 2.0), 1.0); vec3 pos = cam_pos.xyz + dir * min(dist, max_dist); vec2 sample = cloud_at(pos); @@ -190,7 +193,7 @@ vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist, float quality) float total_density = 1.0 - passthrough / (1.0 + min(delta, max_dist) * 0.0003); - total_density = max(total_density - 10.0 / max_dist, 0.0); // Hack + total_density = max(total_density - 2.0 / pow(max_dist, 0.5), 0.0); // Hack return vec4(vec3(cloud_shade), total_density); } From 293ff28f09c5a25efdb0634c1331e077792b0c38 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Mon, 18 Nov 2019 22:03:12 +0000 Subject: [PATCH 19/27] Removed cloud sampler early return --- assets/voxygen/shaders/include/sky.glsl | 44 ++++++++---------------- assets/voxygen/shaders/terrain-frag.glsl | 2 +- 2 files changed, 16 insertions(+), 30 deletions(-) diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index 37b18f57be..1e8dbdfd87 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -121,33 +121,28 @@ const float CLOUD_THRESHOLD = 0.3; const float CLOUD_SCALE = 1.0; const float CLOUD_DENSITY = 100.0; -float spow(float x, float e) { - return sign(x) * pow(abs(x), e); -} - float vsum(vec3 v) { return v.x + v.y + v.z; } vec2 cloud_at(vec3 pos) { float tick_offs = 0.0 - + texture(t_noise, pos.xy * 0.0001).x * 1.0 + + texture(t_noise, pos.xy * 0.0001 + tick.x * 0.001).x * 1.0 + texture(t_noise, pos.xy * 0.000003).x * 5.0; float value = ( 0.0 - + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0003 - tick.x * 0.002 + tick_offs).x - + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0009 + tick.x * 0.005).x * 0.5 - + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0025 - tick.x * 0.02).x * 0.25 - + texture(t_noise, pos.xy / CLOUD_SCALE * 0.02 - tick.x * 0.03).x * 0.03 - + texture(t_noise, pos.xy / CLOUD_SCALE * 0.05 - tick.x * 0.03).x * 0.02 + + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0003 + tick_offs).x + + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0009 - tick_offs).x * 0.5 + + texture(t_noise, pos.xy / CLOUD_SCALE * 0.0025 - tick.x * 0.01).x * 0.25 + + texture(t_noise, pos.xy / CLOUD_SCALE * 0.008 + tick.x * 0.02).x * 0.1 ) / 3.0; float density = max((value - CLOUD_THRESHOLD) - abs(pos.z - CLOUD_AVG_HEIGHT) / 500.0, 0.0) * CLOUD_DENSITY; - float shade = 1.0 - min(pow(max(CLOUD_AVG_HEIGHT - pos.z, 0.0), 0.15) * 0.5, 1.0) / 0.6; + float shade = 1.0 - min(pow(max(CLOUD_AVG_HEIGHT - pos.z, 0.0), 0.15) * 0.5, 1.0) / 0.5; - return vec2(shade, density / (1.0 + vsum(abs(pos - cam_pos.xyz)) / 3000)); + return vec2(shade, density / (1.0 + vsum(abs(pos - cam_pos.xyz)) / 5000)); } vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist, float quality) { @@ -158,15 +153,15 @@ vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist, float quality) float start = max(min(mind, maxd), 0.0); float delta = min(abs(mind - maxd), 5000.0); - delta = min(max_dist - start, delta); + delta = min(delta, max_dist); + + if (delta < 0.0) { + return vec4(0); + } float incr = min(INCR + start / 100000.0, INCR * 2.0) / quality; - float fuzz = sin(texture(t_noise, dir.xz * 100000.0).x * 100.0) * 0.5 * incr * delta; - - if (delta <= 0.0) { - return vec4(0); - } + float fuzz = sin(texture(t_noise, dir.xz * 100000.0).x * 100.0) * 1.0 * incr * delta; float cloud_shade = 1.0; float passthrough = 1.0; @@ -177,23 +172,14 @@ vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist, float quality) vec3 pos = cam_pos.xyz + dir * min(dist, max_dist); vec2 sample = cloud_at(pos); - float factor = 1.0; - if (dist > max_dist) { - factor -= (dist - max_dist) / (incr * delta); - } - - float integral = sample.y * incr * factor; + float integral = sample.y * incr; passthrough *= 1.0 - integral; cloud_shade = mix(cloud_shade, sample.x, passthrough * integral); - - if (factor < 1.0) { - break; - } } float total_density = 1.0 - passthrough / (1.0 + min(delta, max_dist) * 0.0003); - total_density = max(total_density - 2.0 / pow(max_dist, 0.5), 0.0); // Hack + total_density = max(total_density - 1.0 / pow(max_dist, 0.25), 0.0); // Hack return vec4(vec3(cloud_shade), total_density); } diff --git a/assets/voxygen/shaders/terrain-frag.glsl b/assets/voxygen/shaders/terrain-frag.glsl index e579f12522..1bbc799614 100644 --- a/assets/voxygen/shaders/terrain-frag.glsl +++ b/assets/voxygen/shaders/terrain-frag.glsl @@ -42,7 +42,7 @@ void main() { float fog_level = fog(f_pos.xyz, focus_pos.xyz, medium.x); vec4 clouds; vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, 0.5, true, clouds); - vec3 color = mix(mix(surf_color, fog_color, 0.0), clouds.rgb, clouds.a); + vec3 color = mix(mix(surf_color, fog_color, fog_level), clouds.rgb, clouds.a); tgt_color = vec4(color, 1.0); } From c347bd98df42a6b6d51e16912f9af47626abf8ab Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Tue, 19 Nov 2019 08:37:54 +0000 Subject: [PATCH 20/27] Massive performance boost for clouds, fixed reflection misprojection bug --- assets/voxygen/shaders/figure-frag.glsl | 2 +- assets/voxygen/shaders/fluid-frag.glsl | 4 +-- assets/voxygen/shaders/include/sky.glsl | 43 +++++++++++++----------- assets/voxygen/shaders/skybox-frag.glsl | 2 +- assets/voxygen/shaders/sprite-frag.glsl | 2 +- assets/voxygen/shaders/terrain-frag.glsl | 2 +- 6 files changed, 29 insertions(+), 26 deletions(-) diff --git a/assets/voxygen/shaders/figure-frag.glsl b/assets/voxygen/shaders/figure-frag.glsl index ebae274a2e..aba60bf8d5 100644 --- a/assets/voxygen/shaders/figure-frag.glsl +++ b/assets/voxygen/shaders/figure-frag.glsl @@ -40,7 +40,7 @@ void main() { float fog_level = fog(f_pos.xyz, focus_pos.xyz, medium.x); vec4 clouds; - vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, 0.5, true, clouds); + vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, cam_pos.xyz, f_pos, 0.5, true, clouds); vec3 color = mix(mix(surf_color, fog_color, fog_level), clouds.rgb, clouds.a); tgt_color = vec4(color, 1.0); diff --git a/assets/voxygen/shaders/fluid-frag.glsl b/assets/voxygen/shaders/fluid-frag.glsl index 443811be68..909c911c14 100644 --- a/assets/voxygen/shaders/fluid-frag.glsl +++ b/assets/voxygen/shaders/fluid-frag.glsl @@ -115,14 +115,14 @@ void main() { float fog_level = fog(f_pos.xyz, focus_pos.xyz, medium.x); vec4 clouds; - vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, 0.25, true, clouds); + vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, cam_pos.xyz, f_pos, 0.25, true, clouds); vec3 reflect_ray_dir = reflect(cam_to_frag, norm); // Hack to prevent the reflection ray dipping below the horizon and creating weird blue spots in the water reflect_ray_dir.z = max(reflect_ray_dir.z, 0.05); vec4 _clouds; - vec3 reflect_color = get_sky_color(reflect_ray_dir, time_of_day.x, vec3(-100000), 0.5, false, _clouds) * f_light; + vec3 reflect_color = get_sky_color(reflect_ray_dir, time_of_day.x, f_pos, vec3(-100000), 0.25, false, _clouds) * f_light; // Tint reflect_color = mix(reflect_color, surf_color, 0.6); // 0 = 100% reflection, 1 = translucent water diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index 1e8dbdfd87..ffa2f19d16 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -115,8 +115,8 @@ float is_star_at(vec3 dir) { } const float CLOUD_AVG_HEIGHT = 1025.0; -const float CLOUD_HEIGHT_MIN = CLOUD_AVG_HEIGHT - 50.0; -const float CLOUD_HEIGHT_MAX = CLOUD_AVG_HEIGHT + 50.0; +const float CLOUD_HEIGHT_MIN = CLOUD_AVG_HEIGHT - 30.0; +const float CLOUD_HEIGHT_MAX = CLOUD_AVG_HEIGHT + 30.0; const float CLOUD_THRESHOLD = 0.3; const float CLOUD_SCALE = 1.0; const float CLOUD_DENSITY = 100.0; @@ -145,36 +145,39 @@ vec2 cloud_at(vec3 pos) { return vec2(shade, density / (1.0 + vsum(abs(pos - cam_pos.xyz)) / 5000)); } -vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist, float quality) { - const float INCR = 0.05; +vec4 get_cloud_color(vec3 dir, vec3 origin, float time_of_day, float max_dist, float quality) { + const float INCR = 0.07; - float mind = (CLOUD_HEIGHT_MIN - cam_pos.z) / dir.z; - float maxd = (CLOUD_HEIGHT_MAX - cam_pos.z) / dir.z; + float mind = (CLOUD_HEIGHT_MIN - origin.z) / dir.z; + float maxd = (CLOUD_HEIGHT_MAX - origin.z) / dir.z; float start = max(min(mind, maxd), 0.0); float delta = min(abs(mind - maxd), 5000.0); delta = min(delta, max_dist); - if (delta < 0.0) { - return vec4(0); + bool do_cast = true; + if (mind < 0.0 && maxd < 0.0) { + do_cast = false; } - float incr = min(INCR + start / 100000.0, INCR * 2.0) / quality; + float incr = clamp(INCR / (0.01 * delta * quality), INCR, INCR * 3.0); float fuzz = sin(texture(t_noise, dir.xz * 100000.0).x * 100.0) * 1.0 * incr * delta; float cloud_shade = 1.0; float passthrough = 1.0; - for (float d = 0.0; d < 1.0; d += incr) { - float dist = start + d * delta; - dist += fuzz * min(pow(dist * 0.005, 2.0), 1.0); + if (do_cast) { + for (float d = 0.0; d < 1.0; d += incr) { + float dist = start + d * delta; + dist += fuzz * min(pow(dist * 0.005, 2.0), 1.0); - vec3 pos = cam_pos.xyz + dir * min(dist, max_dist); - vec2 sample = cloud_at(pos); + vec3 pos = origin + dir * min(dist, max_dist); + vec2 sample = cloud_at(pos); - float integral = sample.y * incr; - passthrough *= 1.0 - integral; - cloud_shade = mix(cloud_shade, sample.x, passthrough * integral); + float integral = sample.y * incr; + passthrough *= 1.0 - integral; + cloud_shade = mix(cloud_shade, sample.x, passthrough * integral); + } } float total_density = 1.0 - passthrough / (1.0 + min(delta, max_dist) * 0.0003); @@ -184,7 +187,7 @@ vec4 get_cloud_color(vec3 dir, float time_of_day, float max_dist, float quality) return vec4(vec3(cloud_shade), total_density); } -vec3 get_sky_color(vec3 dir, float time_of_day, vec3 f_pos, float quality, bool with_stars, out vec4 clouds) { +vec3 get_sky_color(vec3 dir, float time_of_day, vec3 origin, vec3 f_pos, float quality, bool with_stars, out vec4 clouds) { // Sky color vec3 sun_dir = get_sun_dir(time_of_day); vec3 moon_dir = get_moon_dir(time_of_day); @@ -259,10 +262,10 @@ vec3 get_sky_color(vec3 dir, float time_of_day, vec3 f_pos, float quality, bool ); // Approximate distance to fragment - float f_dist = distance(cam_pos.xyz, f_pos); + float f_dist = distance(origin, f_pos); // Clouds - clouds = get_cloud_color(dir, time_of_day, f_dist, quality); + clouds = get_cloud_color(dir, origin, time_of_day, f_dist, quality); clouds.rgb *= get_sun_brightness(sun_dir) * (sun_halo * 2.5 + get_sun_color(sun_dir)) + get_moon_brightness(moon_dir) * (moon_halo * 80.0 + get_moon_color(moon_dir)); if (f_dist > 5000.0) { diff --git a/assets/voxygen/shaders/skybox-frag.glsl b/assets/voxygen/shaders/skybox-frag.glsl index b1ead1d596..ab39a37c3c 100644 --- a/assets/voxygen/shaders/skybox-frag.glsl +++ b/assets/voxygen/shaders/skybox-frag.glsl @@ -14,5 +14,5 @@ out vec4 tgt_color; void main() { vec4 _clouds; - tgt_color = vec4(get_sky_color(normalize(f_pos), time_of_day.x, vec3(-100000), 1.0, true, _clouds), 1.0); + tgt_color = vec4(get_sky_color(normalize(f_pos), time_of_day.x, cam_pos.xyz, vec3(-100000), 1.0, true, _clouds), 1.0); } diff --git a/assets/voxygen/shaders/sprite-frag.glsl b/assets/voxygen/shaders/sprite-frag.glsl index 6a2e9e693f..302bd0faeb 100644 --- a/assets/voxygen/shaders/sprite-frag.glsl +++ b/assets/voxygen/shaders/sprite-frag.glsl @@ -28,7 +28,7 @@ void main() { float fog_level = fog(f_pos.xyz, focus_pos.xyz, medium.x); vec4 clouds; - vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, 0.5, true, clouds); + vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, cam_pos.xyz, f_pos, 0.5, true, clouds); vec3 color = mix(mix(surf_color, fog_color, fog_level), clouds.rgb, clouds.a); tgt_color = vec4(color, 1.0 - clamp((distance(focus_pos.xy, f_pos.xy) - (RENDER_DIST - FADE_DIST)) / FADE_DIST, 0, 1)); diff --git a/assets/voxygen/shaders/terrain-frag.glsl b/assets/voxygen/shaders/terrain-frag.glsl index 1bbc799614..0fb2811441 100644 --- a/assets/voxygen/shaders/terrain-frag.glsl +++ b/assets/voxygen/shaders/terrain-frag.glsl @@ -41,7 +41,7 @@ void main() { float fog_level = fog(f_pos.xyz, focus_pos.xyz, medium.x); vec4 clouds; - vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, f_pos, 0.5, true, clouds); + vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x, cam_pos.xyz, f_pos, 1.0, true, clouds); vec3 color = mix(mix(surf_color, fog_color, fog_level), clouds.rgb, clouds.a); tgt_color = vec4(color, 1.0); From 26e02e1ecb9e555e48da61dba7824ee27d5648ef Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Tue, 19 Nov 2019 09:17:39 +0000 Subject: [PATCH 21/27] Split terrain rendering to avoid redrawing skybox --- assets/voxygen/shaders/include/sky.glsl | 3 ++- assets/voxygen/shaders/skybox-vert.glsl | 2 +- voxygen/src/render/pipelines/skybox.rs | 2 +- voxygen/src/scene/mod.rs | 14 ++++++++++--- voxygen/src/scene/terrain.rs | 26 +++++++++++++++++++++++++ 5 files changed, 41 insertions(+), 6 deletions(-) diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index ffa2f19d16..b1917b4ee7 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -146,7 +146,8 @@ vec2 cloud_at(vec3 pos) { } vec4 get_cloud_color(vec3 dir, vec3 origin, float time_of_day, float max_dist, float quality) { - const float INCR = 0.07; + + const float INCR = 0.06; float mind = (CLOUD_HEIGHT_MIN - origin.z) / dir.z; float maxd = (CLOUD_HEIGHT_MAX - origin.z) / dir.z; diff --git a/assets/voxygen/shaders/skybox-vert.glsl b/assets/voxygen/shaders/skybox-vert.glsl index 41cac30839..e29010da5f 100644 --- a/assets/voxygen/shaders/skybox-vert.glsl +++ b/assets/voxygen/shaders/skybox-vert.glsl @@ -18,5 +18,5 @@ void main() { gl_Position = proj_mat * view_mat * - vec4(v_pos * 2000.0 + cam_pos.xyz, 1); + vec4(v_pos * 3000.0 + cam_pos.xyz, 1); } diff --git a/voxygen/src/render/pipelines/skybox.rs b/voxygen/src/render/pipelines/skybox.rs index 06446c0468..030a1608fd 100644 --- a/voxygen/src/render/pipelines/skybox.rs +++ b/voxygen/src/render/pipelines/skybox.rs @@ -31,7 +31,7 @@ gfx_defines! { noise: gfx::TextureSampler = "t_noise", tgt_color: gfx::RenderTarget = "tgt_color", - tgt_depth: gfx::DepthTarget = gfx::preset::depth::PASS_TEST, + tgt_depth: gfx::DepthTarget = gfx::preset::depth::LESS_EQUAL_WRITE, } } diff --git a/voxygen/src/scene/mod.rs b/voxygen/src/scene/mod.rs index cce853846b..41f86ed39a 100644 --- a/voxygen/src/scene/mod.rs +++ b/voxygen/src/scene/mod.rs @@ -293,9 +293,6 @@ impl Scene { /// Render the scene using the provided `Renderer`. pub fn render(&mut self, renderer: &mut Renderer, client: &mut Client) { - // Render the skybox. - renderer.render_skybox(&self.skybox.model, &self.globals, &self.skybox.locals); - // Render terrain and figures. self.figure_mgr.render( renderer, @@ -313,6 +310,17 @@ impl Scene { self.camera.get_focus_pos(), ); + // Render the skybox. + renderer.render_skybox(&self.skybox.model, &self.globals, &self.skybox.locals); + + self.terrain.render_translucent( + renderer, + &self.globals, + &self.lights, + &self.shadows, + self.camera.get_focus_pos(), + ); + renderer.render_post_process( &self.postprocess.model, &self.globals, diff --git a/voxygen/src/scene/terrain.rs b/voxygen/src/scene/terrain.rs index 382859b60e..02ffd92ec1 100644 --- a/voxygen/src/scene/terrain.rs +++ b/voxygen/src/scene/terrain.rs @@ -1092,6 +1092,32 @@ impl Terrain { ); } } + } + + pub fn render_translucent( + &self, + renderer: &mut Renderer, + globals: &Consts, + lights: &Consts, + shadows: &Consts, + focus_pos: Vec3, + ) { + let focus_chunk = Vec2::from(focus_pos).map2(TerrainChunk::RECT_SIZE, |e: f32, sz| { + (e as i32).div_euclid(sz as i32) + }); + + let chunks = &self.chunks; + let chunk_iter = Spiral2d::new() + .scan(0, |n, rpos| { + if *n >= chunks.len() { + None + } else { + *n += 1; + let pos = focus_chunk + rpos; + Some(chunks.get(&pos).map(|c| (pos, c))) + } + }) + .filter_map(|x| x); // Terrain sprites for (pos, chunk) in chunk_iter.clone() { From b883e298c3e258b3d966dcde5598a643c5098bb5 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Tue, 19 Nov 2019 12:35:10 +0000 Subject: [PATCH 22/27] Fixed dense cloud void issue --- assets/voxygen/shaders/include/sky.glsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index b1917b4ee7..f6cd556372 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -176,7 +176,7 @@ vec4 get_cloud_color(vec3 dir, vec3 origin, float time_of_day, float max_dist, f vec2 sample = cloud_at(pos); float integral = sample.y * incr; - passthrough *= 1.0 - integral; + passthrough *= max(1.0 - integral, 0.0); cloud_shade = mix(cloud_shade, sample.x, passthrough * integral); } } From 3cf34c24b6063ccab058918062e119b8f56747b1 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Tue, 19 Nov 2019 13:36:15 +0000 Subject: [PATCH 23/27] Fixed cloud shader banding issue --- assets/voxygen/shaders/include/sky.glsl | 15 +++++++-------- assets/voxygen/shaders/skybox-vert.glsl | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index f6cd556372..1e6d518876 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -115,8 +115,8 @@ float is_star_at(vec3 dir) { } const float CLOUD_AVG_HEIGHT = 1025.0; -const float CLOUD_HEIGHT_MIN = CLOUD_AVG_HEIGHT - 30.0; -const float CLOUD_HEIGHT_MAX = CLOUD_AVG_HEIGHT + 30.0; +const float CLOUD_HEIGHT_MIN = CLOUD_AVG_HEIGHT - 35.0; +const float CLOUD_HEIGHT_MAX = CLOUD_AVG_HEIGHT + 35.0; const float CLOUD_THRESHOLD = 0.3; const float CLOUD_SCALE = 1.0; const float CLOUD_DENSITY = 100.0; @@ -140,7 +140,7 @@ vec2 cloud_at(vec3 pos) { float density = max((value - CLOUD_THRESHOLD) - abs(pos.z - CLOUD_AVG_HEIGHT) / 500.0, 0.0) * CLOUD_DENSITY; - float shade = 1.0 - min(pow(max(CLOUD_AVG_HEIGHT - pos.z, 0.0), 0.15) * 0.5, 1.0) / 0.5; + float shade = ((pos.z - CLOUD_AVG_HEIGHT) / (CLOUD_AVG_HEIGHT - CLOUD_HEIGHT_MIN) + 0.5); return vec2(shade, density / (1.0 + vsum(abs(pos - cam_pos.xyz)) / 5000)); } @@ -153,17 +153,16 @@ vec4 get_cloud_color(vec3 dir, vec3 origin, float time_of_day, float max_dist, f float maxd = (CLOUD_HEIGHT_MAX - origin.z) / dir.z; float start = max(min(mind, maxd), 0.0); - float delta = min(abs(mind - maxd), 5000.0); - delta = min(delta, max_dist); + float delta = min(abs(mind - maxd), max_dist); bool do_cast = true; if (mind < 0.0 && maxd < 0.0) { do_cast = false; } - float incr = clamp(INCR / (0.01 * delta * quality), INCR, INCR * 3.0); + float incr = INCR; - float fuzz = sin(texture(t_noise, dir.xz * 100000.0).x * 100.0) * 1.0 * incr * delta; + float fuzz = sin(texture(t_noise, dir.xz * 100000.0).x * 100.0) * incr * delta; float cloud_shade = 1.0; float passthrough = 1.0; @@ -181,7 +180,7 @@ vec4 get_cloud_color(vec3 dir, vec3 origin, float time_of_day, float max_dist, f } } - float total_density = 1.0 - passthrough / (1.0 + min(delta, max_dist) * 0.0003); + float total_density = 1.0 - passthrough / (1.0 + delta * 0.0001); total_density = max(total_density - 1.0 / pow(max_dist, 0.25), 0.0); // Hack diff --git a/assets/voxygen/shaders/skybox-vert.glsl b/assets/voxygen/shaders/skybox-vert.glsl index e29010da5f..220bae9112 100644 --- a/assets/voxygen/shaders/skybox-vert.glsl +++ b/assets/voxygen/shaders/skybox-vert.glsl @@ -18,5 +18,5 @@ void main() { gl_Position = proj_mat * view_mat * - vec4(v_pos * 3000.0 + cam_pos.xyz, 1); + vec4(v_pos * 2500.0 + cam_pos.xyz, 1); } From ff49de772f7d08040abb6d5759f3d4778d14a1bc Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Tue, 19 Nov 2019 19:22:56 +0000 Subject: [PATCH 24/27] Smoother water at distance, fixed warnings --- assets/voxygen/shaders/fluid-frag.glsl | 2 +- voxygen/src/render/texture.rs | 1 - voxygen/src/ui/cache.rs | 2 +- voxygen/src/ui/graphic/mod.rs | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/assets/voxygen/shaders/fluid-frag.glsl b/assets/voxygen/shaders/fluid-frag.glsl index 909c911c14..836b405907 100644 --- a/assets/voxygen/shaders/fluid-frag.glsl +++ b/assets/voxygen/shaders/fluid-frag.glsl @@ -99,7 +99,7 @@ void main() { 0.1 / slope ); - nmap = mix(vec3(0, 0, 1), normalize(nmap), clamp(2.0 / pow(frag_dist, 0.5), 0, 1)); + nmap = mix(vec3(0, 0, 1), normalize(nmap), min(1.0 / pow(frag_dist, 0.75), 1)); vec3 norm = f_norm * nmap.z + b_norm * nmap.x + c_norm * nmap.y; diff --git a/voxygen/src/render/texture.rs b/voxygen/src/render/texture.rs index 08fa7ac69b..8bd5c3b8a8 100644 --- a/voxygen/src/render/texture.rs +++ b/voxygen/src/render/texture.rs @@ -1,7 +1,6 @@ use super::{gfx_backend, RenderError}; use gfx::{self, traits::Factory}; use image::{DynamicImage, GenericImageView}; -use std::marker::PhantomData; use vek::Vec2; type DefaultShaderFormat = (gfx::format::R8_G8_B8_A8, gfx::format::Srgb); diff --git a/voxygen/src/ui/cache.rs b/voxygen/src/ui/cache.rs index 36604f2bfb..b4bb7b61cb 100644 --- a/voxygen/src/ui/cache.rs +++ b/voxygen/src/ui/cache.rs @@ -1,6 +1,6 @@ use super::graphic::{Graphic, GraphicCache, Id as GraphicId}; use crate::{ - render::{Renderer, Texture, UiPipeline}, + render::{Renderer, Texture}, Error, }; use conrod_core::text::GlyphCache; diff --git a/voxygen/src/ui/graphic/mod.rs b/voxygen/src/ui/graphic/mod.rs index 8fba234e68..138a54d52e 100644 --- a/voxygen/src/ui/graphic/mod.rs +++ b/voxygen/src/ui/graphic/mod.rs @@ -1,6 +1,6 @@ mod renderer; -use crate::render::{Renderer, Texture, UiPipeline}; +use crate::render::{Renderer, Texture}; use dot_vox::DotVoxData; use guillotiere::{size2, SimpleAtlasAllocator}; use hashbrown::HashMap; From 9491ac332f3742f82bb39a859b8a4b0d53d8da96 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Tue, 19 Nov 2019 20:43:41 +0000 Subject: [PATCH 25/27] Stronger moonlight --- assets/voxygen/shaders/include/sky.glsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/voxygen/shaders/include/sky.glsl b/assets/voxygen/shaders/include/sky.glsl index 1e6d518876..8fc2b64929 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -82,7 +82,7 @@ void get_sun_diffuse(vec3 norm, float time_of_day, out vec3 light, out vec3 diff light = sun_chroma + moon_chroma + PERSISTENT_AMBIANCE; diffuse_light = sun_chroma * mix(1.0, max(dot(-norm, sun_dir) * 0.6 + 0.4, 0.0), diffusion) + - moon_chroma * mix(1.0, pow(max(dot(-norm, moon_dir), 0.0), 2.0), diffusion) + + moon_chroma * mix(1.0, pow(max(dot(-norm, moon_dir) * 2.0, 0.0), 2.0), diffusion) + PERSISTENT_AMBIANCE; ambient_light = vec3(SUN_AMBIANCE * sun_light + moon_light); } From 42748c262d4639421dad12260c2d6cb115c8a672 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Wed, 20 Nov 2019 09:59:27 +0000 Subject: [PATCH 26/27] Non-linear depth buffer --- assets/voxygen/shaders/figure-vert.glsl | 1 + assets/voxygen/shaders/fluid-vert.glsl | 1 + assets/voxygen/shaders/skybox-vert.glsl | 3 ++- assets/voxygen/shaders/sprite-vert.glsl | 1 + assets/voxygen/shaders/terrain-vert.glsl | 1 + voxygen/src/scene/camera.rs | 2 +- 6 files changed, 7 insertions(+), 2 deletions(-) diff --git a/assets/voxygen/shaders/figure-vert.glsl b/assets/voxygen/shaders/figure-vert.glsl index 8e9ead9aa7..dbaf30f964 100644 --- a/assets/voxygen/shaders/figure-vert.glsl +++ b/assets/voxygen/shaders/figure-vert.glsl @@ -43,4 +43,5 @@ void main() { ).xyz); gl_Position = proj_mat * view_mat * vec4(f_pos, 1); + gl_Position.z = 1.0 / (1.0 - gl_Position.z - 10.0); } diff --git a/assets/voxygen/shaders/fluid-vert.glsl b/assets/voxygen/shaders/fluid-vert.glsl index 07834690e9..400f694d81 100644 --- a/assets/voxygen/shaders/fluid-vert.glsl +++ b/assets/voxygen/shaders/fluid-vert.glsl @@ -39,4 +39,5 @@ void main() { proj_mat * view_mat * vec4(f_pos, 1); + gl_Position.z = 1.0 / (1.0 - gl_Position.z - 10.0); } diff --git a/assets/voxygen/shaders/skybox-vert.glsl b/assets/voxygen/shaders/skybox-vert.glsl index 220bae9112..8cfe045eda 100644 --- a/assets/voxygen/shaders/skybox-vert.glsl +++ b/assets/voxygen/shaders/skybox-vert.glsl @@ -18,5 +18,6 @@ void main() { gl_Position = proj_mat * view_mat * - vec4(v_pos * 2500.0 + cam_pos.xyz, 1); + vec4(v_pos * 100000.0 + cam_pos.xyz, 1); + gl_Position.z = 0.0; } diff --git a/assets/voxygen/shaders/sprite-vert.glsl b/assets/voxygen/shaders/sprite-vert.glsl index fedbc0a749..6bbb5ea71f 100644 --- a/assets/voxygen/shaders/sprite-vert.glsl +++ b/assets/voxygen/shaders/sprite-vert.glsl @@ -53,4 +53,5 @@ void main() { proj_mat * view_mat * vec4(f_pos, 1); + gl_Position.z = 1.0 / (1.0 - gl_Position.z - 10.0); } diff --git a/assets/voxygen/shaders/terrain-vert.glsl b/assets/voxygen/shaders/terrain-vert.glsl index 61ef233cd2..9e06303fb3 100644 --- a/assets/voxygen/shaders/terrain-vert.glsl +++ b/assets/voxygen/shaders/terrain-vert.glsl @@ -40,4 +40,5 @@ void main() { proj_mat * view_mat * vec4(f_pos, 1); + gl_Position.z = 1.0 / (1.0 - gl_Position.z - 10.0); } diff --git a/voxygen/src/scene/camera.rs b/voxygen/src/scene/camera.rs index a759153e20..6af3c3eb89 100644 --- a/voxygen/src/scene/camera.rs +++ b/voxygen/src/scene/camera.rs @@ -5,7 +5,7 @@ use std::f32::consts::PI; use vek::*; const NEAR_PLANE: f32 = 0.5; -const FAR_PLANE: f32 = 5000.0; +const FAR_PLANE: f32 = 100000.0; const FIRST_PERSON_INTERP_TIME: f32 = 0.05; const THIRD_PERSON_INTERP_TIME: f32 = 0.1; From 2b6d65062ca5ced25902ce7a3b4b20c4fbb95812 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Wed, 20 Nov 2019 10:38:11 +0000 Subject: [PATCH 27/27] Prevented chunk load popping with smooth view distance growth --- assets/voxygen/shaders/fluid-vert.glsl | 1 + assets/voxygen/shaders/terrain-vert.glsl | 1 + 2 files changed, 2 insertions(+) diff --git a/assets/voxygen/shaders/fluid-vert.glsl b/assets/voxygen/shaders/fluid-vert.glsl index 400f694d81..f38cfd2e56 100644 --- a/assets/voxygen/shaders/fluid-vert.glsl +++ b/assets/voxygen/shaders/fluid-vert.glsl @@ -24,6 +24,7 @@ void main() { float((v_pos_norm >> 8) & 0x00FFu), float((v_pos_norm >> 16) & 0x1FFFu) ) + model_offs; + f_pos.z -= 25.0 * pow(distance(focus_pos.xy, f_pos.xy) / view_distance.x, 20.0); f_col = vec3( float((v_col_light >> 8) & 0xFFu), diff --git a/assets/voxygen/shaders/terrain-vert.glsl b/assets/voxygen/shaders/terrain-vert.glsl index 9e06303fb3..cf273f6207 100644 --- a/assets/voxygen/shaders/terrain-vert.glsl +++ b/assets/voxygen/shaders/terrain-vert.glsl @@ -25,6 +25,7 @@ void main() { ) + model_offs; f_pos.z *= min(1.0001 - 0.02 / pow(tick.x - load_time, 10.0), 1.0); + f_pos.z -= 25.0 * pow(distance(focus_pos.xy, f_pos.xy) / view_distance.x, 20.0); f_col = vec3( float((v_col_light >> 8) & 0xFFu),