基本上就是把頻率不同的雜訊疊加在一起 (如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.