引言:
GameByro是一款成熟的商業(yè)引擎,已經(jīng)被許多成功的商業(yè)項(xiàng)目所使用,不僅包括文明4、上古卷軸4,輻射3等跨平臺(tái)知名單機(jī)游戲,還有EA的大型3DMMORPG戰(zhàn)錘online。GameByro完全基于面對(duì)對(duì)象設(shè)計(jì),結(jié)構(gòu)清晰,便于使用和擴(kuò)展。靈活的可編程渲染架構(gòu)使它比較容易支持最新的圖形技術(shù)。另一方面,由于強(qiáng)調(diào)通用性,GameByro并沒(méi)有對(duì)上層應(yīng)用做太多的支持,其工具和插件大多僅具有一些通用功能,所以它更像是一個(gè)游戲開(kāi)發(fā)套件而不是一個(gè)完整的FrameWork。
引擎特性概覽:
· 跨平臺(tái)(PC,XBOX360,PS3)
· 場(chǎng)景圖表現(xiàn)為層次化的結(jié)構(gòu)
· 同目前主要的建模工具集成(插件支持)
· 高效的可視性裁剪
· 在所有的平臺(tái)上支持高級(jí)3D硬件加速
· 高級(jí)紋理和著色效果
· 動(dòng)態(tài)碰撞檢測(cè)
· 細(xì)節(jié)分級(jí)表現(xiàn)(LOD)
· 靈活的渲染,排序和裁剪算法
對(duì)象系統(tǒng):
GameByro的對(duì)象系統(tǒng)的使用遍及整個(gè)引擎,其主要實(shí)現(xiàn)如對(duì)象管理,引用計(jì)數(shù),對(duì)象生存期等功能。可以通過(guò)對(duì)幾個(gè)基類的繼承來(lái)使用對(duì)象系。
其主要特性主要有:
1. 智能指針(引用計(jì)數(shù))
2. 運(yùn)行時(shí)類識(shí)別(RTTI)
3. 場(chǎng)景對(duì)象復(fù)制
4. 序列化(對(duì)象文檔化)
5. 對(duì)象命名
6. 對(duì)象擴(kuò)展數(shù)據(jù)的管理
7. 定時(shí)器(主要用于動(dòng)畫(huà))
8. 多線程操作
驅(qū)動(dòng)層:
GameByro對(duì)圖形接口進(jìn)行了封裝,將圖形API從引擎的渲染系統(tǒng)中剝離出來(lái),在PC系統(tǒng)上,GameByro同時(shí)支持DX9和DX10兩種接口。
DX9渲染器特性:
l GameByro不允許多個(gè)DX9Renderer對(duì)象同時(shí)存在,且不能與DX10Renderer共存。但在同一幀內(nèi),GameByro的DX9Renderer可以同時(shí)渲染多個(gè)窗口。
l GameByro的DX9渲染器支持對(duì)資源的多線程訪問(wèn),同時(shí)也支持對(duì)資源的預(yù)載,但是多線程的操作仍然受到嚴(yán)格的限制。
l DX9Renderer 的固定管線蒙皮操作最少支持4塊骨骼(矩陣),同時(shí)基于shader的蒙皮操作支持30塊骨骼。
l DX9Renderer通過(guò)對(duì)后臺(tái)緩沖的多重采樣支持全屏抗鋸齒,范圍在2倍到4倍之間。
l 大多數(shù)硬件在DX9下對(duì)幾何體的一個(gè)單一的piece所能接受的光照數(shù)量都有一定的限制(指渲染的一個(gè)批),如果超過(guò)這個(gè)限制,GameByro會(huì)根據(jù)距離或者是影響因子放棄一些光照。正因如此,在應(yīng)用程序中,當(dāng)8個(gè)以上的逐頂點(diǎn)光照作用于同一對(duì)象時(shí),就會(huì)有一些被拋棄。
l DX9Renderer提供了視口的左右反向功能,用于實(shí)現(xiàn)后視鏡、立方體貼圖表面繪制等功能。
l DX9Renderer支持頂點(diǎn)霧,可以通過(guò)相關(guān)接口設(shè)置霧的最大值。
l DX9Renderer完全支持DX的紋理格式。應(yīng)用程序可以將自己的Direct3D textures提供給GameByro,引擎會(huì)自動(dòng)將其封裝到自己的材質(zhì)對(duì)象中并允許添加屬性和特效。通過(guò)提供自己的DX的紋理格式,GameByro能夠正確的使用自并非天然支持的紋理格式。
l 紋理相關(guān)特性和限制:DX9Renderer需要顯卡支持在同一pass中至少使用兩個(gè)紋理,否則渲染器則不會(huì)創(chuàng)建成功。此外受限于硬件的功能還有:
1. Cube Mapping(立方體紋理)
2. Specular Bump Mapping(凹凸鏡面貼圖)
3. Diffuse Bump Mapping(凹凸反射貼圖)
4. Non-Power-of-Two Texture Size(編長(zhǎng)非二整數(shù)冪的紋理):使用這種紋理有如下限制:紋理尋址模式必須設(shè)置為clamp,Mipmapping不能使用。
5. Texture Downsizing(紋理精度縮減)
6. Texture Compression(壓縮紋理),DX9Renderer支持載入經(jīng)過(guò)壓縮的紋理格式,并提供了紋理即時(shí)壓縮的功能。如果硬件支持壓縮紋理,DX9Renderer可以將經(jīng)過(guò)壓縮的紋理數(shù)據(jù)直接交給硬件處理,否則DX9Renderer會(huì)自動(dòng)將數(shù)據(jù)解壓后再交給硬件。
7. Texture Apply Modes Supported:DX9Renderer不支持APPLY_DECAL紋理應(yīng)用模式。
8. Texture Format Requests(紋理格式要求):精確的紋理像素映射依賴于目標(biāo)硬件和顯示器像素位寬。
9. Palettized Texture Formats(調(diào)色板紋理格式的支持)。
10. Sphere Mapping(球面映射):GameByro中所有的渲染器都支持世界空間中的球面映射。
11. DX9Renderer支持加載包括DDS、TGA、BMP格式的文件。Cube textures和volume textures都能被正確的加載,但是只能通過(guò)三維坐標(biāo)尋址。
12. GameByro的編輯器支持導(dǎo)出DX原格式的紋理,并在加載的時(shí)候不進(jìn)行格式轉(zhuǎn)換。將DX格式的紋理直接交給DX處理。
引擎渲染系統(tǒng)分析
GameByro的渲染是由幀渲染系統(tǒng)(Frame Rendering System) 控制的,幀渲染系統(tǒng)封裝了每一個(gè)批次的繪制過(guò)程,這樣可以方便的控制整個(gè)渲染流程。
陰影系統(tǒng):
GameByro的陰影系統(tǒng)是使用幀渲染系統(tǒng)的典范,通過(guò)對(duì)已有的類以繼承的方式進(jìn)行功能擴(kuò)展,實(shí)現(xiàn)了靈活的陰影渲染功能。GameByro自身支持三種光源的陰影圖生成,分別為點(diǎn)光源(全方向光)、平行光、聚光燈。
陰影系統(tǒng)統(tǒng)一由一個(gè)管理器負(fù)責(zé)控制。陰影的算法被封裝成了一個(gè)個(gè)類對(duì)象中。系統(tǒng)中同時(shí)存在著幾種陰影技術(shù),即可以選擇使用,也可以同時(shí)使用幾種陰影技術(shù)作用于同一幾何體。陰影系統(tǒng)會(huì)自動(dòng)裁剪掉那些沒(méi)有陰影接受體的光源,同時(shí)在計(jì)算每個(gè)光源所產(chǎn)生的陰影時(shí),會(huì)裁剪掉那些不受此光源影響的幾何體,達(dá)到性能優(yōu)化的目的。用戶很容易對(duì)陰影系統(tǒng)進(jìn)行擴(kuò)展,實(shí)現(xiàn)自己的陰影算法。
GameByro的陰影主要是基于shadowMap技術(shù),點(diǎn)光源使用了立方體陰影圖,軟陰影則使用了方差陰影圖技術(shù)(VSM)。
GameByro的陰影系統(tǒng)集成到了場(chǎng)景編輯器中,可以在編輯器中直接為光源指定陰影效果,所見(jiàn)即所得,提高了開(kāi)發(fā)效率。
(如圖所示,在編輯器中同時(shí)使用點(diǎn)光源陰影和方向光產(chǎn)生的軟陰影)
地形系統(tǒng):
GameByro的terrain是簡(jiǎn)單易用的,并且方便為其擴(kuò)展,用以滿足項(xiàng)目的其他功能需求。
地形系統(tǒng)由以下幾部分組成:
1. NiTerrainComponent:是整個(gè)地形系統(tǒng)的入口,通過(guò)Terrain Interactor可以像訪問(wèn)容器一樣訪問(wèn)NiTerrainComponent所有的sub-component。
2. Terrain Interactor 地形迭代器,通過(guò)Terrain Interactor可以啟動(dòng)所有的數(shù)據(jù)查詢,比如簡(jiǎn)單的碰撞檢測(cè),meta-data查詢,高度圖導(dǎo)入和文件加載。幾乎所有基于terrain系統(tǒng)的操作都是通過(guò)Terrain Interactor完成的。
3. NiTerrainSectorComponent 的內(nèi)部主要包含一個(gè)負(fù)責(zé)組織地形數(shù)據(jù)塊的四叉樹(shù)。此對(duì)象負(fù)責(zé)從磁盤(pán)加載執(zhí)行物體與地形的射線相交查詢,轉(zhuǎn)換地形幾何體,管理內(nèi)部資源(包括共享的頂點(diǎn)流和shader)。同時(shí)NiTerrainSectorComponent還負(fù)責(zé)進(jìn)行四叉樹(shù)的遮擋查詢和生成可見(jiàn)集。
4. Data Leaves and Blocks 四叉樹(shù)的切分等級(jí)是通過(guò)NiTerrainComponent設(shè)置的,四叉樹(shù)的每個(gè)節(jié)點(diǎn)都包含一個(gè)地形塊,塊的邊長(zhǎng)必須是2的整數(shù)冪。四叉樹(shù)的根節(jié)點(diǎn)等級(jí)為N,葉節(jié)點(diǎn)為0,由高到底細(xì)節(jié)依次增加,等級(jí)為0的葉節(jié)點(diǎn)所包含的地形塊擁有最高的細(xì)節(jié)。
5. Material Layers:地形系統(tǒng)通過(guò)掩碼圖來(lái)為地形指定材質(zhì)。掩碼的數(shù)據(jù)指定了地表的每個(gè)部分所對(duì)應(yīng)的材質(zhì)。同一地表最多支持四種材質(zhì),根據(jù)各自的權(quán)重進(jìn)行混合,權(quán)重?cái)?shù)據(jù)也是通過(guò)掩碼來(lái)獲得。
材質(zhì)在地形的渲染系統(tǒng)中扮演著很特殊的角色,可以通過(guò)對(duì)材質(zhì)指定meta-data來(lái)附載其他的信息(比如在雪地行走的聲音),同時(shí)也可以通過(guò)對(duì)材質(zhì)的紋理貼圖為地表增加頂點(diǎn)或像素著色程序。此外每種材質(zhì)可以包含如下指定類型的紋理貼圖:
l Diffuse/Base Map 反射貼圖,通過(guò)3或4個(gè)通道決定反射光的顏色。
l Detail Map 細(xì)節(jié)貼圖,為反射貼圖提供Alpha值。
l Normal Map 法線貼圖。
l Parallax Map 視差貼圖,用來(lái)保存表面像素的高度偏移信息。
此外GameByro還提供了簡(jiǎn)單的地形射線追蹤和水面渲染。地形射線追蹤目前的實(shí)現(xiàn)很簡(jiǎn)單,就是用一個(gè)射線查詢地表的三角形,以后會(huì)與Physics進(jìn)行集成,支持通過(guò)物理引擎l實(shí)現(xiàn)物體與地表的碰撞檢測(cè)。水面渲染主要是用兩張紋理動(dòng)畫(huà)混合而成,通過(guò)凹凸貼圖來(lái)表現(xiàn)水波。引擎為水面所在的地表生成一個(gè)灰度圖,保存地表距離水面的高度。這里預(yù)先定義了兩種顏色,深水顏色和淺水顏色,如果水面以下沒(méi)有地表就直接使用深水顏色。再像素著色器中可以對(duì)高度圖進(jìn)行采樣,從而得出當(dāng)前像素的水深,然后根據(jù)這個(gè)深度在深色和淺色之間進(jìn)行差值,得到最終水的顏色。不過(guò)這個(gè)效果并不是很理想,如需更好的效果,還需要對(duì)其進(jìn)行擴(kuò)展,比如說(shuō),增加反射和折射等。
材質(zhì):
GameByro的材質(zhì)主要是通過(guò)3DMAX的插件進(jìn)行編輯的,并提供了標(biāo)準(zhǔn)的材質(zhì)節(jié)點(diǎn)。
(在GameByro中,材質(zhì)節(jié)點(diǎn)的主要作用是負(fù)責(zé)根據(jù)著色過(guò)程生成相應(yīng)的shader代碼)這個(gè)節(jié)點(diǎn)一共有9個(gè)通道,并提供了大量可供調(diào)整的參數(shù),這樣就可以讓美術(shù)方便的使用逐像素光照、視差貼圖、環(huán)境體貼圖這些效果,在游戲中,GameByro通過(guò)不同的材質(zhì)屬性和不同的光照環(huán)境編譯出不同的shader代碼,以二進(jìn)制的形式保存在磁盤(pán)上,下次啟動(dòng)時(shí)載入內(nèi)存,這樣就不用重復(fù)編譯,但在第一次進(jìn)入游戲中時(shí)會(huì)有些延遲。靈活強(qiáng)大的材質(zhì)是次世代引擎的重要特征,GameByro在這方面做到了靈活,但是美術(shù)仍然不能通過(guò)可視化工具控制材質(zhì)的處理過(guò)程,只能編輯資源和修改參數(shù),編輯性還不夠強(qiáng)大。
Shader:
GameByro提供了一個(gè)極具擴(kuò)展性的shader系統(tǒng),并將它與藝術(shù)創(chuàng)作工具緊密結(jié)合。GameByro定義了自己的shader格式,基于文本的.NSF文件和基于二進(jìn)制的.NSB文件,.NSF文件編譯后生成.NSB文件,這個(gè)過(guò)程即可以在開(kāi)發(fā)時(shí)完成,也可以在運(yùn)行時(shí)進(jìn)行。 .NSF文件使用的是GameByro自定義的語(yǔ)法,并使用自己的語(yǔ)法分析器將其編譯成相關(guān)平臺(tái)的代碼。實(shí)際上,GameByro的shader系統(tǒng)在應(yīng)用程序和GPU程序之間做了一層封裝,屏蔽了不同平臺(tái)之間的差異,使得應(yīng)用程序可以用相同的接口來(lái)與GPU之間進(jìn)行交互,而GPU程序最終還是通過(guò)cg或hlsl來(lái)實(shí)現(xiàn)的,這樣做的好處是,當(dāng)平臺(tái)發(fā)生改變時(shí),只需要根據(jù)具體的平臺(tái)來(lái)編寫(xiě)相應(yīng)的shader程序,而不需要去修改應(yīng)用程序。當(dāng)然,shader系統(tǒng)也直接支持cg和hlsl格式的文件,使用方法同NSF、NSB文件相似。GameByro的Shader系統(tǒng)提供了一套完整的查錯(cuò)機(jī)制,方便使用者對(duì)程序進(jìn)行debug。
GameByro的shader系統(tǒng)集成到了所有的配套開(kāi)發(fā)工具中,這樣就實(shí)現(xiàn)了所見(jiàn)即所得,美術(shù)在工具中就可以直接看到資源在游戲中的效果,從而提高了開(kāi)發(fā)效率。
GameByro通過(guò)引入自己的shader文件格式為跨平臺(tái)提供了方便,同時(shí)也增加了系統(tǒng)的復(fù)雜性,使用起來(lái)稍微有點(diǎn)繁瑣,開(kāi)發(fā)人員又不得不去熟悉它的語(yǔ)法,如果開(kāi)發(fā)中不考慮跨平臺(tái)的話,想要自己開(kāi)發(fā)特效,也可以不使用NSF文件,直接使用fx格式的文件。
引擎自帶的特殊材質(zhì):
AdditiveLightMapsMaterial(附加光照?qǐng)D材質(zhì),使用額外的光照?qǐng)D紋理來(lái)混合當(dāng)前場(chǎng)景光照計(jì)算的結(jié)果。下面的插圖是使用投射光照?qǐng)D紋理的渲染效果。)
AlphaTextureBlender(紋理Alpha混合)
Aniso(各向異性光照,左下的飛機(jī))、Halo(光暈效果。上面的飛機(jī))
ASMSkinningLighting(參與光照計(jì)算的骨骼動(dòng)畫(huà)蒙皮)
ASMSkinningNoLighting(不參與光照計(jì)算的骨骼動(dòng)畫(huà)蒙皮,效率經(jīng)過(guò)了優(yōu)化)
BaseBumpWithSpatialGlow(帶有輝光效果的凹凸貼圖)
Chrome(金屬外表,使用基本紋理、漫反射cube map、鏡面反射cube map、法線貼圖等效果實(shí)現(xiàn)類似于金屬表面的光澤和質(zhì)感,并支持基于此效果的蒙皮操作)
Colorize(使用一個(gè)自定義的屬性來(lái)動(dòng)態(tài)的設(shè)置或者修改顏色)
FXSkinning and HLSLSkinning(使用可編程渲染管線進(jìn)行骨骼動(dòng)畫(huà)的蒙皮)
GeneralGlow(普通輝光效果)
GeneralDiffuseSpecularGlow(普通鏡面反射高光輝光)
GeneralDiffuseSpecular(普通鏡面反射高光,支持蒙皮操作)
Dot3BumpMap(凹凸貼圖,右圖為蒙皮效果)
Glass (玻璃效果)
OilyFilm(油狀薄膜)
LuminanceTransfer(類似于熱源偵測(cè)儀的效果)
Outlining(藍(lán)圖或草圖)
ParallaxMapping(視差貼圖,下面右圖是使用了ParallaxMapping的效果)
PerPixelLighting(逐像素光照,同時(shí)支持固定管線和可編程渲染管線)
SkinnedToonShadingWithOutline(卡通渲染,支持骨骼蒙皮、描邊)
紋理:
GameByro的紋理系統(tǒng)支持多重紋理、投射紋理、動(dòng)態(tài)紋理、特效紋理,并且使用紋理的一些高級(jí)特性是平臺(tái)無(wú)關(guān)的。當(dāng)然GameByro中紋理的功能仍然受限于硬件特征。主要特性和限制見(jiàn)渲染器。
工具及插件:
GameByro提供了場(chǎng)景編輯器,資源瀏覽器,資源的物理模型瀏覽器、動(dòng)畫(huà)編輯工具,字體創(chuàng)建工具,以及3DMAX、MAYA插件,材質(zhì)編輯是在插件中進(jìn)行的,這套工具包含了完整的3D資源開(kāi)發(fā)流程。
物理系統(tǒng)
GameByro通過(guò)PhysX提供物理仿真模擬,只需幾行簡(jiǎn)單的代碼就可以將GameByro的場(chǎng)景和PhysX建立起聯(lián)系,不過(guò)需要在顯式的調(diào)用相關(guān)接口來(lái)進(jìn)行物理仿真對(duì)象和場(chǎng)景對(duì)象間的同步,即將物理仿真的結(jié)果作用于場(chǎng)景中的對(duì)象。同時(shí),還可以通過(guò)參數(shù)來(lái)決定是否需要等待物理仿真運(yùn)算的結(jié)果。這就保證了一定的靈活性,例如,用戶可以不對(duì)靜態(tài)物體進(jìn)行同步,達(dá)到優(yōu)化的目的。還可以通過(guò)把更新的接口放在下一次循環(huán)開(kāi)始的時(shí)候調(diào)用,這樣可以減少由于等待物體仿真模擬造成線程的阻塞,充分的利用了CPU資源。
粒子系統(tǒng):
GameByro的粒子系統(tǒng)為3ds max 和 Maya等粒子生成工具提供了完整的插件系統(tǒng),并完全支持軟粒子,即粒子會(huì)受到力的影響。
流處理引擎:
GameByro實(shí)現(xiàn)了一個(gè)完全跨平臺(tái)的流處理引擎。使用者可以方便的利用它完成多線程任務(wù),如資源的加載等,完全發(fā)揮多處理器平臺(tái)的威力,而不用關(guān)注底層細(xì)節(jié)。
效率分析:
為了對(duì)GameByro進(jìn)行全面的評(píng)估,筆者試著對(duì)GameByro的渲染效率進(jìn)行了簡(jiǎn)單的測(cè)試,本人的機(jī)器配置如下:
l CPU:E2180
l GPU:2400PRO
l 內(nèi)存:2GB
基本可以代表當(dāng)前中低端玩家的配置。
場(chǎng)景一:
下圖為一個(gè)大的室外地形場(chǎng)景,包括建筑物、水面,地表使用了法線貼圖,除了植被以外,基本包含MMORPG的大部分室外場(chǎng)景要素。最后測(cè)試的結(jié)果平均幀數(shù)為21幀。幀數(shù)偏低的原因是整個(gè)場(chǎng)景使用了逐像素光照,同時(shí)沒(méi)有采用LOD進(jìn)行優(yōu)化。
場(chǎng)景二:
如圖所示場(chǎng)景中有100個(gè)角色在做不同的動(dòng)畫(huà),每個(gè)角色有51個(gè)骨骼,整個(gè)場(chǎng)景共有287900個(gè)多邊形和556600個(gè)頂點(diǎn),并且場(chǎng)景中有一個(gè)點(diǎn)光源和平行光源,在沒(méi)有陰影的情況下幀數(shù)大約在27~28幀左右。這些骨骼動(dòng)畫(huà)使用了GameByro提供的骨骼動(dòng)畫(huà)優(yōu)化方法,性能有一定提升。
由以上結(jié)果可以看出,GameByro的骨骼動(dòng)畫(huà)渲染效率尚可,而室外地形渲染系統(tǒng)的性能稍顯不足,再?zèng)]有角色和植被的情況下,僅能達(dá)到22幀左右,如果在實(shí)際的游戲環(huán)境還要算上其他游戲系統(tǒng)(網(wǎng)絡(luò)、邏輯、UI等)的性能消耗,這是不足以讓玩家流暢進(jìn)行游戲的,還需進(jìn)一步手動(dòng)的優(yōu)化。
總結(jié):
GameByro擁有一套靈活的架構(gòu),便于使用和擴(kuò)展,易于上手;配套的開(kāi)發(fā)工具比較齊全,擁有完整的美術(shù)開(kāi)發(fā)流程;完全支持跨平臺(tái),便于游戲的移植;同時(shí)由于為了保證靈活性,在設(shè)計(jì)上面比較偏重于功能和擴(kuò)展,而不是性能。
高度的可定制性帶來(lái)的是較低的整合,GameByro沒(méi)有提供游戲框架,地圖編輯器也僅僅實(shí)現(xiàn)了最通用的功能,即地表和物件的擺放。這就說(shuō)明,如果要使用GameByro開(kāi)發(fā)產(chǎn)品,就需要自己整合GameByro,并對(duì)其進(jìn)行一定的修改和擴(kuò)展。這也是它與UnrealEngine3區(qū)別最大的地方。
作者:葉起漣漪