一个普通的水面涟漪Shader

都2020年了,咱终于升级到HDRP,试了试ShaderGraph,感觉还是好简陋,日常报错卡顿。作为练手的第一个Shader先不写复杂的了。

生成水波

单个涟漪就是计算到起点的距离,根据距离去做水波。应该是可以用正弦函数去做的,但是截取单个水波有点麻烦,这里偷懒直接用smoothstep的三次函数去做了。内外两个半波相乘得到一个环形。
波的生成
通过根据时间调整距离来让水波动起来。
手动扩散
接下来就要根据时间去计算偏移量,首先计算一个周期让它能够重复扩散。
计算周期
上面是扩散完成一次的周期,增大了一点来让每一次扩散之间有一定时间间隔。
下面的是水波传播一个波长的周期,这里是为了抵消初始时水波已经扩散的距离。没有的话水波会凭空出现。
然后就是用时间去做扩散。时间取模之后减去之前一个波长的周期,用来对距离做减法。这里引入一个相位来做随机。
波的扩散
最后要做一个波的衰减,不然最后波会凭空消失。
波的衰减
也是根据距离,做一个幂函数的衰减。最后作用到水波上。

分块重复

有了单个水波以后我们让他重复一下。先做个uv的分块。
UV分块
下面的噪声用来做每块里相位的随机。
生成单个水波
输入到之前写好的水波生成里。由于是uv分块水波不能跨越边界,调一下中心和扩散距离防止穿帮。
叠加多个水波
重复4次吧,再多了有点重复了。最后把4种水波叠加起来,求个法线,就做完了。

最终结果

最终
还算可以接受吧,其实因为分块不能大幅度调整位移,跟帧动画原理差不多,但是由于每个块加了一个随机相位效果还不错的样子。至于ShaderGraph怎么和其他材质做混合还是要再研究一下…