翻译《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。

unity3d Human skin real time rendering with blood and water drop effect真实模拟人皮实时渲染之血液和水珠掉落效果

在之前人皮肤实时渲染的基础之上添加了血液覆盖效果(blood effect)和水珠滴落效果...
  • wolf96
  • wolf96
  • 2015年03月22日 14:21
  • 3494

Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural

Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neur...

unity3d Human skin real time rendering plus 真实模拟人皮实时渲染 plus篇

最近逃课做游戏,逃的有几门都要停考了,呵呵呵,百忙之中不忘超炒冷饭,感觉之前的人皮效果还是不够好,又改进了一些东西 首先上图 放大看细节 显而易见的比上次的效果要好很多,此次我把模型用3dmax进行了...
  • wolf96
  • wolf96
  • 2015年05月15日 08:26
  • 2572
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:翻译《real-time 3d terrain engines using C++ and DX9 》(7)
举报原因:
原因补充:

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