基本上就是把频率不同的噪声叠加在一起 (如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.