GLSL-TBN矩陣

TBN矩陣

一、簡述

1.1 TBN矩陣作用

我們研究一個矩陣的時候通常需要了解一個矩陣是從哪一個空間或者說矩陣而來的。如果搜索一下TBN矩陣運算公式可以發現其決定於物體座標系下的頂點和紋理座標系下的紋理座標。想到這裏我們需要明確TBN運算的輸入和輸出是什麼。

  • 先說輸入:輸入是一張紋理的rgb,分別代表紋理座標系下的xyz軸上的分量,而TBN是一一對應於xyz的。
  • 再說輸出:輸出是物體座標系下的法線向量。

然後我們很容易得出了結論,TBN是將一個點從紋理空間變換到物體空間的一個矩陣。這麼解釋對嗎?紋理空間、切線空間、物體空間,如何通過個矩陣找到對應關係。TBN的座標軸的座標值是物體空間下的,所以TBN其實就是從切線空間到物體空間的對應關係。而根據公式已經將紋理空間的xyz和TBN建立了對應關係,那麼即可通過rgb在TBN空間下找到一條向量。所以紋理座標對TBN:有求解關係,無對應變換關係。這樣即通過公式將紋理空間和切線空間合二爲一,剩下的就好理解了。

因此TBN構成一個變換矩陣,即每一個座標軸是對應矩陣的一列。就可將切線空間下的法線變換到物體空間下的法線。

1.2 切線空間

法線貼圖中存儲的法線最初是定義在世界空間中,但在實際中,這種方式很少見,因爲只要物體移動,法線貼圖則不再有效。另一種方式就是將法線存儲在物體的局部空間中,物體可以進行剛體變換(平移,旋轉,縮放),法線貼圖依舊有效,但是這種方法並不能應對任何方式的變換,並且法線貼圖不能在不同物體進行復用,增加了美工的負擔。所以,現在現在普遍採用的解決方案是將法線存儲在切線空間中。

簡單的來說,切線空間可以理解爲紋理空間的u,v方向和法向量n,這3個方向構成了切線空間,一般使用T、B和N表示,如圖3所示。具體解釋見http://blog.csdn.net/bonchoix/article/details/8619624,這個博客解釋的很好,沒見過的童鞋可以看一看,第一次理解可能會有點困難。
  
直觀地講,模型頂點中的紋理座標,就定義於切線空間。普通2維紋理座標包含U、V兩項,其中U座標增長的方向, 即切線空間中的tangent軸,V座標增加的方向,爲切線空間中的bitangent軸。模型中不同的三角形,都有對應的切線空間,其tangent軸和bitangent軸分別位於三角形所在平面上,結合三角形面對應的法線,我們稱tangant軸(T)、bitangent軸(B)及法線軸(N)所組成的座標系,即切線空間(TBN)。
在這裏插入圖片描述

在立方體中,每個面都有對應的切線空間,每個面由兩個三角形組成,該兩個三角形中的紋理座標就基於相應的切線空間。

1.3 紋理座標與位置座標的關係

紋理座標與位置座標,可以通過切線空間聯繫起來。如下圖所示:
在這裏插入圖片描述
該圖顯示了一個三角形及其所在的切線空間。已知該三角形三個頂點的位置座標:V0, V1,V2, 以及對應的紋理座標:(u0,v0,), (u1, v1), (u2, v2)。 定義三角形的兩條邊爲E0 = V1 –V0,E1= V2 – V0,對應的紋理座標差值:(t1, b1) = (u1 – u0, v1– v0), (t2, b2) = (u2 – u0, v2– v0)。 我們有如下關係式:

E0 =t1T+ b1B

E1 = t2T+ b2B

二、推導應用

一條法線是一個三維向量,一個三維向量由x, y, z等3個分量組成,在法線貼圖中,把(x, y, z)當作RGB3個顏色的值存儲(如圖2),並將其每個分量映射到[-1, 1]。例如,對於x, y, z各有8位的紋理,[0, 128, 255]表示法向量(-1, 0, 1)。利用彩色通道存儲法線貼圖如下:
在這裏插入圖片描述

在使用法線貼圖(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。

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