翻译《real-time 3d terrain engines using C++ and DX9 》(7)

翻译 2007年09月15日 13:39:00
  
模型资源
       cModelResource类可能是我们将会使用的最重要的类了,它当然是我们最经常使用的资源。这个资源类是一个完整的基于D3DXFRAME层级树的容器。因为复合节点可以背这些对象包含,cModelResource在游戏中可以代表不只一个的物理物体。例如,一个格斗者人物角色可能包含一个完整的制作了动画的骨骼,蒙好了皮的皮肤和衣服网格,和每个武器或者盾牌的静态模型。每个网格一次维护到cRenderMethods和cSurfaceMaterial对象的连接,使cModelResource对象在我们的引擎中表现得是一个完全的实体(entity),而不仅仅是一个几何体。
       正如先前提到的,我们漂亮的使用D3DXFRAME层级来完成这种存储。这些对象在第二章“Fundamental 3D Objects”中有描述,可以作为理想的骨骼动画和蒙皮网格的存储方法。一个D3DX对这些结构的实现的很大特点就是他们是用户可扩展的。通过从D3DXFRAME和D3DXMESHCONTAINER中派生得到我们自己的结构,我们可以在这些积累提供数据的顶部添加我们自己的针对平台的数据。
       这很重要,因为他允许我们我们挂接我们自定义资源,cEffectFile和cSurfaceMaterial。这将D3DX提供的简单的单纹理包装的的网格转化为HLSL着色的,符合纹理数据库。使用这些扩展的类需要创建一个D3DX接口来管理帧层级中的结点。然而,第一步是申明我们的新数据类型。清单4.6展示了我们对D3DXFRAME和D3DXMESHCONTAINER的扩展。
 
我们对D3DXFRAME基类的增加是最小化的。用来构建层级数D3DXFRAME_DERIVED对象被分配到一个固定数组中。因此,即使我们使用一个树结构去使用这个数据,我们怡然可以使用它在线性数组中唯一的索引标识每个节点。我们可以这么做因为可以假定我们的D3DXFRAME_DERIVED树不可以动态改变大小和顺序。一旦一个层级被加载,它在它余下的生命中都保持同样的结构。
为了比D3DXFRAME提供的更多的维护家族(family)信息,我们可以在存储他们的数组中使用索引值去标识任何可能的父对象和根对象。frameIndex是整棵树的根节点。prentIndex指向该节点的上一个父节点。使用-1(word值为0xffff)标识未使用的索引值。
为什么不使用指针?这些数据打算作为引用对象。这个课模型的符合实例可以被放在我们的世界中,每个都有它自己的D3DXFRAME_DERIVED结构集合。这些唯一的结构将包含帧节点每个实例的变换矩阵。通过存储我们的家族(family)信息而不是指针作为索引值,就更容易为该模型创建一个新的实例,仅仅通过为框架对象分配新的数组然后拷贝数据就可以了。不能协商,因为索引值和存储数据的数组的根相关。
D3DXMESHCONTAINER_DERIVED结构更复杂一些。在D3DXMESHCONTAINER基类顶部,我们增加了所有我们引擎特有的数据。这包括一个网格使用的cRenderMethods和cSurfaceMaterials的链表,网格的蒙皮信息和网格本身。我们将我们自己的D3DMEHSDATE结构同基类包含的那个分开存储,这样可以在系统内存中的模型和我们的渲染方法将要使用的经过优化并且载入显存中的模型的维护他们分离。
除了允许我们扩展积累,为框架树提供文件I/O的D3DX函数也可以被扩展以提供我们自定义数据。这将创建一个扩展自Direct3D X文件格式的符合我们需求的接口。这要求我们创建3个关键接口类:一个负责分配和销毁我们的数据结构,一个负责在X文件中保存这些结构,一个负责从X文件中加载这些数据。
这3个接口都在D3DX类ID3DXAllocateHierarchy,ID3DXLoadUserDate和D3DXSaveUserDate中提供。为了增加我们自己的数据,我们简单的从这些接口中派生我们的类,并且为每个基类中定义的纯虚函数提供实现。位于随书光盘的d3dx_frame_manager源文件展示了这些函数。这些文件比我们希望的用文字更好的从细节上展示了分配,清除和文件I/O。

