学习资料:《Unity Shader入门精要》第15章
源代码:Github
水波效果
水波的法线纹理由噪声纹理生成,随时间平移
混合反射和折射:菲涅尔系数
f r e s n e l = p o w ( 1 − m a x ( 0 , v ⋅ n ) , 4 ) fresnel = pow(1-max(0,v\cdot n),4) fresnel=pow(1−max(0,v⋅n),4)
具体实现
片元着色器
使用与时间有关的偏移值,对法线纹理进行两次采样并叠加,模拟两层交叉的水波效果:
float2 speed = _Time.y * float2(_WaveXSpeed, _WaveYSpeed);
// Get the normal in tangent space
fixed3 bump1 = UnpackNormal(tex2D(_WaveMap, i.uv.zw + speed)).rgb;
fixed3 bump2 = UnpackNormal(tex2D(_WaveMap, i.uv.zw - speed)).rgb;
fixed3 bump = normalize(bump1 + bump2);
菲涅尔效应:
fixed fresnel = pow(1 - saturate(dot(viewDir, bump)), 4);
fixed3 finalColor = reflCol * fresnel + refrCol * (1 - fresnel);
效果展示: