交互水效果详解
使用着色器制作水的技术五花八门,为了达到各种效果的制作技巧和手段也非常多。这里介绍一种普遍常用的制作水的流程,效果包括反射,折射,波浪起伏,水岸交互等。
实现原理:
1.叠加不同方向和强度的法线纹理动画来模拟水流。
2.利用法线纹理反映射后的值偏移抓屏纹理(RenderTexture)的UV,模拟水的折射效果。
3.利用顶点偏移模拟水浪。
4.使用深度图和场景深度(屏幕深度)的差值来模拟得到物体和水相交处的遮罩。
5.本案例的ASE版用的Specular的PBR模板,所以用Smoothness和Specular来模拟高光和粗糙度。而代码版用的是自定义灯光,所以是做的Bulinn-Phong高光计算。**
算法实现:
1.法线纹理动画叠加
这里只叠了2层法线,如果追求效果可多叠几层。
此节点为Texture Object类型,可以生成贴图实例。
BlendNormals节点作用是混合两张法线贴图,
公式:BlendNormal = normalize( float3( A.xy + B.xy, A.z*B.z ).
这里内部已经将法向量从切线空间变换到了世界空间。
代码中进行了切线空间转世界空间的变换,但是法线叠加算法直接用的加法并归一化,和ASE中的法线混合算法BlendNormal不同,效果其实差不多:
/**************计算法线纹理UV偏移,并将法线纹理反映射,得到切线空间下的法向量,最终将法向量转换到世界空间下**************/
float2 bumpUVOffset0 = i.uv.xy + _Time.y * _Speed0; //其中一个方向的法线UV偏移
float2 bumpUVOffset1 = i.uv.xy + _Time.y * _Speed1; //另一个方向的法线UV偏移
float3 bump0 = UnpackNormal(tex2D(_NormalMap, bumpUVOffset0)); //将一个方向的法线反映射
float3 bump1 = UnpackNormal(tex2D