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