置換貼圖,法線貼圖,凹凸貼圖的區別

來源:互聯網
上載者:User

先自我介紹……你要是說這是自我炒作我也認了。首先說明,FXCarl是一個對3D美術一竅不同的傢伙。雖然很想往技術美工方向發展了。因為是學程式出身,眼下能做的也就是寫寫Shaders。等到手上的項目做完,會公開始用的即時光照模型……不過那是後話了。現在只是想配合一下這兩天大家討論的熱火朝天的Normal Map,在這裡和佔大多數的美術人員從另外一個角度來談談“凹凸貼圖技術”

首先我想說,對於凹凸貼圖在電腦圖形領域中的研究,最早開始於70年代末,至今已經有接近30年歷史了。Normal Map只是一種目前很流行的凹凸貼圖技術,而這裡將會介紹一些目前遊戲和在XBOX360和PlayStation3這種新世代主機上將會運用的凹凸貼圖技術。

1.Bump Mapping

做過CG的朋友一定比FXCarl還要更早的認識Bump Map。這種貼圖是一種灰階圖,用表面上灰階的變化來描述目標表面的凹凸,因此這種貼圖是黑白的,如果節省空間的畫,甚至可以把貼圖的Alpha通道徵用來用作Bump。值得注意的是,這種貼圖表面上儲存的東西是高度域--即每個點和原始表面的高度差,記住,每個點的顏色不是色彩,是高度,一個數值!因此,對這個貼圖做任何的操作都會影響到這個物體3D的外觀質感。不能憑感覺用事。

在遊戲中,所使用的演算法確切的說應該叫做fake bump mapping ,假凹凸貼圖。因為在遊戲中Bump Map並沒有改變物體的表面而只是影響光照的結果,欺騙眼睛而已。最簡單的做法是,直接把Bump Map疊加在已經渲染好的表面上,造成亮度上的擾動,從而讓人以為是凹凸的--這個很容易理解,把一面白色的牆面有技巧的部分劃成灰色就會變成蝕痕,這些諸位會比小的更擅長。而計算複雜度是基本加減法。這個所謂的 Fake Bump Mapping 從Geforce2就開始硬體支援,但是從來沒有大範圍的應用過。

不過有趣的是,Bump Map這個東西卻從未過時,在後來的渲染演算法中,其儲存表面高度域的特性仍然發揮著巨大的作用。我們後文再提Normal Mapping.


2.Normal Mapping

Normal Mapping在遊戲領域中的實踐是一個非常值得記住的時期--Geforce3上市,GPU概念出現,硬體可程式化流水線的出現(Shaders),Normal Mapping是一種凹凸貼圖技術,它的另外一個名字叫做Dot3 bump mapping。

用於實現它的控制紋理是一張叫做Normal Map的紋理,也是目前大家在討論如何製作的那種。我們先說說這張叫做Normal Map的圖。這張圖中儲存的東西是每個原始表面法線的迭代,說起來有點複雜,但是不難理解。舉例說我們的說面,一般在遊戲的3D模型上,表面法線就像是一根站立於案頭的鋼筆,垂直向上。而Normal Map中儲存的東西就是我們這支表示表面法線方向的鋼筆所“應該”指向的方向--比如說朝左邊傾斜15度。

Normal Map有兩種主要形式,一種叫做世界空間的Normal Map,一種叫做切空間的Normal Map。第一種在遊戲中沒有實用價值,我們說第二種,也就是大家最常見的一種。

