吳剛
摘要:在充分認識體素的基本概念和基于體素地形表達的特點上,結合UE4分析了體素地形對于三維地形的構建帶來的影響及體素地形構建過程中的優(yōu)化分析。通過對體素建模過程中出現的一些問題,提出相應的解決方案。
關鍵詞:體素;虛擬地形;Unreal Engine;三維建模
中圖分類號:TB文獻標識碼:Adoi:10.19311/j.cnki.1672-3198.2019.10.079
三維地形可視化是對現實世界中的自然地理環(huán)境的表達和模擬,以期望用計算機的方式來表達和模擬現實世界,即現在常說的虛擬現實。構建和表達地形的方式多種多樣,可以通過使用一些工具來完成建模,如Unity Engine、UE4、Cry Engine等。三維地形的實現方式各有不同,從其模型構建的本質上可分為兩類:基于多邊形的面模型和基于體素的體模型。大多數的三維地形采用的是基于多邊形的面模型來建模,如三角形網格模型。對于一些簡單的地形環(huán)境,使用面模型來建模往往可以達到比較好的可視化效果,并且基于面模型的三維可視化技術比較成熟,有許多的優(yōu)化手段和解決方案,如LOD層次細節(jié)模型。面模型可視化方法在表現洞穴,拱橋和垂壁等復雜地形的時候,有很大的缺陷,如效率低、表現不好,并且難以實現地形體數據的表達和實時編輯,尤其在地理空間變化的模擬上(如侵蝕現象),表現效果不佳。
基于體素的體模型在地形可視化方向的應用晚于面模型,基于其在復雜地理空間中的較好表現效果,和其在游戲場景中有著重要的作用,現在越來越多的引起人們的關注。三維游戲世界場景廣泛使用三角形網格模型(3D triangle mesh)構建,包括地形、建筑、植被以及其他靜態(tài)物件。一些以自然環(huán)境為主的游戲,如大部分RPG、MOBA類型游戲,會使用到高度場(height field)去表示地形;一些室內游戲,如FPS、TPS、ACT等,會使用構造實體幾何(construct solid geometry,CSG)技術去構建基本的室內環(huán)境(也可以稱為BSP/binary space partitioning 筆刷)。以上這些制作方式各有優(yōu)缺點,面模型是合乎當代硬件的游戲世界表示方式,也是較自由的建模方式,并有成熟的數字創(chuàng)作工具如3ds Max和Maya。面模型建模的缺點有建模成本高、只有表面表示方式,無法判斷是否在其內部,并且不容易修改,不容易做連續(xù)或離散級數的細致程度(level of detail,LOD)等。這時隨著開放世界類型游戲的出現,體素(voxel)開始越來越被人們所熟知。
1體素的概念和特點
Wikipedia給出Voxel的定義為“Voxel(體素,更準確地說是測定體積的像素)是一個體積像素,用來表示三維空間中規(guī)則格網的值。類似于二維空間中用來表示二維圖像數據的像素。”每個體素使用一個比特來進行存儲,表示該空間是實心還是空心,這種二元體素(Binary Voxel)雖然是最簡單的體素形式,但它還可以存儲其他屬性。例如在《我的世界》中的體素會存儲空間中的材質(泥土、石頭、水等)。體素地形庫(DatabaseBlock)是體素管理的基本單位,所有的體素是在體素地形庫中生成。構建地形需要的體素數據為地形的繪制、地形的AO、地形的碰撞、地表的植被、地形的修改。
2地形系統的構建及改進
2.1根據需求構建地形系統
首先定義可視范圍,對可視范圍內的地形進行渲染,以體素地形庫(DatabaseBlock)為單位,管理地形。然后每幀查詢可視范圍內的DatabaseBlock,如果發(fā)現DatabaseBlock對應的Mesh不存在(即沒有被渲染),則從體素地形庫中獲取DatabaseBlock中對應的體素數據,根據體素數據構建渲染模型(RenderMesh)進行渲染,再構建碰撞模型(CollisionMesh),用于進行碰撞檢測,同時根據體素可以生成植被等渲染信息。當地形庫中的體素數據發(fā)生修改的時候,需要體素地形庫通知地形系統,重新獲取體素數據,進行模型的構建和渲染。
2.2當前體素地形存在的問題
系統運行時會出現運行時卡頓,地形范圍不能太大,地形的AO不能影響地形上其他的模型(Mesh)等。
2.3出現的問題類型
(1)DrawCall數量太多。
由于針對每個RenderBlock進行Mesh的提取,每個類型的體素都對應一個或者多個不同類型的材質(最多為6個),復雜的體素類型導致了超多的材質,從而使得DrawCall數量暴增。
可簡化為公式:
每個體素需要六種材質 * 體素的類型數(200)= 總共需求的材質種類(1200)
(2)三角形數量過多。
由于體素地形的特殊性,提取mesh是按照簡單立方體表面提取算法來提取的,將導致有大量冗余的三角形產生,可以刪除冗余的三角形,簡化渲染模型。如對于大面積的水域,使用兩個三角形就可以繪制。
(3)視錐剔除效率低下。
選取DatabaseBlock為大小作為渲染Mesh的單位,單位過大。渲染采用的是外包盒的方式渲染,由于整體的包圍盒比較大,進行視錐剔除的效率偏低。本來可以不用提交渲染的Mesh,也不能被剔除。
(4)沒有進行遮擋剔除。
對地形系統中,一個很重要的優(yōu)化手段就是遮擋剔除,即被遮擋的Mesh,不應該被提交渲染。
(5)地形上物體不會受到AO的影響。
由于計算完地形的AO值后,直接通過地形的頂點信息傳入Shader中,計算光照信息的時候只是對地形產生影響,不會對地形上其它的物體產生影響。比如NPC從洞外進入山洞里不會變暗。
(6)植被的管理以及渲染效率低下。
由于存在大量的樹木,直接對樹木進行渲染,將會導致渲染效率低下,應該使用實例化的方式進行渲染,并且要考慮遮擋剔除等。
(7)其它一些問題。
碰撞檢測效率不高,物理碰撞的Mesh沒有優(yōu)化,導致物理引擎中碰撞效率不高。頂點數據格式過大,導致帶寬需求變大,同時CacheMiss的概率也響應增大。對Block線性遍歷,遍歷Block的復雜度為O(n),可以使用加速結構提高Block的遍歷效率。
2.4針對上述問題提出的優(yōu)化方案如下
(1)減少材質的數量,使用TextureArray,保證盡可能少的Material。
(2)使用冗余三角形的刪除算法,減少三角形的個數。
(3)使用緊湊的頂點坐標格式,減少帶寬的依賴以及CacheMiss的概率。
(4)視錐剔除時,使得測試目標變小,提高視錐剔除的效率。
(5)使用遮擋剔除,減少提交渲染物體的數量。
(6)使用3DTexture存儲AO值,渲染其它物體的時候,AO值參與計算。
(7)使用實例化的方式渲染樹木等靜態(tài)物體,使用二叉樹進行管理,并使用遮擋測試進行優(yōu)化。
(8)使用Octree管理地形,提高渲染節(jié)點的遍歷效率,并使用合并Mesh的方法進行優(yōu)化。
(9)使用地形的LOD提高渲染的效率。
3結語
通過上述提出的優(yōu)化方案,可以有效的解決系統運行卡頓,地形范圍過小以及AO影響等問題。三維模型的構建使用傳統的基于多邊形的方式,在地形復雜性和靈活性的表達上,具有很大的限制;基于體素的地形制作方式,帶來了各種創(chuàng)新的方式,提高三維世界場景品質的同時,節(jié)省了成本?,F在虛擬現實技術的成功,很大一部分來源于三維虛擬世界的高度逼真,讓人沉浸其中。而基于體素建模的應用可以很好的滿足高品質場景的要求。隨著體素建模技術的發(fā)展與成熟,留給我們的既是機遇也是挑戰(zhàn)。
參考文獻
[1]蔣秉川.基于體素模型的戰(zhàn)場環(huán)境建模與可視化研究[D].鄭州:解放軍信息工程大學,2013.
[2]蔣秉川,游雄,夏青.一種基于體素的三維地形可視化方法研究[J].測繪通報,2013,(03):46-49.
[3]蔣秉川,萬剛,范承嘯,夏青.戰(zhàn)場環(huán)境體素模型適應性分析及體要素分類方法研究[J].系統仿真學報,2017,29(02):241-247.
[4]Wikipedia[EB/OL].http://en.wikipedia.org/wiki/Voxel,2012.