目的:
推导出一个水波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