那麼,為什麼我們看到的Normal Map會有這麼奇怪的顏色呢?其實Normal Map和Bump Map一樣,即它顯示出來的顏色和它所起的作用是沒有直接聯絡的。大家一定對空間座標的概念非常熟悉了。在Normal Map的定義中,有一個事先的約定,這個約定就是--原本表面的垂直方向,我們稱為Z軸;而表面的UV座標兩個方向,分別對應X軸和Y軸。(確切的說,應該是稱作切線和負法線,但是這兩個東西和大家熟悉的UV座標剛好重疊,所以就用大家更習慣的說法了)然後我們知道如果我們在XYZ軸上各取一個點,這個點的取值位置在-1到1之間,那麼我們就可以得到一個指向任何方向的法線方向(不用多解釋,大家知道法線是一個向量,向量有方向和長度兩個概念,但是對法線來說,長度是不需要的)。但是,請大家注意,我們在描述色彩的時候,RGB三個通道的取值範圍都是從零開始的。可是當我們嘗試把一個任意的法線儲存在一張紋理中的時候,會面臨取負值的問題。因此我們要把法線做壓縮。方法很簡單,把XYZ每個軸上的法線投影長度進行N+1/2的運算。這樣就把所有的法線壓縮到了0和1的範圍裡。然後我們把XYZ的方向分別儲存在RGB三個通道中。似乎我們還沒有說到關於為什麼Normal
Map會是藍兮兮的原因是吧。那麼現在就是公布結果的時候了!首先,我們知道如果在一個物體表面,法線垂直向上,那麼它的XYZ座標是多少?是0,0,1對不對?然後我們把這個數字按照我們前面所說的壓縮方法進行壓縮,每個數字加1然後再除以2,那麼我們得到的是0.5,0.5,1對不對?好我們把它代入到RGB中,那麼我們會得到128,128,255對不對?好了,試試看在調色盤裡的顏色吧!

P.S.現在FXCarl和你猜個謎,看看FXCarl說的對不對。現在我們在Normal Map上看見一個顏色,這個顏色是219,128,219。那麼這個表面的法線方向是垂直向右偏45度。大家用MAX做一個Normal Map看看FXCarl說的對不對?

如果你還沒有理解Normal Map的意思,或者說你有興趣再深入瞭解一些,那麼FXCarl再和你說的深入一些。不知道大家對於切空間的理解是什嗎?我們來個實驗,找三支筆。然後其中兩隻筆在案頭放成互相成90度,筆尾接筆尾。最後我們把第三支筆,筆尖向上,筆尾和那兩隻案頭上的筆的筆尾疊在一個點上。注意看我們的三支筆!這三支筆就是這張案頭上這個點的切空間座標了!大家一定想到了原來我們的Normal Map中儲存的表面法線方向原來就是一個切空間向量啊,恩沒錯,就是切空間向量。但是似乎看起來切空間沒什麼作用是不是?呵呵,我們不妨把案頭換成一個籃球。記住,保持三支筆的互相關係,然後用三支筆並在一起的筆尾去接觸籃球的表面。呵呵,發現了沒有?切空間的優勢在於,在任意表面上,切空間中的座標都是有效!也就是說始用切空間中的資料就可以做到和3D模型的複雜度無關!你可以用在任意的表面,甚至這個表面一直在動也不會影響到Normal
Map發揮作用,你說這個切空間是不是很有用呢?

讓我們回到開頭,大家就會發現,如果使用世界空間的Normal Map會有什麼樣的結果呢?嘿嘿那樣會造成一個很尷尬的結果,比如說我們做了一個人物身上的Normal Map,可是我們的情境中有兩個一樣的人物,但是他們的姿勢和面對的角度都不一樣。那麼……My God ~肯定有一個人物的Normal Map是沒法適用的!而用切空間的Normal Map就沒有問題了。恩,不過這個大家可以放心,MAX或者Maya做出來的Normal Map都是切空間的Normal Map,證明的方法很簡單……看看這張貼圖是不是主要由藍色構成的……

OK,下面是重頭戲,告訴大家Normal Map是如何發生作用的。

