劉贇
(北京極光互動網絡技術有限公司 北京市 100028)
在游戲項目中,茂盛的植物一直是一個渲染難點,因為游戲項目需要盡量減少多邊形數量,而郁郁蔥蔥的植物很難用較少的多邊形表現出來。以往的方案大多是直接用交叉多邊形片加貼圖來表現光照效果,但是當光線發生動態變化時,或者當觀察視角旋轉時,這種方法就會露出破綻。
另一種方法是用多邊形片包裹成實體形狀,這種方法的問題是難以表現不規則的形狀,通常用來創建修剪過的規則植物。
茂盛植物的視覺效果有一些特點,很難直接用多邊形和貼圖來表現。首先是形狀十分復雜,而游戲需要盡量精簡多邊形數量;其次植物的葉子是半透明的,密集的樹葉在光照下看上去很像實體,尤其是背光時能看到整個樹冠會有發亮的邊緣。這些特殊的視覺效果,用傳統的模型加貼圖的方法很難較好的表現。
通常3D 多邊形的點(Vertex)都有法線屬性(Normal),用來記錄點的方向,是渲染時實現光照的依據。Vertex Normal 原本是來源于Surface Normal,但我們可以通過反向改變Vertex Normal 來影響Surface Normal 的渲染,進而實現用較少的多邊形數量達到復雜的體積渲染效果。
經過實踐,將復雜模型(高模)的Vertex Normal 數據,通過一定的算法完全可以映射到低模的頂點上,進而使光照渲染時更接近高模的體積效果,再配合恰當的貼圖,可以用少量頂點和多邊形渲染出更接近真實復雜植物的光照效果。
這種方法可以用低模實現不規則高模體積光照效果,因此主要適用于游戲項目中對植物的模擬,但同時也適合影視CG 中出現大量植物的場合,可以有效提高渲染效果與渲染效率。
在以往的游戲項目中,樹叢之類比較濃厚茂密的植物通常有兩種模型結構,一種是多邊形面片中心交叉結構;另一種是多邊形面片表面包裹結構。
將這兩種模型導入游戲引擎中,可以看到渲染結果如圖1所示。
這兩種模型結構各有優缺點,也各自有適用范圍,在實際游戲項目中經常是根據需求來混用的。
第一種模型結構通常用于自然生長、外形不規則的茂盛植物,如樹冠、灌木叢等;第二種則多用于人工修剪過的植物,如方形的植物墻等等。但是無論哪種方式,都有一種機械和不自然的感覺,因為在光照渲染下,模型的面片結構都比較明顯。這種不自然的感覺,在光線角度變化、或者觀察角度變化時會尤其明顯。

圖1

