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