使用Normal Map的先決條件--逐像素著色。先來說一下傳統著色,傳統遊戲使用的是一個Phong光照模型的簡化版,甚至有遊戲使用Ground模型。這兩種演算法的方式都是只對物體3D模型的頂點計算光照,而3D表面上的大面積地區則使用差值填充。逐像素著色是到了Shaders出現之後才有的,因此Normal Mapping也是一個Shaders必須的演算法。計算一個物體表面漫反射光照的公式是很簡單的NdotL--什麼是NdotL,就是物體表面的法線和光照方向的點積。點積是一個線性代數的問題,美術朋友們可以不用深究,寫成程式也很容易:Diffuse
= saturate(Mul(Normal,Light));。想要簡單的理解就是--光線的方向向量在法線向量上的投影,然後這個投影的結果變成黑白中間的一個值。我們同樣舉個簡單的例子,用兩支筆放在案頭上,然後一支筆不動,令一支筆筆尾和第一支筆的筆尾相連,不動,然後以共同的筆尾做為圓心,移動筆。這時如果我們從一支筆尖往另外一支筆的筆杆上垂直拉一條線(一條垂線)就會看到這時移動後的一支筆在原本的筆杆所投影的長度(就是一支筆的筆尖連垂線到另一支筆的筆杆上的位置,這個位置沿著筆杆到共同筆尾的長度)會越來越短,當兩支筆垂直的時候,投影的結果就是零--沒有光照貢獻了。這個容易理解,當光線的方向和一個表面絕對平行的時候,這個表面就會再也接受不到光線了。現在我們引入NormalMap。這時我們的光照計算和以往有點不同,我們把表面的法線用NormalMap中儲存的法線來替代。這樣當我們在計算表面光照情況的時候,就會因為法線不斷的變化而產生比原來豐富的多的明暗變化。

至於為什麼會感覺出凹凸來這個就是人的眼睛自己騙自己了……其實那裡本沒有凹凸的,但是我們人眼睛太多管閑事了。就像Windows的按鈕哪個純平面的東西我們還以為是凸出來的呢。

Normal Map看來可以增加細節,但是它的缺點也很明顯。不過在說缺點之前,要提前說一句--Normal Map帶來的優勢是遠遠大於它的缺點的。因此仍然是個極好的東西,不要對它有偏見,特別是在我們後面介紹的更牛的技術前面,千萬不要。最大的也是最明顯的缺點應該就是它的視角問題。因為Normal Map只是改變的表面上的光照結果,並沒有改變表面上的形狀。因此,表面上看來,似乎只要是不接近水平,NormalMap就不會有視角問題。其實不然,NormalMap因為不能實現自身內部的遮擋,因此不能表現平面上凹凸起伏比較大的場合。比如說我們一個案頭上突出一塊,然後在突出的這塊東西邊上放一支牙籤。如果用Normal
Map表現,會發現。根據經驗,這個凸起會很輕易的擋住我們的視線,讓我們看不見那支牙籤。可是Normal Map卻不會這麼做。因此我們一直能看見障礙物背後的東西,這一點是個問題--也就是說只有在垂直於平面的時候NormalMap才會發揮最好的作用。這樣一來,Normal Map只能用在大家對遮擋關係不敏感的場合,比如情境等,不是不能用於人物,而是用Normal Map的人物不太經得起特寫,放大了,角度刁鑽了都容易穿幫。

雖然Normal Map有個不能平視的巨大問題,但是依然是好處遠大於小障礙,因此還是非常值得推廣的。後面的幾種新興演算法其實都是由Normal Mapping發展起來的,因此做為基礎的東西,也還是最有理解價值的。

P.S.關於Normal Map的一點秘籍。注意理解……Normal Map其實並不是從低模的表面凸出高模的細節的,而是把高模中比最高點的位置低的地方凹進去的!因此低模要比高模大一點點才會很准。大家可以想像成我們是用一個比高模稍微大一點點尺寸的低模石膏模型來把高模雕刻出來的。
P.S.2.關於Normal Map的做法,其實早期發明Normal Map的時候還沒有MAX這種這麼方便產生Normal Map的方法,Normal Map都是從Bump Map計算得到的,因此其實通過很簡單的演算法就可以從Bump Map算出Normal Map的,甚至可以On The Fly(就是讓遊戲引擎直接讀BumpMap然後轉換成NormalMap)。因此對於一些建起模來效率很低,但是又能明顯增加表面細節的東西,例如水泥表面的顆粒,用畫Bump的方式來做是個更好的主意,然後交給技術美工去搞定好了--當然你會用Z-Bursh那就當我什麼都沒說了,呵呵。說來FXCarl估計MAX產生法線圖的方式也是比較高低模上每個點的高度位移,然後產生每個UV圖素上的高度差來得到一個BumpMap,然後再從BumpMap變成NormalMap。

