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