版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/w450468524/article/details/51649703
学习法线贴图(normal mapping)的过程中,最关键的一个矩阵就是TBN矩阵,该矩阵用于将存储在纹理空间中的法向量转换到模型空间中(实际使用相反,为了减少计算量,是将光线从模型空间转换到了纹理空间,然后计算反射光线,因为光线条数远远少于法向量数目)。
下图展示法线贴图的含义,图中的蓝色部分为一块法线纹理,上面的黑色小木棒(纯手工绘图)是每个像素的rgb代表的法线向量。就像一块海绵上插了无数歪歪扭扭的针一样……这样当计算反射光线时,这些法向量模拟凹凸不平的表面,最后产生真实的感觉。
首先考虑向量空间中坐标表示的问题,给定一个三维坐标系的一组基,X⃗ ,Y⃗ ,Z⃗ X→,Y→,Z→,那么该坐标系中的任意向量A⃗ (a1,a2,a3)A→(a1,a2,a3)的坐标的含义为:
A⃗ =a1∗X⃗ +a2∗Y⃗ +a3∗Z⃗
A→=a1∗X→+a2∗Y→+a3∗Z→
,即A⃗ A→用基向量表示时各分量的值。如果再给定另外一个坐标系的一组基U⃗ ,V⃗ ,W⃗ U→,V→,W→,并且给出X⃗ ,Y⃗ ,Z⃗ X→,Y→,Z→向量在这个坐标系中的表示x⃗ ,y⃗ ,z⃗ x→,y→,z→,那么就可以很方便得到A⃗ A→向量在第二个坐标系中的表示,(a1,a2,a3)∗[x⃗ ,y⃗ ,z⃗ ]T(a1,a2,a3)∗[x→,y→,z→]T。因此,[x⃗ ,y⃗ ,z⃗ ]T[x→,y→,z→]T可以看作是这两个空间的转换矩阵。
如上图所示,假定△ABC△ABC纹理映射到模型中△abc△abc这块三角形上,纹理中存储的rgb分量代表该点处法线在纹理空间中的坐标,我们要将左边的纹理空间中的法向量转换到右边的模型空间中(这里先只讨论uv二维的坐标,第三维直接取模型空间的法向量即可),已知顶点的UV坐标,模型坐标以及法向量,根据上面的讨论,现在要求出U⃗ ,V⃗ U→,V→这两个向量基在模型空间中的坐标,即右边T⃗ ,B⃗ T→,B→的坐标。我们可以列出一个方程组:
然后解出T⃗ ,B⃗ T→,B→即可。加上第三维坐标时,一般会选择垂直于TB平面的法向量N⃗ N→,这个向量是已知的。最后再将T⃗ ,B⃗ ,N⃗ T→,B→,N→归一化,就得到了转换矩阵。
但是开头说过了,实际我们使用的变换是将光线从模型空间变换到纹理空间,因此要求的实际是逆过程的转换矩阵,好在TBN矩阵是正交阵,转置一下就得到了