2013-06-13 35 views
1

我想我無法理解TBN概念,他們使用它進行凹凸貼圖,法線貼圖等等。但是他們不能只使用模型視圖矩陣從紋理中提取法線?我需要TBN矩陣的解釋,我真的無法理解使用原因。爲什麼我需要在OpenGL中使用TBN矩陣?

回答

3

您使用的每個點和矢量都在某個參考框架中定義,但它可以從一個轉換爲另一個。

從紋理貼圖中讀取的法線位於「切線空間」中。這實際上不是強制性的,例如你可以讓它們在世界空間中定義。但想一想,如果旋轉模型,法線會發生什麼?切線空間與模型一起旋轉,這意味着法線也是這樣(即使您變形/蒙皮網格)。否則,您需要爲每個可能的旋轉提供不同的法線。
這就是爲什麼使用切線空間實際上是必需的(無論如何,這是選擇)。

現在,事情是,你的光和你的眼睛可能不是在切線空間而是在世界空間中定義的。例如半角矢量等。
只有當它們全部在同一座標系中時,才能用有意義的方式計算事物。 TBN允許你從一個轉換到另一個。

頂點單獨正常是不充分的(但在正常和T或B將被,其他的都可以使用交叉乘積計算)的同時只能與單個載體限定方向,但不是「擰」。所以,沒有至少一個向量,你的法線沒有被定義,它們可以以任何可能的方式繞着你的頂點法線旋轉,每個方向同樣有效或無效。

當您需要提取多個紋理元素(例如採樣高度圖,而非法線貼圖)時,會出現類似的情況。當然,你有一個內插的UV座標。所以它明確定義了哪個texel進行採樣。
但是現在您還想要在4x4四邊形中採樣其他3個像素。或者,也許你想做raymarching。你將在哪個方向採樣下一個紋理元素?你不知道,因爲你可以任何你喜歡的方式圍繞法向旋轉UV座標系。每次輪換同樣有效或無效。
TBN解決了這個問題,因爲N指向上(「離開紋理圖像」),T和B指向與U和V相同的方向。

+0

如果我的眼睛和光線定義在眼睛空間,不是世界?將與TBN工作相乘? – deniz

+0

是(或者說,是和否,取決於)。你可以轉換切線<->世界和世界<->眼睛(使用MV)和向後如你所願。只要你和他們做了數學計算,只要你把所有的東西都變成了相同的東西,那並不重要。如果一切都在同一個座標系中,那你就很好。否則,它會看起來錯誤。 – Damon

+0

謝謝,半角矢量代表什麼? – deniz

相關問題