翻译《real-time 3d terrain engines using C++ and DX9 》

 翻译《real-time 3d terrain engines using C++ and DX9 》 心血来潮啊,决定要翻译《real-time 3D terrain engines using ...
  • June_wu
  • June_wu
  • 2008年12月11日 11:36
  • 2742

翻译《real-time 3d terrain engines using C++ and DX9 》(4)

 管理共享数据资源       引擎包含集中不同的共享数据。这些资源表示的数据在多人游戏中访问和共享。例子包括纹理,顶点缓存,索引缓存和渲染方法。事实上,许多共享资源都是依赖于显卡,因为他们使用显存作...
  • gamedevers
  • gamedevers
  • 2007年09月13日 12:37
  • 1044

翻译《real-time 3d terrain engines using C++ and DX9 》(5)

资源基类       所有的引擎资源对象都是从cResourcePoolItem类中继承得到的。这个类提供了一个cResourcePoolManager类能够使用的函数的集合,用以创建,销毁,从磁盘保...
  • gamedevers
  • gamedevers
  • 2007年09月13日 20:29
  • 1400

翻译《real-time 3d terrain engines using C++ and DX9 》(8)

 渲染队列(the render queue)    维护一个像我们这样的渲染管线最重要的一个方面就是控制那些程序所要求的昂贵的状态改变(state changes)开销。一个“状态改变”就是指示显卡...
  • gamedevers
  • gamedevers
  • 2008年06月20日 02:45
  • 859

翻译《real-time 3d terrain engines using C++ and DX9 》(3)

       cGameHost包含的一个关键管理对象就是资源管理器(resource manager).我们的程序使用他自己的管理系统来管理我们将要创建的设备。这个资源管理系统的根,cResourc...
  • gamedevers
  • gamedevers
  • 2007年09月13日 12:23
  • 1011

翻译《real-time 3d terrain engines using C++ and DX9 》(2)

 主程序(the application host)       为了添加我们自己的程序控制层,我们将以Direct3d sample framewrok提供类为基础来简历我们自己的类。框架类CD3D...
  • gamedevers
  • gamedevers
  • 2007年08月26日 14:22
  • 1518

翻译《real-time 3d terrain engines using C++ and DX9 》(1)

         系列文章 all by G.I.N ~oo~心血来潮啊,决定要翻译《real-time 3D terrain engines using C++ and DX9》,希望多广大的游戏爱...
  • gamedevers
  • gamedevers
  • 2007年08月25日 13:06
  • 1949

翻译《real-time 3d terrain engines using C++ and DX9 》(6)

 索引缓存和顶点缓存       索引缓存和顶点缓存资源在例子引擎中使用得非常频繁,并且把他们作为独立资源是很有用的。对我们引擎的大部分数据来说,在那些传统模型不提供索引和顶点缓存的时候保留他们然后在...
  • gamedevers
  • gamedevers
  • 2007年09月14日 14:52
  • 908

Real Time 3D Terrain Engines Using C++ And DX9 翻译

看了nasi写的Real Time 3D Terrain Engines Using C++ And DX9的翻译,我也准备接着他的写,在接下来的日子我将从chapter 7开始,前面的请见http:...
  • xpcer
  • xpcer
  • 2009年02月11日 21:29
  • 325

译:Real-Time 3D Terrain Engines Using C++ And DirectX9(2)

 第一章以DirectX 9.0和D3DX开始对Microsoft Windows平台的3D图形程序新手来说,DirectX是提供底层多媒体应用程序接口(API)的高性能,低级的库。DirectX是以...
  • lqh12345
  • lqh12345
  • 2009年02月05日 23:44
  • 1145
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:翻译《real-time 3d terrain engines using C++ and DX9 》(7)
举报原因:
原因补充:

(最多只允许输入30个字)