圖2
突兀的“面片”感,可以通過改變模型法線來改善,但一般要么是直接設置為簡單的放射狀(球狀)法線,使光照效果過于簡化,要么則需要手動設置頂點法線,操作比較繁瑣。本文將提出一種更簡單的自動法線映射方法,既可以實現流程自動化,只需要創建好低模,后續步驟就可以自動完成,又可以使效果更符合低模結構,體現實體植物的層次感。
如果仔細觀察真實世界里的光照下的茂盛植物,可以發現有幾個比較明顯的特點:
首先,在光照下,茂盛的樹葉有明顯的體積感,盡管體積的形狀不規則,但是可以明確的劃分出亮面與暗面。其次,由于大部分植物的葉片本身呈半透明狀,因此在光照下,整體會呈現比較明顯的通透感。如果要在游戲中表現出以上茂盛樹葉的光照效果,往往需要更多的多邊形數量,而對游戲來說,性能十分重要,原則是使用盡量少的資源表現盡量好的效果,特別是在手機游戲項目中,對多邊形數量的要求更加苛刻,這就對游戲美術人員提出了更高的要求。
3D 模型的頂點法線(Vertex Normal)是由三個數值組成的一個向量(Vector),是渲染模型時計算光照的基本依據。通常情況下,Vertex Normal 的數值是由Face Normal 的歸一化平均值(normalized average)計算而來,這樣就可以在渲染的時候正確計算多邊形平面的光照。但是,也可以通過其它方法改變Vertex Normal 的值,進而影響多邊形表面的光照渲染。
法線映射的基本原理可以分為三部分:第一,創建在游戲中使用的片狀交叉多邊形(低模);第二,創建用于映射法線的實體多邊形(高模);第三,尋找每一個對應低模vertex 的高模vertex 并進行映射。下面分別對每個步驟的原理進行解釋。
首先是創建在游戲中使用的片狀交叉多邊形,俗稱“低模”,即是在游戲中實際使用的3D 模型。由于最終需要重新設置頂點法線信息,因此模型的多邊形和表面法線(Surface Normal)信息并不是很重要,重要的是頂點數量和位置。這里以游戲中常見的低模植物交叉面方式為例。由于默認的頂點法線信息直接由表面法線計算而來,因此看上去就是多邊形本身的光照效果,也就是很多方形片的效果。
Houdini 是一款由加拿大Side Effects Software Inc.( 簡稱SESI)公司開發的三維計算機圖形軟件,廣泛用于游戲和影視等3D 視覺效果領域。本節將使用Houdini 為例實現法線映射的過程,但使用其他大部分支持編程擴展的3D 建模軟件(例如Blender、Autodesk 3DS Max 或Autodesk Maya 等)也都是可行的,只要使用特定軟件所支持的腳本語言即可。
首先創建低模模型。在Houdini 中,先創建一個最基本的四邊形(Grid),然后進行簡單的復制即可完成。創建低模的步驟在不同的建模軟件中有不同的流程,但最后得到的結果應該是基本相同的,這里不詳細贅述Houdini 的建模過程。該模型共由168 個四邊面組成,頂點數為672。
這里需要進行說明的是,Houdini 中有Point 和Vertex 兩種元素,這兩種元素目前沒有標準對應的中文,經常會被混稱為“頂點”,但這兩個元素還死活略有不同。由于不同的軟件對模型頂點的處理方式也不盡相同,這里不進行詳細贅述。在本例中,將使用Point作為映射元素,而不是使用Vertex。
下一步是創建用來映射原始頂點法線信息的高模。在Houdini中可以利用Polygon 和VDB 狀態互相轉換而實現從低模直接創建形狀對應的高模。
VDB 是Volumes with Dynamic Topology 的縮寫,是Houdini 中的一種通用體積數據類型,這種類型可以和polygon 實現相互轉換。
在Unity 引擎中渲染:
為模型增加UV 之后,就可以導入游戲引擎,加上材質,觀察最終效果了。本例以Unity 為例,來對比使用法線映射之前和之后的效果。
在Unity 中創建一個材質,該材質需要使用的shader 至少要支持Alpha 透明和雙面顯示。本例中還在Shader 中增加了Fresnel 效果,用來模擬樹叢的反光和半透明邊緣,可以使渲染效果看起來更通透。
將該材質球分別賦予法線映射前和法線映射后的兩個樹叢模型,渲染效果對比如圖2所示。
可以看出,法線映射后的效果非常明顯,樹叢有了體積感,亮面與暗面的渲染都呈現了實體效果,Fresnel 也可以比較正確的模擬環境反光的顏色。
本文介紹了一種在游戲中渲染不規則復雜物體的方法,只要面數極少的低模就可以比較好的渲染出有層次和體積感的復雜效果,適合用于茂盛的植物、灌木等物體的渲染,也可以用于類似復雜結構的其它物體,如成捆的鐵絲、樹枝或毛線等。如果對體積光照渲染效果要求更高,可以在本文基礎上手動調整法線,或者手動創建用于映射頂點法線的模型。在實際項目中,還可以根據需要增加vertex color、normal map 等技術,在不需要增加額外資源開銷或只需要很少資源的前提下,進一步提高實際表現效果。這些技術都是游戲美術人員所熟知的,更多依賴審美和經驗,所以沒有在本文中提及。此方法也可以用于影視離線渲染中大量植被渲染,可以有效提高渲染效果,并節省開發時間和渲染時間。