我想我無法理解TBN概念,他們使用它進行凹凸貼圖,法線貼圖等等。但是他們不能只使用模型視圖矩陣從紋理中提取法線?我需要TBN矩陣的解釋,我真的無法理解使用原因。爲什麼我需要在OpenGL中使用TBN矩陣?
1
A
回答
3
您使用的每個點和矢量都在某個參考框架中定義,但它可以從一個轉換爲另一個。
從紋理貼圖中讀取的法線位於「切線空間」中。這實際上不是強制性的,例如你可以讓它們在世界空間中定義。但想一想,如果旋轉模型,法線會發生什麼?切線空間與模型一起旋轉,這意味着法線也是這樣(即使您變形/蒙皮網格)。否則,您需要爲每個可能的旋轉提供不同的法線。
這就是爲什麼使用切線空間實際上是必需的(無論如何,這是選擇)。
現在,事情是,你的光和你的眼睛可能不是在切線空間而是在世界空間中定義的。例如半角矢量等。
只有當它們全部在同一座標系中時,才能用有意義的方式計算事物。 TBN允許你從一個轉換到另一個。
頂點單獨正常是不充分的(但在正常和T或B將被,其他的都可以使用交叉乘積計算)的同時只能與單個載體限定方向,但不是「擰」。所以,沒有至少一個向量,你的法線沒有被定義,它們可以以任何可能的方式繞着你的頂點法線旋轉,每個方向同樣有效或無效。
當您需要提取多個紋理元素(例如採樣高度圖,而非法線貼圖)時,會出現類似的情況。當然,你有一個內插的UV座標。所以它明確定義了哪個texel進行採樣。
但是現在您還想要在4x4四邊形中採樣其他3個像素。或者,也許你想做raymarching。你將在哪個方向採樣下一個紋理元素?你不知道,因爲你可以任何你喜歡的方式圍繞法向旋轉UV座標系。每次輪換同樣有效或無效。
TBN解決了這個問題,因爲N指向上(「離開紋理圖像」),T和B指向與U和V相同的方向。
相關問題
- 1. 爲什麼在OpenGL ES 2.0中不需要push/pop矩陣等價?
- 2. 爲什麼在數據矩陣編碼中需要糾錯?
- 3. OpenGL - 爲什麼移除了矩陣堆棧,現在人們在使用什麼?
- 4. 爲什麼OpenGL投影矩陣不必要地複雜?
- 5. 爲什麼我們需要使用變換矩陣的「轉置」? (direct3D11)
- 6. 爲什麼我需要使用這個語句兩次 - 矩陣乘法
- 7. 我需要在R中爲類矩陣類實現什麼方法?
- 8. 法線貼圖,TBN矩陣計算
- 9. 爲什麼在OpenGL中顯式管理矩陣更好?
- 10. 爲什麼我需要Iterator接口,爲什麼要使用它?
- 11. 是TBN矩陣真的旋轉矩陣嗎?
- 12. 爲什麼我們需要使用prompt.start()?
- 13. 爲什麼我不需要使用Adapter.notifyDataSetChanged()?
- 14. 爲什麼我們需要使用ExitWindowsEx
- 15. 爲什麼我需要使用Activator CreateInstance?
- 16. 爲什麼我需要使用超時?
- 17. 爲什麼我需要使用stopPropagation()?
- 18. 什麼是openGL中的着色器,我們需要什麼?
- 19. 什麼時候不需要Traceability矩陣?有什麼事嗎?
- 20. 任何使用TBN矩陣求逆的理由?
- 21. 爲什麼我需要在我的AsyncTask中使用Looper?
- 22. 爲什麼我需要我需要在子類中實現IDisposable()
- 23. 模型中有什麼?爲什麼我們需要使用它
- 24. 在Django中,爲什麼我需要__unicode__?
- 25. 爲什麼我需要在single.php中
- 26. 在vs2010中需要添加什麼參考才能使用OpenGL?
- 27. OpenGL中的矩陣
- 28. 爲什麼我需要「&」?
- 29. 爲什麼我需要android.permission.ACCESS_CHECKIN_PROPERTIES
- 30. 爲什麼我需要extern?
如果我的眼睛和光線定義在眼睛空間,不是世界?將與TBN工作相乘? – deniz
是(或者說,是和否,取決於)。你可以轉換切線<->世界和世界<->眼睛(使用MV)和向後如你所願。只要你和他們做了數學計算,只要你把所有的東西都變成了相同的東西,那並不重要。如果一切都在同一個座標系中,那你就很好。否則,它會看起來錯誤。 – Damon
謝謝,半角矢量代表什麼? – deniz