體素除了能應用于像《我的世界(Minecraft)》形式的游戲,還可以有更細致的表現(xiàn),成為下一代的三維游戲世界構成方式,本文從技術角度分析當中的原理及相關技術。
引言
現(xiàn)時,主流三維游戲一般都需要龐大、精致的游戲世界(game world,或稱為游戲關卡/game level、游戲舞臺/game stage)。所謂的游戲世界,不單指玩家可見的三維渲染環(huán)境,也包含游戲性系統(tǒng)(游戲機制、物理碰撞、人工智能等)所需的虛擬環(huán)境。
多數(shù)三維游戲使用三維三角形網格(3D triangle mesh)建構大部分的游戲世界,包括地形、建筑、植被及其他靜態(tài)物件。一些以自然戶外環(huán)境為主的游戲,如大部分RPG、MOBA類型游戲,會使用到高度場(height field)去表示地形;一些室內為主的游戲,如一些FPS、TPS、ACT等,會使用構造實體幾何(constructive solid geometry, CSG)技術去建構基本的室內環(huán)境(在許多游戲引擎中稱為 BSP/binary space partitioning 筆刷)。
游戲世界的制作占總制作成本的一大部分,而隨著游戲平臺的性能提升,以及游戲內容需求的膨脹,游戲世界的制作成本也因應不斷提高。以上的制作方法都各有優(yōu)缺點。三維網格是合乎當代硬件的游戲世界表示方式,也是較自由的建模方式,而且有成熟的數(shù)字創(chuàng)作工具(digital content creation tool)如 3ds Max 和 Maya。但其缺點包括建模成本高、僅為表面表示方式(可能無法判斷一個任意點在其外還是其內)、不容易修改(尤其是在展開UV之后)、不容易做連續(xù)或離散級數(shù)的細致程度(level of detail, LOD)等。高度場和 BSP 的制作成本較網格低,而且較容易修改和實現(xiàn) LOD,但其適用場合就非常局限。
有沒有更好的三維游戲界的制作方式?此問題一直是游戲制作的重要探索方向。
體素
自2009年《我的世界(Minecraft)》的空前成功,根據(jù)IGN于2013年9月的報道,Minecraft 在所有平臺上已售出共三千三百萬份。體素(voxel)進入開發(fā)者的眼球,成為另一種建構游戲世界的可行方式,見圖1、2。
圖1:《我的世界》游戲截屏。
圖2: 《我的世界》游戲玩家合作制作的《冰與火之歌》中的君臨城。
簡單類比,體素就是像素的三維版本。在二維中,我們可使用顏色的二維數(shù)組表示一個影像(image);在三維中也可以用體素的三維數(shù)組表示一個柵格化的三維空間,每個體素儲存一個比特,表示該空間是實心還是空心的,如圖3。這種二元體素(binary voxel)是最簡單的體素形式,但體素還可以儲存其他屬性。例如《我的世界》的體素會儲存讓空間的材質(泥土、石、水等),而在醫(yī)學上會把CT掃描得來的X射線不透光性(opacity)儲存在體素中,如圖4。
相對于高度場地形及BSP,體素可以同時制作一般地表、山洞、建筑物等固體。
圖3:把一些體素疊起來,灰色立方體是其中之一個體素。(維基百科圖片)
圖4:以體積宣染方法去可視化CT掃瞄的體素數(shù)據(jù)。(維基百科圖片)
破壞與建設
由于體素數(shù)據(jù)的結構簡單而均勻,它相對于網格來說更容易修改。因此,游戲可以讓玩家建設游戲世界(這是一種用戶生成內容/user-generated content, UGC),也可以讓游戲規(guī)則動態(tài)改變游戲世界,例如可破壞物件(destructible object)、地形變形(terrain morphing)等。不單止修改,無中生有也是可能的──《我的世界》和《魔方世界(Cube World)》(圖5)等游戲都包含程序式生成內容(procedurally generated content),后者更可以生成一個大型的RPG地圖及游戲性內容。當然,純粹自動生成的內容不一定合乎游戲設計師的要求,但某程度的程序式生成功能可以大幅降低制作成本。
圖5:《魔方世界》完全以程序隨機生成內容,讓玩家可以不斷探索無限的世界。整個游戲僅由一對夫妻制作。
更細致的表現(xiàn)
前述的游戲例子都是使用二元體素,其棱角非常突出,雖然可視為一種風格(如8位游戲機時代的象素風格),但是否有方法改善呢?其中一個方法,就如二維影像,我們可以提升體素數(shù)據(jù)的分辨率,例如從每立方米一個體素提升至每厘米一個體素,以增強細致程度。然而,體積數(shù)據(jù)是以立方級數(shù)增長的,所需的存儲容量很高。例如一個 2563 大小的體素空間含一千六百多萬個體素(16M個);而 10243 就會增長至過10億個體素(1G 個)。即使每個體素只占1字節(jié),也需要大量儲存空間。當然,我們可以考慮在一般的應用場合中,大量相連的體素是全部空心或實心的,那么我們可以使用一些數(shù)據(jù)結構去壓縮這些原始體素數(shù)據(jù),如八叉樹。2010年 NVidia 就曾發(fā)表研究,展示如何高效地使用 GPU 去光線追蹤以稀疏體素八叉樹(sparse voxel octree, SVO)表示的嘲。在該研究中,每體素還存儲了顏色及法綫的壓縮數(shù)據(jù)。一個大教堂模型(Sibenik)壓縮后以 440MB 存儲 40963 的數(shù)據(jù),被渲染時的光綫追蹤能力達每秒1億光綫(圖6)。GigaVoxels也是相似的技術。Atomontage 引擎也是使用含顏色的體素數(shù)據(jù),但以 的方式進行壓縮,宣稱可以極高幀率實時渲染大型體素嘲(圖7)。
然而,每體素儲存顏色/法綫的方案,未必符合游戲開發(fā)所需。此方案的重點,是嘲中每個細節(jié)(例如達 1cm 的精度)都可以獨立編輯。對于在科學應用上通過掃瞄真實嘲(例如地形、建筑、生物等)得到的體素數(shù)據(jù),這種 性是必須的。然而,游戲通常只需要虛擬的嘲,玩家并不在乎大教堂中的某幅墻的凹凸是否和現(xiàn)實完全相同。從嘲制作的角度看,雖然嘲能任意雕刻,十分自由,但這種自由度反而難以管理及掌控。情況有如在二維游戲中,可任意繪畫的非常巨大的地圖。這個問題的爭論點類似在id Software的MegaTexture/虛擬紋理(virtual texturing)技術所產生的制作及游戲容量問題。以下將描述利用等值面提取及數(shù)據(jù)擴大解決細致程度及容量問題。
圖6: 把 Sibenik 模型體素化為40963的稀疏體素八叉樹(SVO),每個體素含顏色及法線,以GPU光線追蹤渲染。
圖7: Atomontage 引擎實時渲染大型體素嘲,嘲可以被動態(tài)任意破壞。
等值面提取
對于上述談到的棱角問題,以光綫追蹤渲染體素時,可以加入一些插值方式及法綫數(shù)據(jù)令效果更為平滑。另一個渲染方法,是在體素中儲存標量數(shù)據(jù),然后提取該標量場的等值面(isosurface),生成三維網格,再以普通的光柵化方式渲染。如果類比二維的情況,就如同提取高度場的等高綫(contour line),再把這些等高綫渲染。在三維的情況,我們可以存儲嘲的物質密度,或是有符號距離(signed distance),作為標量場。
給定一個標量場,我們可以使用經典的移動立方體(Marching Cubes, MC)算法去提取等值面。MC 算法十分簡單,只需掃瞄體素數(shù)據(jù),若等值(isovalue)介乎兩個相鄰體素的值之間,便使用綫性插值求出中間的等值面頂點,最后使用查表去決定如何把這些頂點連接成等值面三角網格。由于 MC 只能生成圓滑的等值面,不能表示銳利的頂點及棱,后來的對偶輪廓(dual contouring, DC)可以解決此問題,但就需要在體素中加入法綫數(shù)據(jù),效果如圖9所示。
圖8: 移動立方體(Marching Cubes, MC)算法中的15個立方體組態(tài)。每條棱兩端的值與等值比較后,若一個大于等值,一個小于等值,就在該棱上線性插值生成頂點,然后按這些組態(tài)生成三角面片。(維基百科圖片)
圖9: 對偶輪廓(dual contouring, DC)算法可以同時保持銳利的頂點及棱
CryEngine 3和C4 Engine所支持的體素建構嘲功能,都使用了這類等值面提取方式。這兩個引擎都是以體素方式解決高度場地形的缺點(如無法表示山洞)。下一代的《無盡的任務》包括兩個作品《EverQuest Next》及《EverQuest Next Landmark》整合了Voxel Farm Engine ,全面使用了等值面提取方式的體素去建構大型的游戲世界,包括地形、洞穴、建筑物等(圖10),而且還加入破壞/改變游戲環(huán)境的技能設計。
圖10: 《EverQuest Next》的嘲截屏,地形和建筑物都是用體素建模,生成圓滑或尖銳邊緣的網格,再使用紋理映射加強細節(jié)及營造游戲獨特的美術風格。
數(shù)據(jù)擴大
使用等值面提取方式后,不需要高分辨率的體素來產生圓滑的表面,可以說一方面解決了棱角的問題。但另一方面,我們如何在不大幅增加數(shù)據(jù)量的情況下,提升細致程度?其中一個通用技術就是數(shù)據(jù)擴大(data amplification)──用小量數(shù)據(jù)生成大量數(shù)據(jù)。一般高度圖地形簡單地采用多層重復密鋪(tiling)的紋理,也可算是一種簡單的數(shù)據(jù)擴大。這種方法也可以應用到等值面提取上,不過它需要更復雜的紋理映射方式,例如 C4 Engine 可混合三個平面投影去混合紋理采樣(tri-planar mapping)。要避免視覺上的重復問題,還可以考慮 Wang Tile [10] 或者其他紋理生成技術,這可能涉及如何參數(shù)化(parameterize)等值面的問題?梢詤⒖磮D11《EverQuest Next》的例子。
圖11:《EverQuest Next》混合兩個投影紋理,以映射至任何拓撲結構的生成網格。
除了表面的紋理外,還可以加強幾何方面的復雜度,例如我們可以使用位移貼圖技術(displacement mapping)去為表面加上更多細節(jié)。
數(shù)字雕刻與其他建模方式
之前談及許多體素的表示方式,以下再談可如何建立、編輯這些數(shù)據(jù),用圖形學的述語,就是建模(modeling)。體素非常適合數(shù)字雕刻(digital scupting),即是把體素當作粘土,提供貼土、推入、拉出、磨平、捏造等工具去制作模型。Mudbox(圖12)和 ZBrush 是現(xiàn)成的數(shù)字雕刻工具,但這類工具通常是基于對表面網格幾何作出修改,而不能改變模型的拓撲結構。采用體素就不會出現(xiàn)這種拓撲問題,但相對地其編輯工具還未成熟。
圖12:使用 Mudbox 在模型網格上進行數(shù)字雕刻,F(xiàn)時這類技術通常用于角色建模及紋理,通過法線/位移貼圖去增加細節(jié)。
體素的一個特點,是可以簡單地實現(xiàn)構造實體幾何(CSG)。為了更容易建模,可以使用CSG去為建筑等人工物建模,在運行時才體素化。這樣比直接雕刻省時,容易修改,而且更能節(jié)省容量,并更適合一些自動生成算法。以二維來類比,就像在Photoshop中使用矢量形狀編輯,需要時才光刪化成像素。另外,對于普通的三維網格,也可以進行體素化,但并不容易保存原來的紋理映射。
高級渲染技術
除了等值面提取及紋理貼圖等技術外,體素在渲染上還有很多可發(fā)展的技術。由于體素適合光線追蹤,近年有一些研究使用了體素為基礎的實時全局光照,例如體素圓錐追綜(voxel cone tracing)。如果游戲世界本身已經是由體素組成,就省卻體素化(voxelization)的步驟。而這種全局光照,除了常見的慢反射表面(diffuse surface)的二次反射,還可以實現(xiàn)面積光源、光澤反射/折射(glossy reflection/refraction)材質等效果,如圖13。
圖13:利用體素圓錐追綜制造全局光照。光源從上而下,在地面反射至拱門天花,紅布也有滲色(color bleeding)至天花。另外留意地面材質含有光澤反射。(此嘲本身是以三角形網格渲染。)
游戲性技術
當然,游戲并不僅是一個實時渲染器,游戲的重點是游戲性(gameplay)。許多二元體素游戲已經展示出一些與別不同的游戲性元素,在此不作詳細分析。但在技術層次上,我們還需要解決一些動態(tài)體素世界的問題,主要有物理和人工智能方面。在物理方面,最基本的要考慮等值面與剛體形撞的碰撞檢測、支撐分析(切割后懸空的部分可能需要掉落,甚至因結構問題而斷裂),此外也可研究相關的流體模擬、燃燒模擬。人工智能方面,最基本是視線查測及路徑搜尋。體素也可利于進行地理上的推理分析。
結語
傳統(tǒng)的游戲世界在游戲性、制作上都有一定限制,基于體素的制作方式可帶來各種創(chuàng)新,提高游戲品質并控制制作成本。然而,顛覆傳統(tǒng)需要各方面的配合,游戲設計、關卡設計、美術制作、游戲性編程都要注入新的思維,也必須輔以扎實的工具及制作流程。在引擎技術上,需要解決大規(guī)模世界的多分辨率建模、依 LOD 作資源串流、實時渲染、物理模擬、人工智能等各個方面的需求。
或許這也是一個機遇,可以開拓另一條游戲技術道路,制作未來具技術壁壘的創(chuàng)新游戲。
投稿郵箱:chuanbeiol@163.com 詳情請訪問川北在線:http://sanmuled.cn/