add snow management for materials

This commit is contained in:
2026-03-31 14:28:10 +02:00
parent 2f4fd27dfd
commit ade67a3b90
26 changed files with 693 additions and 97 deletions

View File

@@ -1,19 +1,30 @@
shader_type spatial;
render_mode blend_mix, depth_draw_opaque;
render_mode blend_mix, depth_draw_never;
global uniform float global_snow_amount;
uniform vec4 snow_color : source_color = vec4(0.95, 0.98, 1.0, 1.0);
global uniform float global_snow_start_time = -1.0;
global uniform float global_snow_accumulation_speed = 0.1;
global uniform float global_snow_melt_time = -1.0;
global uniform float global_snow_melt_speed = 0.1;
global uniform float global_snow_threshold = 0.5;
global uniform vec4 global_snow_color = vec4(0.92, 0.96, 1.0, 1.0);
void fragment() {
vec3 world_normal = (INV_VIEW_MATRIX * vec4(NORMAL, 0.0)).xyz;
float up_dot = dot(world_normal, vec3(0.0, 1.0, 0.0));
float snow_mask = smoothstep(1.0 - global_snow_amount, 1.1 - global_snow_amount, up_dot);
snow_mask *= step(0.01, global_snow_amount);
float snow_amount = 0.0;
if (global_snow_start_time >= 0.0) {
snow_amount = clamp((TIME - global_snow_start_time) * global_snow_accumulation_speed, 0.0, 1.0);
}
ALBEDO = snow_color.rgb;
ALPHA = snow_mask;
ROUGHNESS = 0.3;
SPECULAR = 0.5;
}
if (global_snow_melt_time >= 0.0) {
float melt = clamp((TIME - global_snow_melt_time) * global_snow_melt_speed, 0.0, 1.0);
snow_amount = snow_amount * (1.0 - melt);
}
vec3 world_normal = (INV_VIEW_MATRIX * vec4(NORMAL, 0.0)).xyz;
float facing_up = clamp(world_normal.y, 0.0, 1.0);
float snow_factor = smoothstep(global_snow_threshold, 1.0, facing_up) * snow_amount;
ALBEDO = global_snow_color.rgb;
ROUGHNESS = 0.15;
METALLIC = 0.0;
ALPHA = snow_factor;
}