天天看點

Shader山下(二十八) 切空間以下摘錄自《Unity 3D ShaderLab開發實戰詳解》,18.1。以下轉載自知乎為什麼要有切線空間(Tangent Space),它的作用是什麼?

以下摘錄自《Unity 3D ShaderLab開發實戰詳解》,18.1。

如果要了解法線貼圖的用法,就要知道Tangent Space,即切空間。什麼是切空間?想象一下這樣一個假設的情形:“2013年2月14日,上帝創造完世界之後,沒錯,他剛剛把世界造好,然後他讓全世界70億人民全體力争,昂首挺胸,雙腳着地,頭朝上,面朝南,報告一下此時太陽的方位。”我可以肯定地告訴各位讀者,會有70億個不同的答案。因為每個人都是以自己為原點,以從腳到腦袋指向天空的方向為z軸,以正前方為x軸,右手為y軸。所謂的切線空間就是一個法線Normal(從腳到頭的方向)、Tangent切方向(雙眼直視正前方)和Binormal(水準擡起你的右胳膊)這3個矢量構造了一個空間,然然後把這3個方向矢量,也就是目前像素位置的Tangent、Binormal、Normal表示為一個矩陣,那麼就是一個和_World2Object類似的矩陣,乘以它就會得到某一個向量在目前位置切空間的表示,具體來說就是太陽對于目前這個人來說的角度。這個時候,如果你在目前位置挖個坑,這坑的Normal也就是從BumpMap讀取到的Normal,此時你可以放心地用目前太陽方位來進行計算,不用擔心有人提醒你太陽的角度不對。記住,以你自己為中心所觀察到的世界就是切空間。

以下轉載自知乎為什麼要有切線空間(Tangent Space),它的作用是什麼?

1 .什麼是切線空間?

Tangent Space,其實一個坐标系,也就是原點+三個坐标軸決定的一個相對空間,我們隻要搞清楚原點和三個坐标軸是什麼就可以了。在Tangent Space中,坐标原點就是頂點的位置,其中z軸是該頂點本身的法線方向(N)。另外兩個坐标軸就是和該點相切的兩條切線。這樣的切線本來有無數條,但模型一般會給定該頂點的一個tangent,這個tangent方向一般是使用和紋理坐标方向相同的那條tangent(T)。而另一個坐标軸的方向(B)就可以通過normal和tangent的叉乘得到。

Shader山下(二十八) 切空間以下摘錄自《Unity 3D ShaderLab開發實戰詳解》,18.1。以下轉載自知乎為什麼要有切線空間(Tangent Space),它的作用是什麼?
Shader山下(二十八) 切空間以下摘錄自《Unity 3D ShaderLab開發實戰詳解》,18.1。以下轉載自知乎為什麼要有切線空間(Tangent Space),它的作用是什麼?
Shader山下(二十八) 切空間以下摘錄自《Unity 3D ShaderLab開發實戰詳解》,18.1。以下轉載自知乎為什麼要有切線空間(Tangent Space),它的作用是什麼?
Shader山下(二十八) 切空間以下摘錄自《Unity 3D ShaderLab開發實戰詳解》,18.1。以下轉載自知乎為什麼要有切線空間(Tangent Space),它的作用是什麼?

通常我們所見的法線紋理還是基于原法線資訊建構的坐标系來建構出來的。那種偏藍色的法線紋理其實就是存儲了在每個頂點各自的Tangent Space中,法線的擾動方向。也就是說,如果一個頂點的法線方向不變,那麼在它的Tangent Space中,新的normal值就是z軸方向,也就是說值為(0, 0, 1)。但這并不是法線紋理中存儲的最終值,因為一個向量每個次元的取值範圍在(-1, 1),而紋理每個通道的值範圍在(0, 1),是以我們需要做一個映射,即pixel = (normal + 1) / 2。這樣,之前的法線值(0, 0, 1)實際上對應了法線紋理中RGB的值為(0.5, 0.5, 1),而這個顔色也就是法線紋理中那大片的藍色。這些藍色實際上說明頂點的大部分法線是和模型本身法線一樣的,不需要改變。總結一下就是,法線紋理的RGB通道存儲了在每個頂點各自的Tangent Space中的法線方向的映射值。

2.為什麼要有切線空間

實際上,法線本身存儲在哪個坐标系中都是可以的,例如存儲在World Space、或者Object Space、或者Tangent Space中。但問題是,我們并不是單純的想要得到法線,後續的光照計算才是我們的目的。不管使用哪個坐标系,都面臨着一個選擇,就是最後光照計算使用的坐标系究竟是哪個。對于Tangent-Space Normal Map,我們一般就是在Tangent Space裡計算的,也就是說,我們需要把viewDir、lightDir在Vertex Shader中轉換到Tangent Space中,然後在Fragment Shader對法線紋理采樣後,直接進行光照計算。 Tangent-Space還有如下一些優點:自由度很高。Tangent-Space Normal Map記錄的是相對法線資訊,這意味着,即便把該紋理應用到一個完全不同的網格上,也可以得到一個合理的結果。可進行UV動畫。比如,我們可以移動一個紋理的UV坐标來實作一個凹凸移動的效果,這種UV動畫在水或者火山熔岩這種類型的物體會會用到。可以重用Normal Map。比如,一個磚塊,我們可以僅使用一張Normal Map就可以用到所有的六個面上。可壓縮。由于Tangent-Space Normal Map中法線的Z方向總是正方向的,是以我們可以僅存儲XY方向,而推導得到Z方向。

作者:潘友成

連結:https://www.zhihu.com/question/23706933/answer/161968056

來源:知乎

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

轉注:binormal=cross(normal, tangent) * tangent.w

切空間矩陣(從對象空間到切線空間)matrix=[tangent.xyz, binormal, normal]