為什麼要有切線空間(Tangent Space),它的作用是什麼?

時間 2021-05-12 15:13:46

1樓:飛飛

一、什麼是法線貼圖?

顧名思義,法線貼圖就是儲存了3D模型表面法線的貼圖,主要用途是為了讓3D模型在接收光照時顯得更加真實。例如下圖演示的是同乙個3D模型在Unity中有法線貼圖和無法線貼圖所接收到的光照渲染對比,左右兩邊分別對應的是無法線貼圖和有法線貼圖的效果,很明顯有法線貼圖的黑叔叔臉部細節更豐富、刀疤更清晰,脖子上的肌肉細條相對於左圖也要更清晰和立體一些。

法線貼圖對比

二.什麼是切線空間?

物件空間法線貼圖與切線空間法線貼圖

其實,切線空間中的法線貼圖特徵比較明顯,顏色比較單調,整體偏藍色。為什麼呢?因為法線貼圖中任意一點的顏色通道的b值都大於0.

5。為什麼?在回答這個問題之前,我們先來了解一下什麼是切線空間,切線空間可以理解為對於在3D模型表面上的任意乙個點,在該點切平面上選取兩條相互垂直的座標軸以及切平面的法線所組成的座標系。

我們來舉個簡單的例子,假設地球是乙個巨大的3D球模型,對於地球的任意一點P我們選擇該點的由南向北方向為x座標軸(T),由西向東方向為y座標軸(B),地心與該點的連線方向為z座標軸(N),這樣的座標系稱為該點的切線空間。

可以看到,切線空間中任意一點的法線與N座標軸的夾角小於90度,也就是說法線的z值大於0。在歸一化之後,法線的x和y取值範圍為[-1,1],而z的取值範圍為[0,1]。通常情況下我們儲存在貼圖中的值為正,一般通過乙個簡單的變換 來完成,經過該變換後,z的取值範圍變為[0.

5,1],所以切線空間下的法線貼圖整體偏藍。

三、切線空間有什麼優缺點?

上一節中提過,物件空間中的法線和3D模型的頂點在乙個空間,因此我們把這樣的法線貼圖應用到3D模型的另外乙個部分或者另外乙個3D模型上,解析出來的法線值可能就不對了,而切線空間中的法線與紋理座標在同一空間,也就說只要我們同時將漫反射等紋理貼圖和法線貼圖同時應用到另乙個模型上,法線貼圖中的值經過變換後依然是正確的。如下圖[2]

切線空間中的法線貼圖與物件空間的法線貼圖光照對比

左圖是切線空間中的法線貼圖計算出來的光照,地板和牆的光照都是正確的。而右圖的法線貼圖在牆的物件空間中,地板在復用了牆的法線貼圖後,計算出來的光照是錯誤的。

那麼切線空間中的法線貼圖有什麼缺點呢?

由於在計算光照時需要統一法線和光照方向所在的空間,我們需要將切線空間的法線變換到燈光的空間(世界空間或者物件空間)或者將燈光從其所在的空間變換到切線空間,而空間變換需要計算額外的旋轉矩陣TBN,一般情況下我們在vertex shader中計算TBN,再將燈光變換到切線空間,之後再將相關資訊傳遞到fragment shader中,這樣相對於物件空間中的法線貼圖來說,在vertex shader中增加了額外矩陣運算,另外經過變換後每個象素的光照資訊也變得不同,需要將這部分資訊傳遞到fragment shader中。

四、法線貼圖如何生成?

方法一,通過高度圖生成,原理比較簡單,對紋理中的任意一點求出u、v方向上的高度向量,叉乘後即可得到法線向量,例如下圖[3],左邊是高度圖,右邊是根據高度生成的法線貼圖。

方法二,在maya等3D建模軟體建立高精度模型,新增更豐富的細節然後再將法線貼圖烘焙匯出。

最後乙個問題:

3.轉換到Tangent space時,[n.x,n.y,n.z] [T, B ,N] 與 [n.x,n.y,n.z] [B, T ,N] 有什麼區別?

TBN其實只是乙個約定,一般在生成切線空間的中法線貼圖時以u方向為T,v方向為B。我們在渲染時,會根據生成法線的演算法建立TBN矩陣。如果在生成時[n.

x,n.y,n.z]對應的是 [T, B ,N],那麼我們在建的就是TBN矩陣,反之如果 [n.

x,n.y,n.z] 對應的是[B, T ,N] 那麼建立的就是BTN矩陣。

2樓:冬瓜哥已被Jin言

由於需要將同乙份法線紋理貼到不同模型的表面,或者同乙個模型中不同角度的表面,那麼當初生成這份法線紋理時所使用的面元角度(所謂模型local座標系),就無法適用在其他角度的面元上。所以,人們不記錄當時用模型座標系生成的法線,而使用z軸與該點所在面元的法線平行的乙個虛擬的相對座標系來記錄該點法線在該座標系中的x/y/z的值,相當於記錄了該點法線與所在平面法線之間的相對關係,而不是記錄絕對座標。由於點的法向量基本不會偏移面法向量太多,也就是凹凸程度一般不會太誇張,所以最終的法向量值中,z的值總是比x和y的大一些,用(法向量值+1)/2轉換為RGB後,就成了藍色為主的色調了。

經過這樣記錄下來的法向量,貼到哪個模型表面,就按照當前表面的法向量,計算出該點法向量在世界座標空間中的值,然後計算光照就可以了。

