作者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://webptt.com/cn.aspx?n=bbs/GameDesign/M.1435169976.A.595.html
※ 编辑: cjcat2266 (160.33.43.15), 06/25/2015 02:52:41
1F:推 wyvernlee: 长知识,推! 06/25 09:24
2F:→ cowbaying: 太神啦 06/25 09:45
3F:推 waldfantasy: 推! 06/25 10:48
4F:推 riveranb: 分享个人经验上的小技巧,对於(3)准备normal-mapx1 06/25 15:15
5F:→ riveranb: 在shader中计算不同 texel-UV 空间上的位移量 06/25 15:15
6F:→ riveranb: 由不同texel-UV 位移方向来 fetch 该 normal-map 06/25 15:16
7F:→ riveranb: 将fetch出来的结果做某些算式(如 average) 06/25 15:16
8F:→ riveranb: 再取最後average的结果的 UV空间方向当成相位差(delta) 06/25 15:17
9F:→ riveranb: 重新以原本的 uv+delta 的texel 再 fetch一次normal-map 06/25 15:18
10F:→ riveranb: 用这样的方式来模拟不同 wave 交叠的效果 06/25 15:18
11F:→ riveranb: 当然, 仍是重复纹路:P 06/25 15:19
12F:→ KanoLoa: 什麽时候wave交叠可以喷水花呢... 06/25 16:03