目的:
根据前篇的水波Shader,优化成一个不透明的,适合广阔海域的Shader,以解决前篇Shader的一些缺陷。
参考:
《GPU Gems》
引言:
对于我们之前的初步可用品Shader,可以从不同方面进行改造,适用于不同需求下的水面。接下来几篇着重于造型上的改造,适用于不透明水面,如深邃广阔的大海。
思路:
回想起前篇结尾我们谈论到的当前Shader的不足之处:
1.只能模拟一个方向简单的水波状态,波间距一致,缺少自然感。
2.波形状一致,单一,且与某些常见的海浪形状不一致。
下面,针对这两点分别改进。
1.通过叠加增加复杂感
没错,这个问题的解决方案很简单,我们当前不就只有一个方向的波么?多加两个,调调参数就完事了。
记得高中、大学数学学过的导数法则:
所以,添加多个波之后的方程也极其简单。
波面方程:
法线方程:
PS:
如果你知道傅里叶变换(Fourier transform),那么就能意识到只要多加几个波,什么样复杂的水面都可以模拟出来。
因为几乎任何函数都能被拆解成傅里叶级数(Fourier series),包括不连续的函数。
级数越多,“分辨率”越高。这个特性是不是像极了我们之前提到过的泰勒公式(Taylor's formula)?