前言:我好像弄懂了一點(diǎn)點(diǎn),把這個再梳理一遍
一切都要從 Shader 說起
Shader 分為「頂點(diǎn)渲染器」和「片段渲染器」
- 「頂點(diǎn)渲染器」
「頂點(diǎn)渲染器」保存三角形的三個頂點(diǎn)的 u v 值捕儒,給后續(xù)片段渲染器提供數(shù)據(jù)冰啃。但是返回 值邓夕。
- 「片段渲染器」
在調(diào)用「片段渲染器」之前,遍歷屬于三角形的最大矩形阎毅,用重心法算出比例焚刚。傳遞給「片段渲染器」,「片段渲染器」拿到這個比例以后就可以算出屬于這個點(diǎn)的 u扇调、v 值矿咕。通過 u、v 值從 diffuse 貼圖中拿到顏色狼钮。
用圖解就是這樣
這就是不考慮光照的紋理貼圖
法線貼圖
當(dāng)然通過 用插值的方法可以計(jì)算任一點(diǎn)的法線碳柱。
但是我們可以存儲法線,像 diffuse 貼圖那樣通過 uv 訪問熬芜。
我們?yōu)槭裁葱枰ň€貼圖莲镣?
通過法線,我們可以計(jì)算該點(diǎn)的光照強(qiáng)度涎拉。使紋理感更強(qiáng)瑞侮。
法線貼圖的制作
可以看我這篇文章如何產(chǎn)生法線貼圖
(我是翻譯國外大神的,但是國外大神有點(diǎn)爛尾鼓拧,有關(guān)鍵問題沒有解決)
只要知道
-
是可以從普通 「texture」貼圖中計(jì)算法向量的半火。但是還有很多其他的辦法
這樣的法線定義在切線空間中
還沒完
這樣的法線貼圖毁枯,有一個問題
舉個例子慈缔,有一個正方體,每一面都貼相同的圖种玛,而由相同的圖來說藐鹤,法向量永遠(yuǎn)一樣。但是由于在空間中位置的不一樣赂韵,每一面的世界坐標(biāo)系的法向量不可能一樣娱节。所以有的面算光強(qiáng)度的時候就會失敗祭示!
再舉個例子肄满,我們把世界坐標(biāo)系中物體的表面法向量不指向 z 軸附近,指向 y 軸附近质涛。其他的不變稠歉,從貼圖中得到的法向量還是指向 z 軸附近的。所以光照強(qiáng)度肯定還是錯的汇陆!
所以我們需要計(jì)算出一種矩陣怒炸,把法線從切線空間變換到一個不同的空間,這樣在切線空間的法線就能和表面法線方向?qū)R了
一個神奇的矩陣
我們要計(jì)算的矩陣叫做「TBN 矩陣」毡代。T B N 分別代表 Tangent(切線)阅羹、Bitangent(副切線) Normal(法向量)
下面敘述推導(dǎo)過程
- 首先 N 是表面法向量
用差值算(用比例算)
- 看上圖 T勺疼、B 的方向和紋理方向一致。
看上圖可以寫出捏鱼,
可以寫出
寫出
最后得到
算出 [T, B] 后記得要正則化噢执庐,加上表面法向量 N
還沒完
哈哈,我騙你的啦导梆。一切都結(jié)束了轨淌。最后你只要記得,在切線空間里得到的法向量乘以這個矩陣问潭,就得到世界坐標(biāo)系中的法向量啦