前几天算是弄懂了TBN矩阵然后写了一个Normal Mapping、写一写自己的理解吧
因为Normal Mapping的图是每个点的法向量,是以每个点为原点的,而点光源的位置啥的是在世界坐标系/物体坐标系,不是在当前计算的这个点的坐标系,所以在计算时用到法向量贴图的数据的话,必须把其他的元素和这个点法向量转换到同一坐标系
Σ( ° △ °|||)︴
然后比较简单的一种转换方式就是建立这样的坐标系:以这个点为原点,UV方向为两个轴,UV方向的叉乘方向为第三个轴,然后这个点的法向量不变,其他元素的位置(比如点光源的坐标)转换到这个坐标系,进行计算。这个坐标系定义的空间就叫做Tangent Space,切向空间。TBN矩阵就是在世界空间和切向空间直接坐标转换的一个矩阵。
TBN矩阵中 ((据说是Tangent, Bitangent, Normal,一般只需要知道Tangent和Normal就可以了。在一些厉害的3D物体格式,比如fbx 3ds等,是可以在模型导出的时候通过建模软件直接导出Tangent和Normal的值的。然而,在obj格式的模型中,需要自己计算Tangent和Normal。
计算Normal的方法很简单,先求每个面的法向量,然后对于每个点,求跟它有关系的每个面的法向量的平均值,每个面的法向量只需要叉乘一下相邻两条边向量就好(不管是三角面片还是四元面片)。
计算Tangent的基本思想和Normal差不多,求每个面的Tangent,然后对于每个点求一个平均值。求每个面的Tangent就需要一些数学计算。原理就不说了,反正我大概意会了一下……这个教程讲的非常好http://www.terathon.com/code/tangent.html
贴个法相贴图的效果图
(o゚ω゚o)