3.Parallax mapping 視差貼圖

(因為後面的演算法都是基於NormalMap的應用,可能看上去沒有NormalMapping那麼長了,但內容肯定一樣精彩的!)

視差貼圖是一種NormalMapping演算法的增強演算法,其本質上和NormalMapping沒有區別。優勢是只需要增加3個HLSL語句和一個控制紋理通道(只需要幾個GPU指令,代價小到可以忽略)就可以顯著的增加物體表面的深度感。但是NormalMap中出現的問題,Parallax mapping基本上都有--特別是視角接近平行的時候,凹凸感消失的問題,並沒有明顯改善--其實這個使用NormalMap帶來的問題就像是液晶屏的可視角度問題一樣令人揮之不去。或者按照FXCarl個人的說法--Parallax
mapping才是真正具有實用價值的NormalMapping。

目前實踐證明,這種技術非常適合XBOX360和PS3這樣的新世代遊戲主機(都上市一年了還用次世代……我真受不了現在有些人)。例如360遊戲SEGA死刑犯就是使用的和PC遊戲FEAR一樣的Monolith引擎--使用Parallax mapping。

Parallax mapping使用的還是單張的控制紋理。一張NormalMap。如果我們用AcdSee來看這張NormalMap,我們會發覺似乎和NormalMapping用的控制紋理是一樣的。而如果我們開啟這張NormalMap的Alpha通道,就會發現其中的玄機所在。原來Alpha通道裡儲存的是對應這張NormalMap的BumpMap!(就是HeightMap,就是用飽和度記錄表面高度)

現在插入一點理論課程。大家留心讀上面的文字,會看見一個控制紋理的詞彙。這個詞彙是這裡要重點解釋的。因為理解控制紋理,在成為新世代美工的需求中是相當重要的。按照大家這麼多年美術做下來的經驗,對於圖素(Texel,紋理上的一點)的理解肯定是RBG3個色綵帶一個表示透明度的Alpha通道。但是在我們的渲染器和程式員的眼裡,它可不是我們美術朋友們看見的東西。他們看見的是一個4通道的向量(其實可以理解成四個數的組合)。這4個數位取值範圍分別是0到255。通過這個空間,其實可以用來做更多別的事情--最常用的就是記錄表面的物理細節。至於為什麼要用控制紋理呢?FXCarl前兩天聽一個朋友有這麼個說法:我覺得NormalMap的效果也沒什麼,直接畫也畫的出來的。其實這個說法一點都沒錯,但是要知道,這個想法是過時的。因為NormalMap並非用於著色,而是用於更真實的產生色彩。重所周知,用畫的方式,做靜幀固然可以做到無限好。可是動起來怎麼辦?如何才能保證在不同的光照關係下依然保證最終著色的結果正確?唯一的做法,就是每幀重畫一遍。如何才能做到最有效重畫?那就要把重畫的參考告訴我們的渲染器,讓它來幫你做一些簡單的工作,這就是控制紋理的作用--把你想要即時改變的東西告訴渲染器。其實控制紋理的範圍很大,除了NormalMap還有很多,比如說Nvidia的DEMO曾經用紋理儲存物體表面在陽光下的色彩變化規律。把藝術家想要即時改變的東西壓縮在紋理中告訴渲染器是一件相當有挑戰性的工作,當然也會獲得更令人讚歎的畫面。請接受控制紋理,那是讓藝術家把一個瞬間的精確著色變成一個普遍適用的著色的利器!

