200字
一滩液体(godot着色器)
2026-03-08
2026-03-08

适用于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;
}

一滩液体(godot着色器)
作者
站长
发表于
2026-03-08

评论