U3D Shader 实现Gerstner波及实时法线计算

    最近终于在U3D上自己实现了Gerstner波,其中参考了他人文章,也自己踩了坑,写一篇博客记录下问题。

一 Gerstner波

    在水面模拟中我们常会使用到正弦函数叠加来模拟波的形状,这可能是绘制一个平静的,田园诗般的池塘所需的。对于粗狂的海洋,需要形成比较尖的浪头和比较宽的浪槽,这时候我们需要使用Gerstner波。简单来说Gestner波是将顶点向波峰聚集,从而形成尖的浪头。其算式如下:

013equ01.jpg

                                   GPU精粹一 中的Gerstner波函数

上式中不难发现输入的参数为x,y,t在我们写的代码中应该是x,z,t所以我们将y替换成z,并交换算式中二三行位置得到算式如下:

                                   在U3D实现时用的Gerstner波函数

其中变量与其意义 :

  • A:振幅
  • D:波的方向
  • ω:2*Pi/L 其中L为波长
  • ψ:S*ω其中S为波速
  • Q:控制波的陡度 值(0,1)为0时则波形为正弦波,为1时最陡。(PS:超过1时会看见波在波峰上形成环)

    这时我们有了波函数在代码中实现过后我们可以的到一个通过顶点动画实现的Gerstner波,然而我们并不能只管的看见这个波,因为我们只修改了顶点位置,并没有修改法线的值,如果只有简单的光照渲染我们将会看见一个纯色的平面,为了获得更加真实的效果我们需要试试计算法线的值, 我们可以通过对波形函数分别求对x、z的偏导函数得到切线T与副切线B的算式:

N=B*T;

与波形函数一样,我们的算式与CPU精粹一书中并不一样。需要注意的是在u3d 中我们是在左手坐标系进行计算,为了符和左手法则我们使用对z的偏导来表示B,对x的偏导来表示T。 

 

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值