在學習法線貼圖紋理的時候無法避免的遇到了切線空間的學習和理解的問題,在此記錄下自己理解的過程。
法線紋理的目的和存在的意義:
是在底模上表現出高模的各種凹凸細節,而為什麼要表現凹凸細節呢,很簡單,就是為了光照計算,模擬出高模的凹凸細節,光照的時候可以更加接近現實的質感。
如果直接在專案中使用高模的話就不存在這個法線紋理貼圖的問題了,因為高模本身的細節足夠細緻,光照只需要按照模型本身的法線來計算就可以了。但是這樣對效能影響很大,幾乎99%以上的專案都需要將高模輸出底模在執行時使用。
法線貼圖的兩種型別:
模型空間下的法線紋理
實現簡單
紋理座標的縫合處和尖銳的邊角處突變縫隙比較少,更加平滑
只能對於指定的模型進行貼圖,沒法很好的重用,因為法線資訊是以絕對的方式被記錄的,而且模型還不能隨意變形。
切線空間下的法線紋理以下是優缺點列表:
自由度高
可以進行uv動畫
可以重用
可以被壓縮
紋理座標的縫合處和尖銳的邊角處突變縫隙比較多,不夠平滑,但是這個誤差一般都在人眼可接受的範圍內
切線空間
以上綜述很容易得出乙個結論,就是切線空間下的法線貼圖比較常用和好用。但是不易於理解,因為他涉及到乙個座標變換問題。
理解的難點在於以下幾點:
首先要理解,切線空間是每個點都有各自的切線空間,而被記錄的法線在切線空間下表現為法線的擾動。
什麼是法線的擾動呢?
乙個模型是由很多個面組成的,而在這些面在高模的細節當中會出現凹凸起伏,但是在底模當中這些凹凸細節是被忽略的。改由法線貼圖記錄的切線空間的法線資訊來替代這些凹凸資訊被記錄。
在unity中或者是cg中,規定紋理座標的方向u和v作為切線和副切線的方向。
其擾動後的在切線空間中的座標(x, y, z),其中x是u方向上的偏移,y是v方向上的偏移,z則是法線方向上的偏移。
將其作為顏色儲存在法線貼圖中。由於歸一化之後的法線座標,各分量範圍在[-1, 1]之間,而顏色範圍在[0, 1]之間。對其做(x+1)/2的對映計算,使其值滿足顏色範圍。
由於是偏移量,因此當表面凹凸沒有變化時,法線為原法線方向(x y z) = (0, 0, 1)。對映到顏色之後為(0.5, 0.5, 1.0)。這也是為什麼法線貼圖大部分是偏淺藍色的原因。
大家看到的那些非藍色的部分恰恰就是凹凸部分的區域,由於凹凸發生了擾動。
需要注意的是,在使用切線空間下的法線紋理時,需要針對切線空間來做座標換算,使得切線空間和世界空間做轉換獲得正確的光照結果。
Unity Shader切線空間
在使用凹凸紋理時我們經常會用到乙個叫切線空間的東西。而這個切線空間裡有三個引數,頂點法線 normal 頂點次法線 binormal 和頂點切線 tangent 這三個引數有什麼意思,是如何得來的呢?我們來詳細講下。假設有乙個三角形平面abc,a點的切線空間就如圖 t,n,b兩兩正交 注 a點座標p...
3D中的切線空間簡介
1 什麼是tangent space?tangent space和world space,view space其實是同樣的概念,均是代表三維座標系。在這個座標系中,x軸對應紋理座標的u方向,沿著該軸紋理座標u線性增大。y軸對應紋理座標的v方向,沿著該軸紋理座標v線性增大。z軸則是uxv,垂直於紋理平...
3D中的切線空間簡介
1 什麼是tangent space?tangent space和world space,view space其實是同樣的概念,均是代表三維座標系。在這個座標系中,x軸對應紋理座標的u方向,沿著該軸紋理座標u線性增大。y軸對應紋理座標的v方向,沿著該軸紋理座標v線性增大。z軸則是uxv,垂直於紋理平...