Chango的数学Shader世界(三)水波模拟,法线,切线空间

这篇博客介绍了如何在Shader中实时计算水波的法线方向,以解决模型法线问题。通过推导曲面方程,得出法线方向公式,修正后的法线使得光照效果更准确。作者强调了切线空间和坐标系的一致性在简化计算中的作用,并预告了后续会处理更复杂情况和优化模型的移动问题。
摘要由CSDN通过智能技术生成

目的:

推导出一个水波Shader。本篇考虑造型后的法线修正。

参考:

《GPU Gems》

引言:

上一篇我们已经实现了水波Shader的造型,但法线其实有问题。乍看起来还好,因为自身模型产生的阴影,给出了比较好的立体感。(你应该知道常规游戏引擎渲染中,光照和阴影是分开生成的)。

但是,当我把模型自身产生的阴影关掉

对比旁边平面的反光,我意识到模型的法线在每个顶点处都是和平面一样的,向上的方向,这显然是不对的。

思路

1.为什么会这样?

原来,法线信息是早就在建模软件导出的时候计算好了的,是存在模型文件里的数据。Shader里不修改,是不会变的。

显然,我们可以做一张法线贴图。但我们的水波之后要有随机,有大有小的,这怎么办呢?

2.实时法线方向?

在计算之前,你得先问问自己,我真的了解法线贴图吗?我先问你,对于下图这个方块的法线贴图,A,B面的颜色rgb(也就是法线方向xyz),分别是多少呢?

答案都是蓝色,也就是(0,0,1)。为什么?

因为现代多数引擎中,不用物体x,y,z坐标系描述法线方向,而是对于每一个顶点,都有它自己的坐标系,其3方向分别是此点的切线方向(Tanget-T),副切线方向(Bitangent-B),法线方向(Normal-N)。TBN相互垂直,具体方向实际情况都不一样。(因为对应不同建模软件,不同游戏引擎,都没有一个标准答案,混乱不堪)

(PS:之前看到一些三流文章说TBN不一定相互垂直,我反正至今没有看到这种情况)

而且对于B方向的叫法,有副法线/副切线/次法线/次切线/Binormal/Bitangent。我这里建议3d曲面上叫副切线,3d曲线上叫副法线,因为3d曲面有1个法线和无数切线,3d曲线上有1个切线和无数个法线。即我这里建议称B为副切线/Bitangent,因为3d模型通常都是3d曲面。

这样由TBN3方向组成的坐标系就是切线坐标系,通常称为切线空间。(在微分几何中,称为Frenet-Serret Formulas/Frame/Theorem

如果我们的模型本来就是水波形状,那法线都是(0,0,1)就完事了。但我们现在的模型是平面,也就是说,每个顶点的切线坐标系都是一样的。那么,这个一致的切线坐标系的TBN方向是向哪里的呢?

我打开了UE4的模型编辑器,分别查看在物体坐标系下,TBN的方向,很不幸,UE4的对于B的叫法叫Binormal(副法线)。

(题外话,至于Bi前缀,应该来源于Binary,有分支,二元的意思,如bisect,bifocal&#x

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值