作者cjcat2266 (CJ Cat)
看板GameDesign
標題Re: [情報] 海島奇兵的海浪效果
時間Thu Jun 25 02:19:31 2015
基本上就是把頻率不同的雜訊疊加在一起 (如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.
--
Web
http://AllenChou.net
Twitter
http://twitter.com/TheAllenChou
LinkedIn
http://linkedin.com/in/MingLunChou
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 160.33.43.15
※ 文章網址: https://www.ptt.cc/bbs/GameDesign/M.1435169976.A.595.html
※ 編輯: cjcat2266 (160.33.43.15), 06/25/2015 02:52:41
推 wyvernlee: 長知識,推! 06/25 09:24
→ cowbaying: 太神啦 06/25 09:45
推 waldfantasy: 推! 06/25 10:48
推 riveranb: 分享個人經驗上的小技巧,對於(3)準備normal-mapx1 06/25 15:15
→ riveranb: 在shader中計算不同 texel-UV 空間上的位移量 06/25 15:15
→ riveranb: 由不同texel-UV 位移方向來 fetch 該 normal-map 06/25 15:16
→ riveranb: 將fetch出來的結果做某些算式(如 average) 06/25 15:16
→ riveranb: 再取最後average的結果的 UV空間方向當成相位差(delta) 06/25 15:17
→ riveranb: 重新以原本的 uv+delta 的texel 再 fetch一次normal-map 06/25 15:18
→ riveranb: 用這樣的方式來模擬不同 wave 交疊的效果 06/25 15:18
→ riveranb: 當然, 仍是重複紋路:P 06/25 15:19
→ KanoLoa: 什麼時候wave交疊可以噴水花呢... 06/25 16:03