From 173538992811ebaa2caa3189962c6d1dc93cf36d Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Tue, 5 Nov 2019 15:08:54 +0000 Subject: [PATCH] Overhauled water shaders --- assets/voxygen/shaders/fluid-frag.glsl | 58 ++++++++++++++++-------- assets/voxygen/shaders/include/sky.glsl | 2 +- assets/voxygen/texture/waves.png | Bin 15148 -> 19586 bytes voxygen/src/scene/terrain.rs | 2 +- 4 files changed, 41 insertions(+), 21 deletions(-) diff --git a/assets/voxygen/shaders/fluid-frag.glsl b/assets/voxygen/shaders/fluid-frag.glsl index 265f792c07..038c693f64 100644 --- a/assets/voxygen/shaders/fluid-frag.glsl +++ b/assets/voxygen/shaders/fluid-frag.glsl @@ -27,6 +27,30 @@ vec3 warp_normal(vec3 norm, vec3 pos, float time) { + smooth_rand(pos * 0.25, time * 0.25) * 0.1); } +float wave_height(vec3 pos) { + vec3 big_warp = ( + texture(t_waves, fract(pos.xy * 0.03 + tick.x * 0.01)).xyz * 0.5 + + texture(t_waves, fract(pos.yx * 0.03 - tick.x * 0.01)).xyz * 0.5 + + vec3(0) + ); + + 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 + + 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_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 + + 0.0 + ); + + return pow(abs(height), 0.5) * sign(height) * 3.0; +} + 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) ); @@ -61,30 +85,27 @@ void main() { } vec3 c_norm = cross(f_norm, b_norm); - vec3 nwarp = normalize( - texture(t_waves, fract(f_pos.xy * 0.03 + tick.x * 0.02)).xyz * 0.7 + - texture(t_waves, fract(-f_pos.yx * 0.03 + tick.x * 0.02)).xyz * 0.7 + - texture(t_waves, fract(f_pos.xy * 0.07 + tick.x * 0.04)).xyz * 0.5 + - texture(t_waves, fract(-f_pos.yx * 0.15 + tick.x * 0.04)).xyz * 0.3 + - texture(t_waves, fract(f_pos.xy * 0.25 + tick.x * 0.12)).xyz * 0.05 + - texture(t_waves, fract(-f_pos.yx * 0.5 + tick.x * 0.12)).xyz * 0.05 - ) * 0.4; - vec3 nmap = mix(vec3(0, 0, 1), normalize(( - texture(t_waves, fract(f_pos.xy * 0.01 + nwarp.xy)).rgb * 1.0 + - texture(t_waves, fract(f_pos.xy * 0.1 + nwarp.xy)).rgb * 0.8 + - texture(t_waves, fract(f_pos.xy * 0.3 + nwarp.xy)).rgb * 0.6 + - texture(t_waves, fract(f_pos.xy * 0.9 + nwarp.xy * 0.3)).rgb * 0.2 - + vec3(-0.5, -0.5, 0) - ) * nwarp.z), clamp(2.0 / pow(frag_dist, 0.5), 0, 1)); + float wave00 = wave_height(f_pos); + float wave10 = wave_height(f_pos + vec3(0.1, 0, 0)); + float wave01 = wave_height(f_pos + vec3(0, 0.1, 0)); + + float slope = abs(wave00 - wave10) * abs(wave00 - wave01); + vec3 nmap = vec3( + -(wave10 - wave00) / 0.1, + -(wave01 - wave00) / 0.1, + 0.1 / slope + ); + + nmap = mix(vec3(0, 0, 1), normalize(nmap), clamp(2.0 / pow(frag_dist, 0.5), 0, 1)); vec3 norm = f_norm * nmap.z + b_norm * nmap.x + c_norm * nmap.y; vec3 light, diffuse_light, ambient_light; - get_sun_diffuse(f_norm, time_of_day.x, light, diffuse_light, ambient_light, 0.0); - float point_shadow = shadow_at(f_pos, f_norm); + get_sun_diffuse(norm, time_of_day.x, light, diffuse_light, ambient_light, 0.0); + float point_shadow = shadow_at(f_pos, norm); diffuse_light *= f_light * point_shadow; ambient_light *= f_light, point_shadow; - vec3 point_light = light_at(f_pos, f_norm); + vec3 point_light = light_at(f_pos, norm); light += point_light; diffuse_light += point_light; vec3 surf_color = illuminate(srgb_to_linear(f_col), light, diffuse_light, ambient_light); @@ -97,7 +118,6 @@ void main() { 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; - //reflect_color = vec3(reflect_color.r + reflect_color.g + reflect_color.b) / 3.0; // 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 6eb3ff8602..59a27f00a8 100644 --- a/assets/voxygen/shaders/include/sky.glsl +++ b/assets/voxygen/shaders/include/sky.glsl @@ -150,7 +150,7 @@ vec3 get_sky_color(vec3 dir, float time_of_day, bool with_stars) { 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.0045, 0.0), 1000.0) * SUN_SURF_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; diff --git a/assets/voxygen/texture/waves.png b/assets/voxygen/texture/waves.png index 627dc0661a5a358ce440ca45a3b4650da912d34d..f793317875fe279136fe9a33dbb83b48d705ef71 100644 GIT binary patch literal 19586 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 diff --git a/voxygen/src/scene/terrain.rs b/voxygen/src/scene/terrain.rs index 54eff15a53..3a7c93f6bf 100644 --- a/voxygen/src/scene/terrain.rs +++ b/voxygen/src/scene/terrain.rs @@ -755,7 +755,7 @@ impl Terrain { waves: renderer .create_texture( &assets::load_expect("voxygen.texture.waves"), - Some(gfx::texture::FilterMethod::Bilinear), + Some(gfx::texture::FilterMethod::Trilinear), Some(gfx::texture::WrapMode::Tile), ) .expect("Failed to create wave texture"),