GLSL——TBN矩阵

TBN矩阵

一、思考

我们研究一个矩阵的时候通常需要了解一个矩阵是从哪一个空间或者说矩阵而来的。如果搜索一下TBN矩阵运算公式可以发现其决定于物体座标系下的顶点和纹理座标系下的纹理座标。想到这里我们需要明确TBN运算的输入和输出是什么。

  • 先说输入:输入是一张纹理的rgb,分别代表纹理座标系下的xyz轴上的分量,而TBN是一一对应于xyz的。
  • 再说输出:输出是物体座标系下的法线向量。

然后我们很容易得出了结论,TBN是将一个点从纹理空间变换到物体空间的一个矩阵。这么解释对吗?纹理空间、切线空间、物体空间,如何通过个矩阵找到对应关系。TBN的座标轴的座标值是物体空间下的,所以TBN其实就是从切线空间到物体空间的对应关系。而根据公式已经将纹理空间的xyz和TBN建立了对应关系,那么即可通过rgb在TBN空间下找到一条向量。所以纹理座标对TBN:有求解关系,无对应变换关系。这样即通过公式将纹理空间和切线空间合二为一,剩下的就好理解了。

因此TBN构成一个变换矩阵,即每一个座标轴是对应矩阵的一列。就可将切线空间下的法线变换到物体空间下的法线。

二、推导应用

在使用法线贴图(normal mapping)等技术时时,最关键的一个矩阵就是TBN矩阵,该矩阵用于将存储在纹理空间中的法向量转换到模型空间中(实际使用相反,为了减少计算量,是将光线从模型空间转换到了纹理空间,然后计算反射光线,因为光线条数远远少于法向量数目)。

下图展示法线贴图的含义,图中的蓝色部分为一块法线纹理,上面的黑色小木棒(灵魂手绘)是每个像素的rgb代表的法线向量。就像一块海绵上插了无数歪歪扭扭的针一样……这样当计算反射光线时,这些法向量模拟凹凸不平的表面,最后产生真实的感觉。
在这里插入图片描述

2.1 两空间转换矩阵原理

首先考虑向量空间中座标表示的问题,给定一个三维座标系的一组基:(向量X,向量Y,向量Z),那么该座标系中的任意向量A(a1,a2,a3)的座标的含义为:
在这里插入图片描述
,即A用基向量表示时各分量的值。如果再给定另外一个座标系的一组基::(向量U,向量V,向量W),并且给出XYZ向量在这个座标系中的表示xyz,那么就可以很方便得到A向量在第二个座标系中的表示,(a1,a2,a3)∗[x,y,z]T。因此,[x,y ,z ]T可以看作是这两个空间的转换矩阵。

2.2 TBN矩阵推导

在这里插入图片描述
如上图所示,假定△ABC纹理映射到模型中△abc这块三角形上,纹理中存储的rgb分量代表该点处法线在纹理空间中的座标,我们要将左边的纹理空间中的法向量转换到右边的模型空间中(这里先只讨论uv二维的座标,第三维直接取模型空间的法向量即可),已知顶点的UV座标,模型座标以及法向量,根据上面的讨论,现在要求出U ,V这两个向量基在模型空间中的座标,即右边 T,B的座标。我们可以列出一个方程组:
在这里插入图片描述
然后解出T,B即可。加上第三维座标时,一般会选择垂直于TB平面的法向量N,这个向量是已知的。最后再将T,B,N归一化,就得到了转换矩阵。

但是开头说过了,实际我们使用的变换是将光线从模型空间变换到纹理空间,因此要求的实际是逆过程的转换矩阵,好在TBN矩阵是正交阵,转置一下就得到了[T,B,N]−1。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章