适用于4.6以上版本。

shader_type spatial;
//使用 blend_mix 处理透明度
render_mode blend_mix, depth_draw_opaque, cull_disabled;
// 水的物理特性
uniform vec4 water_color : source_color = vec4(0.05, 0.05, 0.05, 0.7);
uniform float roughness_val : hint_range(0.0, 1.0) = 0.02; // 光滑度
uniform float specular_val : hint_range(0.0, 1.0) = 0.8; // 高光反射率
//扩散控制
uniform sampler2D puddle_noise; //积水边缘形状的噪波图
uniform float progress : hint_range(0.0, 1.0) = 0.5; // 水渍扩大的进度
uniform float edge_softness : hint_range(0.01, 0.5) = 0.1; // 边缘渗入地下的柔和度
//水面微波纹
uniform sampler2D ripple_normal : hint_normal; // 水面微弱波纹的法线图
uniform float ripple_speed = 0.02; // 波纹流动的速度
uniform float ripple_strength : hint_range(0.0, 1.0) = 0.3; // 波纹的强度
void fragment() {
//计算从中心点向外的扩散距离
vec2 center = vec2(0.5, 0.5);
vec2 offset = UV - center;
float dist = length(offset);
//噪波
float noise = texture(puddle_noise, UV).r;
//扩散逻辑
//进度
float puddle_mask = (progress * 0.8) - dist - (noise * 0.2);
// 生成积水遮罩
float alpha = smoothstep(0.0, edge_softness, puddle_mask);
//动态微波纹
vec2 scrolling_uv = UV + TIME * ripple_speed;
vec3 normal_map = texture(ripple_normal, scrolling_uv).rgb;
vec3 flat_normal = vec3(0.5, 0.5, 1.0);
vec3 final_normal = mix(flat_normal, normal_map, alpha * ripple_strength);
//材质
ALBEDO = water_color.rgb;
ALPHA = alpha * water_color.a;
ROUGHNESS = roughness_val;
SPECULAR = specular_val;
METALLIC = 0.0;
NORMAL_MAP = final_normal;
}