以體素建構三維游戲世界

分類:設計 時間:2016-10-25

體素除了能應用于像《我的世界(Minecraft)》形式的游戲,還可以有更細致的表現,成為下一代的三維游戲世界構成方式,本文從技術角度分析當中的原理及相關技術。

(標題圖片來自 Voxel Pac-Man Shader by Nrx

引言

現時,主流三維游戲一般都需要龐大、精致的游戲世界(game world,或稱為游戲關卡/game level、游戲舞臺/game stage)。所謂的游戲世界,不單指玩家可見的三維渲染環境,也包含游戲性系統(游戲機制、物理碰撞、人工智能等)所需的虛擬環境。

多數三維游戲使用三維三角形網格(3D triangle mesh)建構大部分的游戲世界,包括地形、建筑、植被及其他靜態物件。一些以自然戶外環境為主的游戲,如大部分RPG、MOBA類型游戲,會使用到高度場(height field)去表示地形;一些室內為主的游戲,如一些FPS、TPS、ACT等,會使用構造實體幾何(constructive solid geometry, CSG)技術去建構基本的室內環境(在許多游戲引擎中稱為 BSP/binary space partitioning 筆刷)。

游戲世界的制作占總制作成本的一大部分,而隨著游戲平臺的性能提升,以及游戲內容需求的膨脹,游戲世界的制作成本也因應不斷提高。以上的制作方法都各有優缺點。三維網格是合乎當代硬件的游戲世界表示方式,也是較自由的建模方式,而且有成熟的數字創作工具(digital content creation tool)如 3ds Max 和 Maya。但其缺點包括建模成本高、僅為表面表示方式(可能無法判斷一個任意點在其外還是其內)、不容易修改(尤其是在展開UV之后)、不容易做連續或離散級數的細致程度(level of detail, LOD)等。高度場和 BSP 的制作成本較網格低,而且較容易修改和實現 LOD,但其適用場合就非常局限。

有沒有更好的三維游戲界的制作方式?此問題一直是游戲制作的重要探索方向。

體素

自2009年《我的世界(Minecraft)》的空前成功,根據 IGN于2013年9月的報道 ,Minecraft 在所有平臺上已售出共三千三百萬份。體素(voxel)進入開發者的眼球,成為另一種建構游戲世界的可行方式,見圖1、2。

圖1:《我的世界》游戲截屏。

圖2: 《我的世界》游戲玩家合作制作的《冰與火之歌》中的君臨城。

簡單類比,體素就是像素的三維版本。在二維中,我們可使用顏色的二維數組表示一個影像(image);在三維中也可以用體素的三維數組表示一個柵格化的三維空間,每個體素儲存一個比特,表示該空間是實心還是空心的,如圖3。這種二元體素(binary voxel)是最簡單的體素形式,但體素還可以儲存其他屬性。例如《我的世界》的體素會儲存讓空間的材質(泥土、石、水等),而在醫學上會把CT掃描得來的X射線不透光性(opacity)儲存在體素中,如圖4。

相對于高度場地形及BSP,體素可以同時制作一般地表、山洞、建筑物等固體。

圖3:把一些體素疊起來,灰色立方體是其中之一個體素。(維基百科圖片)

圖4:以體積宣染方法去可視化CT掃瞄的體素數據。(維基百科圖片)

破壞與建設

由于體素數據的結構簡單而均勻,它相對于網格來說更容易修改。因此,游戲可以讓玩家建設游戲世界(這是一種用戶生成內容/user-generated content, UGC),也可以讓游戲規則動態改變游戲世界,例如可破壞物件(destructible object)、地形變形(terrain morphing)等。不單止修改,無中生有也是可能的──《我的世界》和《魔方世界(Cube World)》(圖5)等游戲都包含程序式生成內容(procedurally generated content),后者更可以生成一個大型的RPG地圖及游戲性內容。當然,純粹自動生成的內容不一定合乎游戲設計師的要求,但某程度的程序式生成功能可以大幅降低制作成本。

圖5:《魔方世界》完全以程序隨機生成內容,讓玩家可以不斷探索無限的世界。整個游戲僅由一對夫妻制作。 官方預告片

更細致的表現

前述的游戲例子都是使用二元體素,其棱角非常突出,雖然可視為一種風格(如8位游戲機時代的象素風格),但是否有方法改善呢?其中一個方法,就如二維影像,我們可以提升體素數據的分辨率,例如從每立方米一個體素提升至每厘米一個體素,以增強細致程度。然而,體積數據是以立方級數增長的,所需的存儲容量很高。例如一個 2563 大小的體素空間含一千六百多萬個體素(16M個);而 10243 就會增長至過10億個體素(1G 個)。即使每個體素只占1字節,也需要大量儲存空間。當然,我們可以考慮在一般的應用場合中,大量相連的體素是全部空心或實心的,那么我們可以使用一些數據結構去壓縮這些原始體素數據,如八叉樹。2010年 NVidia 就曾發表研究[8],展示如何高效地使用 GPU 去光線追蹤以稀疏體素八叉樹(sparse voxel octree, SVO)表示的場景。在該研究中,每體素還存儲了顏色及法綫的壓縮數據。一個大教堂模型(Sibenik)壓縮后以 440MB 存儲 40963 的數據,被渲染時的光綫追蹤能力達每秒1億光綫(圖6)。GigaVoxels[3][4]也是相似的技術。 Atomontage 引擎 也是使用含顏色的體素數據,但以獨家的方式進行壓縮,宣稱可以極高幀率實時渲染大型體素場景(圖7)。

然而,每體素儲存顏色/法綫的方案,未必符合游戲開發所需。此方案的重點,是場景中每個細節(例如達 1cm 的精度)都可以獨立編輯。對于在科學應用上通過掃瞄真實場景(例如地形、建筑、生物等)得到的體素數據,這種精確性是必須的。然而,游戲通常只需要虛擬的場景,玩家并不在乎大教堂中的某幅墻的凹凸是否和現實完全相同。從場景制作的角度看,雖然場景能任意雕刻,十分自由,但這種自由度反而難以管理及掌控。情況有如在二維游戲中,可任意繪畫的非常巨大的地圖。這個問題的爭論點類似在id Software的MegaTexture/虛擬紋理(virtual texturing)技術[1][6]所產生的制作及游戲容量問題。以下將描述利用等值面提取及數據擴大解決細致程度及容量問題。

圖6: 把 Sibenik 模型體素化為40963的稀疏體素八叉樹(SVO),每個體素含顏色及法線,以GPU光線追蹤渲染。

圖7: Atomontage 引擎實時渲染大型體素場景,場景可以被動態任意破壞。

等值面提取

對于上述談到的棱角問題,以光綫追蹤渲染體素時,可以加入一些插值方式及法綫數據令效果更為平滑。另一個渲染方法,是在體素中儲存標量數據,然后提取該標量場的等值面(isosurface),生成三維網格,再以普通的光柵化方式渲染。如果類比二維的情況,就如同提取高度場的等高綫(contour line),再把這些等高綫渲染。在三維的情況,我們可以存儲場景的物質密度,或是有符號距離(signed distance),作為標量場。

給定一個標量場,我們可以使用經典的移動立方體(Marching Cubes, MC)算法[10]去提取等值面。MC 算法十分簡單,只需掃瞄體素數據,若等值(isovalue)介乎兩個相鄰體素的值之間,便使用綫性插值求出中間的等值面頂點,最后使用查表去決定如何把這些頂點連接成等值面三角網格。由于 MC 只能生成圓滑的等值面,不能表示銳利的頂點及棱,后來的對偶輪廓(dual contouring, DC)[7]可以解決此問題,但就需要在體素中加入法綫數據,效果如圖9所示。

圖8: 移動立方體(Marching Cubes, MC)算法中的15個立方體組態。每條棱兩端的值與等值比較后,若一個大于等值,一個小于等值,就在該棱上線性插值生成頂點,然后按這些組態生成三角面片。(維基百科圖片)

圖9: 對偶輪廓(dual contouring, DC)算法可以同時保持銳利的頂點及棱

CryEngine 3和C4 Engine所支持的體素建構場景功能,都使用了這類等值面提取方式。這兩個引擎都是以體素方式解決高度場地形的缺點(如無法表示山洞)。下一代的《無盡的任務》包括兩個作品《EverQuest Next》及《EverQuest Next Landmark》整合了 Voxel Farm Engine ,全面使用了等值面提取方式的體素去建構大型的游戲世界,包括地形、洞穴、建筑物等(圖10),而且還加入破壞/改變游戲環境的技能設計。

圖10: 《EverQuest Next》的場景截屏,地形和建筑物都是用體素建模,生成圓滑或尖銳邊緣的網格,再使用紋理映射加強細節及營造游戲獨特的美術風格。體素編輯演示視頻。

數據擴大

使用等值面提取方式后,不需要高分辨率的體素來產生圓滑的表面,可以說一方面解決了棱角的問題。但另一方面,我們如何在不大幅增加數據量的情況下,提升細致程度?其中一個通用技術就是數據擴大(data amplification)──用小量數據生成大量數據。一般高度圖地形簡單地采用多層重復密鋪(tiling)的紋理,也可算是一種簡單的數據擴大。這種方法也可以應用到等值面提取上,不過它需要更復雜的紋理映射方式,例如 C4 Engine 可混合三個平面投影去混合紋理采樣(tri-planar mapping)[9]。要避免視覺上的重復問題,還可以考慮 Wang Tile [10] 或者其他紋理生成技術,這可能涉及如何參數化(parameterize)等值面的問題。可以參看圖11《EverQuest Next》的例子。

圖11:《EverQuest Next》混合兩個投影紋理,以映射至任何拓撲結構的生成網格。

除了表面的紋理外,還可以加強幾何方面的復雜度,例如我們可以使用位移貼圖技術(displacement mapping)去為表面加上更多細節。

數字雕刻與其他建模方式

之前談及許多體素的表示方式,以下再談可如何建立、編輯這些數據,用圖形學的述語,就是建模(modeling)。體素非常適合數字雕刻(digital scupting),即是把體素當作粘土,提供貼土、推入、拉出、磨平、捏造等工具去制作模型。Mudbox(圖12)和 ZBrush 是現成的數字雕刻工具,但這類工具通常是基于對表面網格幾何作出修改,而不能改變模型的拓撲結構。采用體素就不會出現這種拓撲問題,但相對地其編輯工具還未成熟。

圖12:使用 Mudbox 在模型網格上進行數字雕刻。現時這類技術通常用于角色建模及紋理,通過法線/位移貼圖去增加細節。 基本㓮刻教程

體素的一個特點,是可以簡單地實現構造實體幾何(CSG)。為了更容易建模,可以使用CSG去為建筑等人工物建模,在運行時才體素化。這樣比直接雕刻省時,容易修改,而且更能節省容量,并更適合一些自動生成算法。以二維來類比,就像在Photoshop中使用矢量形狀編輯,需要時才光刪化成像素。另外,對于普通的三維網格,也可以進行體素化,但并不容易保存原來的紋理映射。

高級渲染技術

除了等值面提取及紋理貼圖等技術外,體素在渲染上還有很多可發展的技術。由于體素適合光線追蹤,近年有一些研究使用了體素為基礎的實時全局光照,例如體素圓錐追綜(voxel cone tracing)[5]。如果游戲世界本身已經是由體素組成,就省卻體素化(voxelization)的步驟。而這種全局光照,除了常見的慢反射表面(diffuse surface)的二次反射,還可以實現面積光源、光澤反射/折射(glossy reflection/refraction)材質等效果,如圖13。

圖13:利用體素圓錐追綜制造全局光照。光源從上而下,在地面反射至拱門天花,紅布也有滲色(color bleeding)至天花。另外留意地面材質含有光澤反射。(此場景本身是以三角形網格渲染。) 示范視頻

游戲性技術

當然,游戲并不僅是一個實時渲染器,游戲的重點是游戲性(gameplay)。許多二元體素游戲已經展示出一些與別不同的游戲性元素,在此不作詳細分析。但在技術層次上,我們還需要解決一些動態體素世界的問題,主要有物理和人工智能方面。在物理方面,最基本的要考慮等值面與剛體形撞的碰撞檢測、支撐分析(切割后懸空的部分可能需要掉落,甚至因結構問題而斷裂),此外也可研究相關的流體模擬、燃燒模擬。人工智能方面,最基本是視線查測及路徑搜尋。體素也可利于進行地理上的推理分析。

結語

傳統的游戲世界在游戲性、制作上都有一定限制,基于體素的制作方式可帶來各種創新,提高游戲品質并控制制作成本。然而,顛覆傳統需要各方面的配合,游戲設計、關卡設計、美術制作、游戲性編程都要注入新的思維,也必須輔以扎實的工具及制作流程。在引擎技術上,需要解決大規模世界的多分辨率建模、依 LOD 作資源串流、實時渲染、物理模擬、人工智能等各個方面的需求。

或許這也是一個機遇,可以開拓另一條游戲技術道路,制作未來具技術壁壘的創新游戲。

參考文獻

[1] Sean Barrett. Sparse virtual textures . GDC 2008 presentation, 2008.

[2] Michael F Cohen, Jonathan Shade, Stefan Hiller, and Oliver Deussen. Wang tiles for image and texture generation , volume 22. ACM, 2003.

[3] Cyril Crassin, Fabrice Neyret, Sylvain Lefebvre, and Elmar Eisemann. Gigavoxels: Ray-guided streaming for efficient and detailed voxel rendering . In Proceedings of the 2009 symposium on Interactive 3D graphics and games, pages 15–22. ACM, 2009.

[4] Cyril Crassin, Fabrice Neyret, Miguel Sainz, Elmar Eisemann, et al. Efficient rendering of highly detailed volumetric scenes with gigavoxels. GPU Pro, pages 643–676, 2010.

[5] Cyril Crassin, Fabrice Neyret, Miguel Sainz, Simon Green, and Elmar Eisemann. Interactive indirect illumination using voxel cone tracing . In Computer Graphics Forum, volume 30, pages 1921–1930. Wiley Online Library, 2011.

[6] Charles Hollemeersch, Bart Pieters, Peter Lambert, and Rik Van de Walle. Accelerating virtual texturing using cuda . Gpu Pro: Advanced Rendering Techniques, pages 623–641, 2010.

[7] Tao Ju, Frank Losasso, Scott Schaefer, and Joe Warren. Dual contouring of hermite data . In ACM Transactions on Graphics (TOG), volume 21, pages 339–346. ACM, 2002.

[8] Samuli Laine and Tero Karras. Efficient sparse voxel octrees . Visualization and Computer Graphics, IEEE Transactions on, 17(8):1048–1059, 2011.

[9] Eric Stephen Lengyel. Voxel-Based Terrain for Real-Time Virtual Simulations . PhD thesis, UNIVERSITY OF CALIFORNIA, 2010.

[10] William E Lorensen and Harvey E Cline. Marching cubes: A high resolution 3d surface construction algorithm . In ACM Siggraph Computer Graphics, volume 21, pages 163–169. ACM, 1987.

本文原于2013年11月14日在騰訊內部揭載,獲授權公開。

以體素建構三維游戲世界


Tags: 游戲設計

文章來源:https://zhuanlan.zhihu.com/p/20065737


ads
ads

相關文章
ads

相關文章

ad