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