基本上就是把频率不同的噪声叠加在一起 (如perlin noise, simplex noise, etc.)
用不同速度移动各频率噪声
我可以想到的做法有三种:
1. 在CPU上即时生成噪声材质,传入vertex shader
vertex shader对噪声材质取样,用以位移水面的vertices
优点:时间轴上,不易出现重复的纹路
缺点:跟2.和3.比起来,较消耗CPU运算资源
噪声品质受材质分辨率限制
空间轴上,还是会注意到tiling产生的重复纹路(如果材质分辨率太低)
2. vertex shader中,把vertex位置传入噪声函式取得位移量
ShaderToy上有不少shader噪声函式范例
这是其中一个 https://www.shadertoy.com/view/Ms2SD1
优点:空间和时间轴上,皆不易出现重复纹路
噪声品质不受分辨率限制
缺点:跟1.和3.比起来,较消耗GPU运算资源
3. 事先生成不同频率的噪声材质(pre-rendered noise)
传入vertex shader,用来位移水面的vertices
或者拿来当做normal map
优点:跟1.和2.比起来,消耗较少运算资源
美术人员对噪声的视觉控制较大,容易设计stylized noise
缺点:空间和时间轴上,皆较易让人注意到重复纹路
normal map没有实际位移水面,容易让人注意到瑕疵
噪声品质受材质分辨率限制
原po提到的Boom Beach看起来是用3.的方式产生水面normal map
然后再用个低频噪声位移水面的vertices
一般运算资源足够的PC或主机游戏,采用的是1.或2.
作者:
riveranb (River)
2015-06-25 15:15:00分享个人经验上的小技巧,对于(3)准备normal-mapx1在shader中计算不同 texel-UV 空间上的位移量由不同texel-UV 位移方向来 fetch 该 normal-map将fetch出来的结果做某些算式(如 average)再取最后average的结果的 UV空间方向当成相位差(delta)重新以原本的 uv+delta 的texel 再 fetch一次normal-map用这样的方式来模拟不同 wave 交叠的效果当然, 仍是重复纹路:P