Chango的数学Shader世界(五)水波模拟-那平静又汹涌的海面:叠加,Gerstner波

本文介绍了如何通过叠加数学函数和引入Gerstner波方程,优化Shader以模拟更复杂的海洋水面,特别是创建尖锐的浪尖效果。通过在Shader中应用多个波并调整参数,实现更自然的海浪动态。同时,探讨了Gerstner波的数学原理和法线计算,以及在实际实现中的注意事项。
摘要由CSDN通过智能技术生成

目的:

根据前篇的水波Shader,优化成一个不透明的,适合广阔海域的Shader,以解决前篇Shader的一些缺陷。

参考:

《GPU Gems》

引言:

对于我们之前的初步可用品Shader,可以从不同方面进行改造,适用于不同需求下的水面。接下来几篇着重于造型上的改造,适用于不透明水面,如深邃广阔的大海。

思路:

回想起前篇结尾我们谈论到的当前Shader的不足之处:

1.只能模拟一个方向简单的水波状态,波间距一致,缺少自然感。

2.波形状一致,单一,且与某些常见的海浪形状不一致。

下面,针对这两点分别改进。

1.通过叠加增加复杂感

没错,这个问题的解决方案很简单,我们当前不就只有一个方向的波么?多加两个,调调参数就完事了。

记得高中、大学数学学过的导数法则:

(f+g)'=f'+g'

所以,添加多个波之后的方程也极其简单。

波面方程:

Z(x,y)=\sum _{i}A_{i}* Sin(w_{i}(D_{i}x* x+D_{i}y*y)+p_{i})

法线方程:

(-Z_{x},-Z_{y},1)

-Z_{x}=-\sum _{i}A_{i}*cos(w_{i}*(D_{i}x*x+D_{i}y*y)+p_{i})*w_{i}*D_{i}x

-Z_{y}=-\sum _{i}A_{i}*cos(w_{i}*(D_{i}x*x+D_{i}y*y)+p_{i})*w_{i}*D_{i}y

PS:

如果你知道傅里叶变换(Fourier transform),那么就能意识到只要多加几个波,什么样复杂的水面都可以模拟出来。

因为几乎任何函数都能被拆解成傅里叶级数(Fourier series),包括不连续的函数。

 

级数越多,“分辨率”越高。这个特性是不是像极了我们之前提到过的泰勒公式(Taylor's formula)

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值