法線比較難用簡單幾句話說清楚,從制作法線貼圖到在著色器里面如何使用都有了嚴格的標準。本文會涉及到一部分圖形學(xué)的內(nèi)容,但不會深入展開。比如TBN(Tangent Binormal Normal)矩陣。而是用更為通俗易懂的語言去闡述法線貼圖的原理以及工作方式,側(cè)重于美術(shù)從業(yè)者閱讀。其中使用了的書籍以及博客等作為參考會在文章末尾列出。
1、引言
人之所以能分辨立體與平面是基于光影(明暗關(guān)系)。學(xué)習(xí)美術(shù)的同學(xué)都知道素描的基礎(chǔ),物體的三大面五大調(diào)。物體受光后三大明暗區(qū)域:亮面、灰面和暗面。五個調(diào)子是指:亮色調(diào)、灰色調(diào)、明暗交接線、反光、投影。那么電腦繪制的過程也是一樣的。那么基于這個理論我們就可以通過在貼圖上做一些明暗變化去模擬一種假的立體效果。
在計算機圖形學(xué)的發(fā)展過程中,三維建模軟件開始支持高模多邊形網(wǎng)格。而游戲引擎中和我們玩的游戲設(shè)備不能支持高模,這就是引入法線貼圖技術(shù)的原因。在這項技術(shù)中,我們讀取高模的法線基于頂點的紋理坐標,然后將其烘焙到2D法線紋理上。然后把法線貼圖用于低多邊形網(wǎng)格以模擬照明,在游戲中它看起來像一個高模。所以如果場景中沒有燈光,我們的法線貼圖就無法正常顯示。
2、什么是法線
在2D空間中一個曲面可以是平面,對于一個平面來說法線是一條垂直于平面的線或者表示這個曲面的方向。也就是垂直于這個表面的線,代表了平面的方向也就是平面的法線。對于曲面,法線將是一條垂直于曲面切線的直線。所以定義法線是垂直于曲面切線接觸點的直線。
那么在3D空間中,如果曲面是平直的,那么法線就垂直于該平面的方向,所以這個垂直于平面的線或垂直方向就變成了法線。曲面是彎曲的,法線將是在某個點上與曲面相切平面垂直方向的直線。那么這和2D曲面上一樣會在曲面上選擇一個點,然后畫個切面代替切線,這個平面剛好接觸到曲面上的點,這就是我們的切面。然后一條代表方向的垂直線就變成了法線。
3、法線貼圖原理
法線貼圖是使用深度或表面變形為模型添加凹凸(立體)的效果,但不會讓網(wǎng)格產(chǎn)生真實的變形。是一個2D圖像紋理,它可以改變光線對網(wǎng)格的影響。
物體表面產(chǎn)生明暗變化的直接原因就是光線照射角度的不同,而法線就是模擬出高面數(shù)模型的光照信息。而光照信息最重要的就是光入射方向與入射點的法線夾角。法線就是記錄了這個夾角的相關(guān)信息。
4、法線貼圖儲存
法線貼圖使用RGB通道來儲存信息。一個單一的白色像素由RGB三個不同的通道組成,也就是原色相加。每個顏色通道的取值范圍在0到1之間(8位顏色的值是0到255)。
但重要的不是法線貼圖是什么顏色。而是了解存儲在紅綠藍通道中的數(shù)據(jù)是怎樣的。所以重點是法線貼圖并不是由顏色組成的貼圖,而是由三個黑白數(shù)值貼圖,通過通道合成的法線貼圖。他們的作用在于用黑白的數(shù)值來控制光線的反射角度。
法線是一個方向,我們需要三個不同的變量來讀取三維空間中的方向,也就是XYZ。比如我們在XYZ三個軸上都移動一個單位。如果我們繪制出新的向量,我們就有了一個三維的向量坐標。當然我們可以有很多不同的值。不同的值對應(yīng)了向量中不同的點。
法線貼圖的RGB通道可以包含X、Y、Z通道的向量數(shù)據(jù)。紅通道控制光線的左右方向X軸,綠通道控制光線的上下方向Y軸。藍通道模擬模型的深淺Z軸。我們把向量數(shù)據(jù)值存儲在像素的RGB顏色通道上。所以法線貼圖表達的是一種方向信息,只存放方向數(shù)據(jù)。光線可以通過它表面的方向進行計算。
向量
向量(也稱矢量)是指具有大?。╩agnitude)和方向的量。在游戲中3D向量既可以表示一個方向,也可以表示一個點。
5、三個空間坐標系
坐標系有很多種,一般在使用法線貼圖的時候會有幾個選項,最常用的就是切線空間法線和模型空間法線,當然還有一個比較少用到的世界空間法線。這三個又可以被理解為世界空間坐標系,模型空間坐標系和切線空間坐標系。
模型空間法線
模型空間保存的是模型空間坐標系中的高模方向。模型空間是模型的局部3D空間。向上總是向上,向左總是向左。模型可以被旋轉(zhuǎn)和位移,但模型不能有變形。
世界空間法線
世界空間保存的是世界坐標系中的高模法線方向。因此低模取出該點法線就可以直接使用,前提是低模的世界坐標系與高模一致,不能有旋轉(zhuǎn)這樣會導(dǎo)致法線方向改變。
切線空間法線
在一個不同的坐標空間中進行光照,法線貼圖向量總是指向這個坐標空間的正Z軸方向,所有的光照向量都相對于這個正Z軸方向進行變換,而不管最終變換的方向如何。這樣我們就能始終使用同樣的法線貼圖。
6、烘焙法線概念
基本上來說法線烘焙的好與壞最主要需要考慮三個大的方面。
軟硬邊(平滑組)
從上面的內(nèi)容可以知道,軟件基本上是使用的點法線。比如相鄰的兩個點共用了一個法線,通過算法就會變成軟邊的效果。如果法線沒有互相共用,單獨的點都有單獨的法線。這樣就會有多根法線,就會變成硬邊的效果。
左側(cè)的圖像是具有硬邊的模型。這將導(dǎo)致一些嚴重的問題,可以在黃色和藍色星星上看到。藍色區(qū)域計算兩次常規(guī)細節(jié),黃色區(qū)域根本不計算。右側(cè)的圖像是一個具有平滑法線的模型。這將允許在烘焙法線貼圖時更接近細節(jié)。所以調(diào)整低模的軟硬邊會改變烘焙的結(jié)果。
UV
盡可能把UV的排列方式做到橫平豎直,尤其是在烘焙分辨率比較低的法線貼圖時,可能會有鋸齒。一般來說可以倒角解決。但如果能從源頭規(guī)避掉潛在的問題肯定更好。
同時硬邊需要斷開分離,我們知道法線貼圖表達方向是一種方向信息。兩個不同方向的信息相交重疊到了一個點上,就會出現(xiàn)法線貼圖有一到縫。如果我們把硬邊模型的低模邊緣分離的話,通過隔開一定距離(edge padding)就可以解決這個問題。簡單來說就是給兩個uv shell更多的像素。
Cage
Cage的功能就是把作用于cage上使用的平均法線把高模的信息去映射到低模上使用的正常法線??梢钥吹饺绻褂密涍吅姹悍ň€方向是會根據(jù)模型的大小發(fā)生變化,也就意味著烘焙是基于法線方向的,結(jié)果也會發(fā)生變化。而用作cage的平均法線方向沒有發(fā)生變化。因為平均法線是根據(jù)兩個面之間的角度去計算。