From 48d95e76999765ec1db8120fd9e9205ac3ea56af Mon Sep 17 00:00:00 2001 From: Isse Date: Thu, 2 Nov 2023 12:53:34 +0100 Subject: [PATCH 1/3] SnowGlitter experimental shader --- assets/voxygen/shaders/terrain-frag.glsl | 16 ++++++++++++++++ voxygen/src/render/mod.rs | 2 ++ 2 files changed, 18 insertions(+) diff --git a/assets/voxygen/shaders/terrain-frag.glsl b/assets/voxygen/shaders/terrain-frag.glsl index ce1e27dc96..12a4347a33 100644 --- a/assets/voxygen/shaders/terrain-frag.glsl +++ b/assets/voxygen/shaders/terrain-frag.glsl @@ -54,6 +54,9 @@ uniform utexture2D t_kind; layout(set = 2, binding = 3) uniform sampler s_kind; +const uint SNOW = 0x21; +const uint ART_SNOW = 0x22; + layout (std140, set = 3, binding = 0) uniform u_locals { mat4 model_mat; @@ -538,6 +541,19 @@ void main() { // vec3 col = /*srgb_to_linear*/(f_col + noise); // Small-scale noise // vec3 col = /*srgb_to_linear*/(f_col + hash(vec4(floor(f_pos * 3.0 - f_norm * 0.5), 0)) * 0.01); // Small-scale noise vec3 surf_color = illuminate(max_light, view_dir, col * emitted_light, col * reflected_light); + #ifdef EXPERIMENTAL_SNOWGLITTER + if (f_kind == SNOW || f_kind == ART_SNOW) { + float cam_distance = distance(cam_pos.xyz, f_pos); + vec4 pos = vec4(f_pos + focus_off.xyz, 0.0); + + vec4 dir = vec4(view_dir, 0.0); + float map = max(snoise(pos * 2.0 - dir * 3.0), 0.0); + + float rand = hash(floor(pos * 30.0 + hash(pos * 2.0) + dir * 2.0)); + float random = max(rand - 0.99, 0.0) * 100.0; + surf_color += pow(random, 10) * map * 10.0 / max(1.0, cam_distance * 0.1); + } + #endif float f_select = (select_pos.w > 0 && select_pos.xyz == floor(f_pos - f_norm * 0.5)) ? 1.0 : 0.0; surf_color += f_select * (surf_color + 0.1) * vec3(0.5, 0.5, 0.5); diff --git a/voxygen/src/render/mod.rs b/voxygen/src/render/mod.rs index 9a8d941604..8386bff56f 100644 --- a/voxygen/src/render/mod.rs +++ b/voxygen/src/render/mod.rs @@ -545,4 +545,6 @@ pub enum ExperimentalShader { ColorDithering, /// Cinematic color grading. Cinematic, + /// Glittering snow. + SnowGlitter, } From 664fe61b8397d6b864e0fb6690c5a6aa6e959f28 Mon Sep 17 00:00:00 2001 From: Isse Date: Thu, 2 Nov 2023 12:55:45 +0100 Subject: [PATCH 2/3] Add to changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index be6d4a43b9..e8fccc8d4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Allow plugins to add weapon and armor items - New voxelised LoD shader effect - Allow plugins to add recipes and item images +- `SnowGlitter` experimental shader. ### Changed From 7a8e363df1076150eaa070818e1c9540823b3127 Mon Sep 17 00:00:00 2001 From: Isse Date: Thu, 2 Nov 2023 15:19:23 +0100 Subject: [PATCH 3/3] better way to show glitter --- assets/voxygen/shaders/include/constants.glsl | 3 +++ assets/voxygen/shaders/terrain-frag.glsl | 20 +++++++++---------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/assets/voxygen/shaders/include/constants.glsl b/assets/voxygen/shaders/include/constants.glsl index d8e7585311..2ffb537df6 100644 --- a/assets/voxygen/shaders/include/constants.glsl +++ b/assets/voxygen/shaders/include/constants.glsl @@ -58,6 +58,9 @@ #define MAT_FIGURE 3 #define MAT_LOD 4 +#define BLOCK_SNOW 0x21 +#define BLOCK_ART_SNOW 0x22 + // An arbitrary value that represents a very far distance (at least as far as the player should be able to see) without // being too far that we end up with precision issues (used in clouds and elsewhere). #define DIST_CAP 50000 diff --git a/assets/voxygen/shaders/terrain-frag.glsl b/assets/voxygen/shaders/terrain-frag.glsl index 12a4347a33..e5a0af2277 100644 --- a/assets/voxygen/shaders/terrain-frag.glsl +++ b/assets/voxygen/shaders/terrain-frag.glsl @@ -54,9 +54,6 @@ uniform utexture2D t_kind; layout(set = 2, binding = 3) uniform sampler s_kind; -const uint SNOW = 0x21; -const uint ART_SNOW = 0x22; - layout (std140, set = 3, binding = 0) uniform u_locals { mat4 model_mat; @@ -542,16 +539,19 @@ void main() { // vec3 col = /*srgb_to_linear*/(f_col + hash(vec4(floor(f_pos * 3.0 - f_norm * 0.5), 0)) * 0.01); // Small-scale noise vec3 surf_color = illuminate(max_light, view_dir, col * emitted_light, col * reflected_light); #ifdef EXPERIMENTAL_SNOWGLITTER - if (f_kind == SNOW || f_kind == ART_SNOW) { + if (f_kind == BLOCK_SNOW || f_kind == BLOCK_ART_SNOW) { float cam_distance = distance(cam_pos.xyz, f_pos); - vec4 pos = vec4(f_pos + focus_off.xyz, 0.0); + vec3 pos = f_pos + focus_off.xyz; - vec4 dir = vec4(view_dir, 0.0); - float map = max(snoise(pos * 2.0 - dir * 3.0), 0.0); + float map = max(noise_3d(pos), 0.0); - float rand = hash(floor(pos * 30.0 + hash(pos * 2.0) + dir * 2.0)); - float random = max(rand - 0.99, 0.0) * 100.0; - surf_color += pow(random, 10) * map * 10.0 / max(1.0, cam_distance * 0.1); + vec4 lpos = vec4(floor(pos * 35.0), 0.0); + + vec3 n = normalize(vec3(hash(lpos + 128), hash(lpos - 435), hash(lpos + 982))); + + float s = pow(abs(dot(n, view_dir)), 4.0); + + surf_color += pow(map * s, 10.0) * 5.0 / max(1.0, cam_distance * 0.5); } #endif