但是有個問題,看下圖,豎軸同樣是面法向量,但是有多種不同的x和y軸組合,每種組合生成的點法向量是不一致的,所以需要規定一套固定的x和y軸,大家遵守同樣的規則。怎麼規定呢?就用紋理的uv座標來定。

具體做法是,取該點所在的三角形的三個頂點P1.P2.P3的紋理U和V座標,然後x軸的方向就是P3指向P1,又稱T軸;y軸方向是P3指向P2,又稱B軸。

(完)

3樓:寒山船客

使用法線貼圖是因為在低模下想獲得高模凹凸表面光照效果。

因為基於模型座標系的法線貼圖,在換到不同的模型下時候法線貼圖不能復用。故引入切線空間讓法線貼圖可以在相同網格形狀模型(或許是子模型)但不同模型座標系的多個模型間可以共享法線貼圖

1)低模切線空間求取:

假設:dp是網格上某三角形的兩頂點點之間的空間為位置差向量,du是兩點對應的uv座標系下的u座標差向量。

則切線空間下的TBN座標軸:

T tangent=dp/du =dp. du= |dp|cos thetadu是dp在du上的對映向量,該對映向量可以通過上述三角形三個頂點和三個uv紋理座標系求得。

N直接取得低模三角形下的頂點N法向量值。

B binormal = T * N。

2)高模在低模切線空間下進行法線向量的求取, 且烘培到法線貼圖中:Nvalue' = Nvalue * (TBN^-1), Nvalue基於高模模型座標系的法線向量,TBN是高模子三角形對應的低模大三角形的TBN切線空間,TBN^-1是該切線空間的逆矩陣用於從模型空間變換到切線空間。因此Nvalue'是法線貼圖記錄的是高模的上計算得到的在低模切線空間下的法線值,一般情況下高模不夠畫素級別因此還要進行插值處理。

如果存在切線貼圖,則儲存的是上述計算得到的低模三角形下的切線向量值,低模的乙個三角形內的所有畫素點應該是相同的T切線向量值。

3)shader在低模切線空間中應用高模烘培的法線貼圖進行實時光照計算:

在Vertex shader中將光線向量和視野向量轉換到模型座標系下,再轉換到當前渲染的低模切線座標系下(T來自tangent資訊(現代硬體可來自渲染管線,也可以來自切線貼圖),N是當前渲染的低模頂點的法向量,B=T*N)。在Fragment Shader中得到切線空間下的入射光線向量,觀察向量,從烘培的法線貼圖得到的法線向量進行光照計算即可。

4樓:Richard Pan

1 .什麼是切線空間?

Tangent Space,其實乙個座標系,也就是原點+三個座標軸決定的乙個相對空間,我們只要搞清楚原點和三個座標軸是什麼就可以了。在Tangent Space中,座標原點就是頂點的位置,其中z軸是該頂點本身的法線方向(N)。另外兩個座標軸就是和該點相切的兩條切線。

這樣的切線本來有無數條,但模型一般會給定該頂點的乙個tangent,這個tangent方向一般是使用和紋理座標方向相同的那條tangent(T)。而另乙個座標軸的方向(B)就可以通過normal和tangent的叉乘得到。

通常我們所見的法線紋理還是基於原法線資訊構建的座標系來構建出來的。那種偏藍色的法線紋理其實就是儲存了在每個頂點各自的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 Normal Map記錄的是相對法線資訊,這意味著,即便把該紋理應用到乙個完全不同的網格上,也可以得到乙個合理的結果。

可進行UV動畫。比如,我們可以移動乙個紋理的UV座標來實現乙個凹凸移動的效果,這種UV動畫在水或者火山熔岩這種型別的物體會會用到。

可以重用Normal Map。比如,乙個磚塊,我們可以僅使用一張Normal Map就可以用到所有的六個面上。

可壓縮。由於Tangent-Space Normal Map中法線的Z方向總是正方向的,因此我們可以僅儲存XY方向,而推導得到Z方向。

Int為什麼大於t 1,以切線放縮來看?

努力做個槓精 首先弄清楚,是lnt t 1 下面用構造新函式證明 令f t lnt,g t t 1 h t f g lnt t 1 h t 1 t 1 h t 在 0,1 單增,1,單減 h t h 1 0 即f t g t 即lnt t 1成立 首先,不是 t 1 eeimg 1 是 當且僅當 取...

為什麼要有jupyter notebook的存在呢

高浩然 python是一門解釋語言,不需要編譯,可以逐條執行啊,不然就和C 一樣是編譯語言了。在PyCharm中,這個良好的特性被完全忽略掉了。逐條執行有什麼用呢?Debug非常非常非常方便。在出現之前的所有資料都在記憶體裡哦,在大多數情況下不需要重跑哦!只要別手賤把變數覆蓋了 把當前cell改了就...

為什麼要有監獄?

從不超速 監獄是用來懲治違法者的國家機器也是限制犯人人身自由的場所。在中國,如果沒有監獄,也就沒有辦法實施徒刑 拘役這類限制人身自由的刑罰。另外,一次性處理犯人,怎麼處理?堆到一起去嗎?那絕對會管理不便,而且得要多大的場所來安放所有的犯人?再說,犯人進監獄還需要自費?那犯人家貧支付不起是不是就不用進...