链接: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的阴影系统集成到了场景编辑器中,可以在编辑器中直接为光源指定阴影效果,所见即所得,提高了开发效率。
(如图所示,在编辑器中同时使用点光源阴影和方向光产生的软阴影)
地形系统:
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区别最大的地方。
作者:叶起涟漪