Parallax mapping是如何達到增加NormalMap的效果的呢。我們要從NormalMap的特性說起。我們假設在NormalMap表面製作一個凸起。然後我們轉轉角度看看。我們會發現,其實這個凸起的背對我們視線的面~並不會因為我們視角的逐漸放平而消失--這顯然是不正確的,要知道背後的東西應該是看不見的才對。因此Parallax mapping就是來緩解這個問題的,具體的代碼這裡不提。我來試著白話解釋一下原理。其實為了不讓我們看見“不該看的東西”應該試著挪動紋理座標……把那個不該給玩家看見的圖素(Texel)跳過去。也就是說根據高度圖提供的資料,把那個位置較低那個紋理的後面的紋理向前拉。相當於在圖素採樣的時候刻意的把那個圖素跳過去。這樣那個不該被玩家看見的像素就會因為圖素的消失而不見了--很明顯,這個演算法是不太站得住腳的,雖然計算的時候會參考玩家視線的角度。但仍然是一種來自於經驗的估算。值得欣慰的是,對於本身NormalMap所需要表現的微小細節來說,這樣的改進已經看上去不錯。因此開始有大量的遊戲決定採用。特別是它的優點是所消耗的代價極為有限,而需要增加的工作量只是讓美工把高度圖儲存到Alpha通道裡而已。很划算。

但是對於技術研究者來說,這樣的表現顯然還是不夠令人滿意的。因此,順著視差貼圖的思路向下發展,藉助ShaderModel3.0的出現。出現了一個真正從物理上改變物體表面的演算法,這就是我們下一篇文章需要介紹的Displacement Mapping

 

4.Displacement mapping 位移貼圖

和前面說的幾種方式不同,DisplacementMapping是一種真正改變物體表面的方式。通過一種稱為micropolygons(微多邊形)tessellate(鑲嵌)的技巧來實現真正的改變物體表面的細節。

具體流程是這樣的。首先,根據螢幕的解析度,在模型的可見面上鑲嵌和最終象素尺寸相同的微多邊形。這個過程叫做鑲嵌。然後讀取一張Bump貼圖。根據表面的灰階確定高度。然後根據鑲嵌所得到的多邊形,沿著原先的表面法線方向移動微多邊形。接著再為新的多邊形確定好新的法線方向。此時,物體的表面確實已經真的增加出了細節。

其實這種技巧,我們在使用ZBrush的時候就可以看見了。大家用過Zbrush的時候會知道,在表面刷過的細節,只有在畫面靜止下來之後才會越來越清晰。而微多邊形鑲嵌起到的就是類似的作用。只增強面對螢幕的多邊形的表面粗糙細節,而不是整個模型。因此效能代價並不會像直接上高模那麼大。相比來說位移貼圖在效果上是沒有任何瑕疵的,但是也未必沒有缺點。

首先就是,對硬體的要求很高,必須支援ShaderMode3.0才可以,因為只有支援SM3才可以在頂點階段進行紋理操作。同時鑲嵌對於效能的消耗也不小。不過其實就對於GPU的壓力而言,反而似乎要更合理一些(因為對頂點的運算要求提高,對象素層級的運算要求反而沒有影響)想必在將來的DX10統一渲染構架中會更有價值。

和我們介紹的所有凹凸貼圖技術相比,位移貼圖是唯一真正改變多邊形表面幾何形狀的方法。相比之後將要介紹的切空間光線追蹤演算法,這種演算法的效能消耗雖然並不佔優,但其實要更為合理。給予畫面更多特效的機會,同時更有趣的是,其實他和其他基於象素著色的凹凸貼圖並沒有什麼衝突。其實這種位移貼圖在新世代主機的遊戲中大家都有可能見到。只是可能不是大家想得到的地方。

它可以用來即時產生大面積的戶外地形!這是其他任何凹凸貼圖方式所不能比擬的!

ReliefMapping 和 ParallaxOcclusionMapping 和 ConeMapping 浮雕紋理貼圖和視差阻塞貼圖和圓錐跟蹤貼圖

三種利用切空間光線追蹤先進演算法的技術,三種方法分別是光線跟蹤,光束跟蹤和圓錐跟蹤演算法。當然可以說後面的都是第一種的改進。這些都是面向未來的技術,很有前途。ReliefMapping甚至現在可以實現扣環這樣的複雜幾何表面,並且可以處理不能平視的問題!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.