我只是想知道我的理解TBN矩陣計算正確法線貼圖,TBN矩陣計算
在頂點着色器,我們通常使用:
vec3 n = normalize(gl_NormalMatrix * gl_Normal);
vec3 t = normalize(gl_NormalMatrix * Tangent.xyz);
vec3 b = normalize(gl_NormalMatrix * Bitangent.xyz);
mat3 tbn = mat3(t, b, n);
據我瞭解這個tbn
矩陣從變換的矢量Tangent space to Eye space。實際上,我們想要反轉 - 從眼睛空間向Tangent空間轉換矢量。因此,我們需要反轉tbn
矩陣:
tbn = transpose(tbn); // transpose should be OK here for doing matrix inversion
注:tbn
- 應該只包含旋轉,對於這種情況下,我們可以使用轉逆矩陣。
我們可以改變我們的載體:
vec3 lightT = tbn * light_vector;
... = tbn * ...
在幾個教程,源代碼中我發現,作者用這樣的:
light.x = dot(light, t);
light.y = dot(light, b);
light.z = dot(light, n);
上面的代碼不一樣乘以由transposed(tbn)
矩陣組成。
問題:
我們應該用換位tbn
矩陣正如我上面所解釋的?或者我錯過了什麼?
註解通過該解決方案,我們將矢量(light_vector)轉換爲頂點着色器中的TBN,然後在片段着色器中我們只需從法線貼圖中獲得法線。其他選項是創建從TBN空間轉換到眼圖空間的TBN矩陣,然後在片段着色器中從法線貼圖轉換每個讀取法線。
定義「正確的「?你把你的正常和切向量的交叉乘積拿到你的苦味矢量。一般來說,這對於大多數表面來說*不是正確的。對你來說這可能是正確的,但大多數紋理映射不使用完美的正交映射到曲面。 – 2013-03-10 21:54:08
對,我已經更新了這個問題。我也改變了不安的計算方式。 – fen 2013-03-11 08:01:47