前言:我好像弄懂了一點點,把這個再梳理一遍

一切都要從 Shader 說起
Shader 分為「頂點渲染器」和「片段渲染器」
- 「頂點渲染器」
「頂點渲染器」保存三角形的三個頂點的 u v 值,給后續(xù)片段渲染器提供數(shù)據(jù)。但是返回 值。
- 「片段渲染器」
在調(diào)用「片段渲染器」之前,遍歷屬于三角形的最大矩形,用重心法算出比例。傳遞給「片段渲染器」,「片段渲染器」拿到這個比例以后就可以算出屬于這個點的 u、v 值。通過 u、v 值從 diffuse 貼圖中拿到顏色。
用圖解就是這樣

這就是不考慮光照的紋理貼圖
法線貼圖
當然通過 用插值的方法可以計算任一點的法線。
但是我們可以存儲法線,像 diffuse 貼圖那樣通過 uv 訪問。

我們?yōu)槭裁葱枰ň€貼圖?
通過法線,我們可以計算該點的光照強度。使紋理感更強。
法線貼圖的制作
可以看我這篇文章如何產(chǎn)生法線貼圖
(我是翻譯國外大神的,但是國外大神有點爛尾,有關(guān)鍵問題沒有解決)
只要知道
-
是可以從普通 「texture」貼圖中計算法向量的。但是還有很多其他的辦法
左圖為普通 texture,右圖為由左圖計算的法線貼圖
這樣的法線定義在切線空間中
還沒完

這樣的法線貼圖,有一個問題
舉個例子,有一個正方體,每一面都貼相同的圖,而由相同的圖來說,法向量永遠一樣。但是由于在空間中位置的不一樣,每一面的世界坐標系的法向量不可能一樣。所以有的面算光強度的時候就會失敗!
再舉個例子,我們把世界坐標系中物體的表面法向量不指向 z 軸附近,指向 y 軸附近。其他的不變,從貼圖中得到的法向量還是指向 z 軸附近的。所以光照強度肯定還是錯的!

所以我們需要計算出一種矩陣,把法線從切線空間變換到一個不同的空間,這樣在切線空間的法線就能和表面法線方向?qū)R了
一個神奇的矩陣


我們要計算的矩陣叫做「TBN 矩陣」。T B N 分別代表 Tangent(切線)、Bitangent(副切線) Normal(法向量)
下面敘述推導過程
- 首先 N 是表面法向量
用差值算(用比例算)
- 看上圖 T、B 的方向和紋理方向一致。

看上圖可以寫出,
可以寫出
寫出
最后得到
算出 [T, B] 后記得要正則化噢,加上表面法向量 N
還沒完

哈哈,我騙你的啦。一切都結(jié)束了。最后你只要記得,在切線空間里得到的法向量乘以這個矩陣,就得到世界坐標系中的法向量啦

