2009年2月10日星期二

Nebula3渲染层:图形核心系统(CoreGraphics)

图形核心子系统主要的功能是兼容包装主机3d渲染API。它被设计成在不损失功能或运行性能的前提下支持带有可编着色的Direct3D/OpenGL类型API。图形核心子系统的基本功能和Nebula2 gfx2-子系统一样,然而图形核心系统修复了许多Nebula2图形系统的问题。

乍一看,图形核心子系统因为有更多的类看起来比Nebula2复杂。这个原因很简单,因为图形核心系统的类更小并且更专门化。大多数图形核心系统的类的功能一句话就可以说清。而Nebula2中的每个类要同时处理几件事情,所以它的类个头大,数量少。

典型的Nebula3应用程序并不需要过多地与图形核心子系统打交道,而是与更高级的子系统,如图形子系统(我们将在下一个帖子详细讨论),发生关系。

图形核心子系统一些重要的设计目标:

1.无限任何条件就可以移植到Direct3D9,Direct3D10和Xbox360:

图形核心系统允许更自由地移植到其它平台,Nebula2使用虚拟方法的方式(porting-through-virtual-functions)进行移植,而图形核心子系统使用条件预定义(porting-by-conditional-typedefs),在不损失任何性能的情况下,移植可以自由地覆写任何一个类(例如:平台相关的方法可以做为内联方法)。

2.改善资源管理:

Nebula3将降低资源的使用和资源的初始化。通过ResourceLoader类初始化资源,保持实际的资源类小且紧凑,并且资源系统更加地模块化(想要弄清楚为什么必须要解决上述问题,看看Nebula2中的nTexture2类)。

3.减少集中化:

现在使用更多的专门的单例类代替一个大的nGfxServer2类:

RenderDevice: handles rendering of primitive groups to a render target。
DisplayDevice: 处理显示设置和显示管理。
TransformDevice:管理渲染需要的变换矩阵,处理视图矩阵,投影矩阵和模型矩阵的输入,并且提供矩阵的求逆和组合。
ShaderServer:着色系统的关键,下面有详细说明。

4.改善离屏渲染

5.更大地提升着色系统:

5.1 为渲染带有许多不同对象和材质的典型场景提供降低“切换和更新着色”费用的基础。

5.2 跟Nebula2一样,一个着色基本上是一个Direct3D效果(effect)(一族的技术(techniques),每种技术包含多个渲染过程,每个渲染过程包括多个渲染状态)。

5.3 ShaderInstances是带有自己着色参数值的效果(effect)拷贝。

5.4 现在更多的是通过ShaderVariables来设置着色参数。

5.5 ShaderVariations和ShaderFeature:通过特性位掩码一个着色可以提供不同专门变量以供选择。例如,一个特征可能叫做“Depth”,“Color”,“Opauqe”,“Translucent”,“Skinned”,“Unlit”,“PointLight”,一个着色可以为特征组合如“Depth | Skinned”,“Color | Skinned | Unlit”,“Color | Skinned | PointLight”,提供专门变量。高层渲染代码将视需要来设置特征位,并依赖当前的特征位掩码,在渲染时相应的着色变量将自动被选择。结合适当的工具,ShaderVariations和ShaderFeatures将对修复各种与可着色编程相关的维护和运行问题有很大的帮助。

相比较gfx2,图形核心系统的一些其它小改动是:

1.现在可以通过EventHandlers代替原来固定在图形系统处理DeviceLost/Restored和鼠标和键盘消息处理的方式。

2.VertexBuffer和IndexBuffer现在作为公开类。

3.Vertex组件现在支持压缩格式像Short2,Short4,UBYTE4N,等等...

4.DisplayDevice提供了几个便利的方法用于获得支持显示模式列表或当前桌面显示模式,且用于获得当前显示的详细信息(硬件,厂商和驱动的版本信息)。

5.现在可以在打开应用程序窗口之前调用静态的RenderDevice::CanCreate()方法实际检查当前主机是否支持3d渲染。

原文: The Nebula3 Render Layer: CoreGraphics

[声明]:限于译者水平,文中难免错漏之处,欢迎各位网友批评指正;

没有评论:

发表评论