1. 程式人生 > >unity3d 凹凸貼圖、法線貼圖、置換貼圖 (二)

unity3d 凹凸貼圖、法線貼圖、置換貼圖 (二)

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



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


  P.S. 關於NormalMap的一點祕籍。注意理解……NormalMap其實並不是從低模的表面凸出高模的細節的,而是把高模中比最高點的位置低的地方凹進去的!因此低模要比高模大一點點才會很準。大家可以想像成我們是用一個比高模稍微大一點點尺寸的低模石膏模型來把高模雕刻出來的。

  P.S.2.關於NormalMap的做法,其實早期發明NormalMap的時候還沒有MAX這種這麼方便生成NormalMap的方法,NormalMap都是從 BumpMap計算得到的,因此其實通過很簡單的演算法就可以從BumpMap算出NormalMap的,甚至可以On The Fly(就是讓遊戲引擎直接讀BumpMap然後轉換成NormalMap)。因此對於一些建起模來效率很低,但是又能明顯增加表面細節的東西,例如水泥表面的顆粒,用畫Bump的方式來做是個更好的主意,然後交給技術美工去搞定好了--當然你會用Z-Bursh那就當我什麼都沒說了,呵呵。說來 FXCarl估計MAX生成法線圖的方式也是比較高低模上每個點的高度偏移,然後生成每個UV圖素上的高度差來得到一個BumpMap,然後再從 BumpMap變成NormalMap。

  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

  Displacement mapping 位移貼圖(置換貼圖)

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

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

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

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

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

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