Re: [情報] 海島奇兵的海浪效果

作者: cjcat2266 (CJ Cat)   2015-06-25 02:19:31
基本上就是把頻率不同的雜訊疊加在一起 (如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.
作者: wyvernlee (wyvernlee)   2015-06-25 09:24:00
長知識,推!
作者: cowbaying (是在靠北喔)   2015-06-25 09:45:00
太神啦
作者: waldfantasy (Kira)   2015-06-25 10:48:00
推!
作者: 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
作者: KanoLoa (卡)   2015-06-25 16:03:00
什麼時候wave交疊可以噴水花呢...

Links booklink

Contact Us: admin [ a t ] ucptt.com