S04 锯齿波与三角波

今天在练习真实水材质渲染的时候为了解决水面波纹的扰动效果,通过利用_Time函数实现一张图向一个方向扰动后,随着时间的推移,扰动会越来越复杂,叠加会越积越多,如何控制这个循环呢?

方法是利用锯齿波来控制循环,实现0-1-0-1的变化循环,但这在一个相位的转换后会出现突变,解决方法是在锯齿波的基础上叠加一个三角波(直接使用三角波会出现突然倒退,使用正弦波等会大大降低shader的性能,得不偿失)

锯齿波

叠加三角波后

下面是代码的实现:

float progress = frac(time + phaseOffset);

frac函数返回参数的小数部分,从而巧妙地实现了锯齿波的效果,phaseOffset则是在后续中偏移用的,不多赘述。

uvw.z = 1-abs(1-2*progress);// 1-|1-2p|

三角波的实现则是通过数学公式w ( p ) = 1 − | 1 − 2 p | 来实现的,不过需要注意的是,此处是在z分量上叠加的三角波,其是通过在纹理采样中乘以z分量来消除突然的变黑(为0)。

fixed4 texA = tex2D (_MainTex, uvwA.xy)  * uvwA.z;
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容