連結:http://www.cppblog.com/rise-worlds/archive/2009/04/22/80691.aspx
引言
:
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的陰影系統整合到了情境編輯器中,可以在編輯器中直接為光源指定陰影製作效果,所見即所得 (WYSIWYG),提高了開發效率。
(,在編輯器中同時使用點光源陰影和方向光產生的軟陰影)
地形系統:
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系統整合到了所有的配套開發工具中,這樣就實現了所見即所得 (WYSIWYG),美術在工具中就可以直接看到資源在遊戲中的效果,從而提高了開發效率。
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中紋理的功能仍然受限於硬體特徵。主要特性和限制見渲染器。
工具及外掛程式:
G
ameByro提供了情境編輯器,資源總管,資源的物理模型瀏覽器、動畫編輯工具,字型建立工具,以及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區別最大
的地方。
作者:葉起漣漪