1. 程式人生 > 其它 >凹凸對映和法線紋理

凹凸對映和法線紋理

凹凸對映

凹凸對映就是通過一些特殊的紋理來增加資訊量,通過這些附加資訊來修改模型表面的法線

有兩種實現方法:

  • 高度紋理
  • 法線紋理

法線紋理

法線紋理直接儲存了表面法線,本質就是將法線轉換成了顏色儲存了起來,算是一種資料可視化了

值得注意的是法線紋理中的法線和模型中法線一點關係都沒有,就如球體的法線都是過球心向外的射線,而法線紋理可以由你自己決定(因為是額外的調整資訊)


法線的 xyz分量都在 [-1,1] 之間,而畫素的(顏色)分量在 [0,1] 之間

所以儲存時需要簡單的對映

\[pixel=\frac{normal+1}{2} \]

從法線紋理讀取資料後,逆對映獲取法線

\[nomal = 2*pixel-1 \]

法線紋理分為兩種:模型空間下的法線紋理、切線空間下的法線紋理

模型空間下的法線紋理
模型空間下的法線紋理五顏六色,所有法線共用一個模型座標系,朝各個方向的法線都有,對映後顏色差異極大

對映後顏色差異極大

切線空間下的法線紋理

切線空間是對每個頂點來說的
座標原點是頂點本身,z 軸是頂點本身(即模型)的法線方向,x 軸是頂點的切線方向,y 軸(又叫副切線)可由其他兩軸叉積出來,副切線的方向由切線的w分量決定

如果頂點沒有凹凸效果,即當前頂點在切線空間中的法線就是 z 軸本身(0, 0, 1),對映後的為RGB(0.5, 0.5, 1) 淺藍色
由於凹凸效果一般只要對原法線做微小的變化,所以切線空間下的法線紋理一般都有大面積的藍色,如下圖:

大面積藍色

兩種法線紋理的優缺點

模型空間:更直觀,突變較少,不可壓縮
切線空間:可壓縮(z可由xy推導),

一般使用切線空間下的法線紋理

切線空間下對切線空間的法線紋理的使用

模型空間到切線空間的轉換
將光源方向和視角方向轉換至切線空間計算

\[假設切線空間下的向量座標(a,b,c,0)\\ 即ax_t+by_t+cz_t\\ 每個軸由模型空間下的xyz定義的\\ a( Model_{tangent}.xyz)+b( Model_{binormal}.xyz)+c( Model_{normal}.xyz)\\ (x_0,y_0,z_0)=(a+b+c)x+(a+b+c).y+(a+b+c).z\\ 從切線空間到模型空間的矩陣 \left[ \begin{matrix} |&|&|\\tangent.xyz&binormal.xyz&normal.xyz\\|&|&|\\ \end{matrix} \right] \]\[模型空間到切線空間的矩陣就是上面的逆矩陣\\ \left[ \begin{matrix} ——tengent.xyz——\\——binormal.xyz——\\——normal.xyz——\\ \end{matrix} \right] \]

推導 z 值


由於法線都是單位向量,利用三維的勾股定理可求出 z

舉個例子 假設讀取到上面的RGB(0.5, 0.5 ,1)

如果有壓縮就是不儲存 z,即讀取到(0.5, 0.5)

\[先逆對映 \\ normal=pixel*2-1=(0, 0) \\ //x^2+y^2=(x, y)·(x,y)\\ z=sqrt(1.0-dot(normal.xy, normal.xy))=1.0\\ normal(0,0,1.0) \]

到這裡就已經獲取了切線空間下所有光照計算有關的矢量了