今天在练习真实水材质渲染的时候为了解决水面波纹的扰动效果,通过利用_Time函数实现一张图向一个方向扰动后,随着时间的推移,扰动会越来越复杂,叠加会越积越多,如何控制这个循环呢?
方法是利用锯齿波来控制循环,实现的变化循环,但这在一个相位的转换后会出现突变,解决方法是在锯齿波的基础上叠加一个三角波(直接使用三角波会出现突然倒退,使用正弦波等会大大降低shader的性能,得不偿失)
锯齿波
叠加三角波后
下面是代码的实现:
float progress = frac(time + phaseOffset);
frac函数返回参数的小数部分,从而巧妙地实现了锯齿波的效果,则是在后续中偏移用的,不多赘述。
uvw.z = 1-abs(1-2*progress);// 1-|1-2p|
三角波的实现则是通过数学公式 来实现的,不过需要注意的是,此处是在z分量上叠加的三角波,其是通过在纹理采样中乘以z分量来消除突然的变黑(为0)。
fixed4 texA = tex2D (_MainTex, uvwA.xy) * uvwA.z;