DirectX游戏编程第11章(全20章).ppt_第1页
DirectX游戏编程第11章(全20章).ppt_第2页
DirectX游戏编程第11章(全20章).ppt_第3页
DirectX游戏编程第11章(全20章).ppt_第4页
DirectX游戏编程第11章(全20章).ppt_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2 第11章网格 1 在DirectX中 除了ID3DXMesh接口从ID3DXBaseMesh接口继承外 另一个主要的Mesh接口ID3DXPMesh ProgressiveMesh 也从ID3DXBaseMesh接口继承 如何运用不同类型的Mesh接口 也将是本章讨论的内容 主要目标 学习ID3DXMesh对象的内部数据组织 学习ID3DXMesh对象的创建 学习ID3DXMesh对象的优化方法 渲染ID3DXMesh对象 3 11 1几何信息 ID3DXBaseMesh接口包括了一个用于保存网格中顶点数据的顶点缓冲区和一个用于记录三角形顶点在顶点缓冲区中索引信息的索引缓冲区 在ID3DXBaseMesh中 可以通过下面的方法得到指向这些缓冲区的指针 HRESULTID3DXMesh GetVertexBuffer LPDIRECT3DVERTEXBUFFER9 ppVB HRESULTID3DXMesh GetIndexBuffer LPDIRECT3DINDEXBUFFER9 ppIB 可以通过下列方式对这些方法进行调用 IDirect3DVertexBuffer9 vb 0 Mesh GetVertexBuffer 4 11 1几何信息 如果需要锁定缓冲区以进行缓冲区读写 可以通过下面的方法来实现 注意这里锁定的将是整个顶点缓冲区或索引缓冲区 HRESULTID3DXMesh LockVertexBuffer DWORDFlags BYTE ppData HRESULTID3DXMesh LockIndexBuffer DWORDFlags BYTE ppData 对锁定缓冲区的访问结束后 应该调用相应的Unlock方法解除缓冲区锁定 如下所示 HRESULTID3DXMesh UnlockVertexBuffer HRESULTID3DXMesh UnlockIndexBuffer 5 11 1几何信息 下面是ID3DXMesh接口提供的用于获得相关几何数据信息的另外几个方法 DWORDGetFVF 返回一个描述顶点格式的DWORDDWORDGetNumVertices 返回顶点缓冲区中的顶点数目DWORDGetNumBytesPerVertex 返回每个顶点所用的字节数DWORDGetNumFaces 获得网格的面数 6 11 2网格子集 Subset 和属性缓冲区 网格由一个或者多个网格子集组成 网格子集是一个网格中可被按照同样属性进行渲染的三角形的集合 图11 1阐述了一个代表房子的网格怎样被划分成不同的网格子集 7 11 2网格子集 Subset 和属性缓冲区 每个三角形对应的子集ID被存储在网格的属性缓冲区中 这个缓冲区是一个DWORD类型的数组 由于网格中的每一个面 一个三角形对应一个面 在属性缓冲区中都有一个对应的元素 因此缓冲区中的元素个数等于网格中面的数量 图11 2展示了属性缓冲区中的元素与索引缓冲区中的三角形之间的对应关系 8 11 2网格子集 Subset 和属性缓冲区 通过如下代码 可以锁定属性缓冲区 并获得指向属性缓冲区的指针 DWORD buffer 0 Mesh LockAttributeBuffer lockingFlags 9 11 3网格的渲染 ID3DXMesh接口提供了DrawSubset方法来渲染指定网格子集中的所有三角形 如果要渲染整个网格 就需要渲染网格中的所有子集 可以按顺序为每个网格子集指定网格ID为0 1 2 n 1 这里n是网格子集的数量 然后依次指定每个网格子集对应的材质和纹理 最后 通过简单的循环就可以渲染一个完整的网格 for inti 0 iSetMaterial mtrls i Device SetTexture 0 textures i Mesh DrawSubset i 10 11 4网格优化 网格的顶点和索引可以进行重新组织以便更有效率地渲染网格 即对网格进行优化 在ID3DXMesh接口中对网格的优化通过如下方法进行 HRESULTID3DXMesh OptimizeInplace DWORDFlags CONSTDWORD pAdjacencyIn DWORD pAdjacencyOut DWORD pFaceRemap LPD3DXBUFFER ppVertexRemap 11 11 4网格优化 另一个可以使用的 与OptimizeInplace类似的方法是Optimize 使用Optimize时 可以通过最后一个参数返回一个新的优化过的网格 而不是对所调用的网格本身进行优化 此方法的原型如下 HRESULTID3DXMesh Optimize DWORDFlags CONSTDWORD pAdjacencyIn DWORD pAdjacencyOut DWORD pFaceRemap LPD3DXBUFFER ppVertexRemap LPD3DXMESH ppOptMesh 通过这个参数传出优化后的网格 12 11 5网格属性表 当使用D3DXMESHOPT ATTRSORT标志对网格进行优化后 网格中的几何图元将被按照其属性重新划分到顶点缓冲区和索引缓冲区的连续存储块中 这些存储块就是将用于渲染的网格子集 在图11 3中 几何图元和对应的属性缓冲区都被按照属性排序过 因此同一种属性的几何图元在缓冲区中是连续的 13 11 5网格属性表 这个属性表就是一个存放D3DXATTRIBUTERANGE结构的数组 属性表里的每一个元素都对应到网格中的一个网格子集 用于描述这个网格子集中的几何图元在顶点缓冲区和索引缓冲区中的存储信息 D3DXATTRIBUTERANGE结构声明如下 typedefstruct D3DXATTRIBUTERANGE DWORDAttribId DWORDFaceStart DWORDFaceCount DWORDVertexStart DWORDVertexCount D3DXATTRIBUTERANGE 14 11 5网格属性表 通过下面的方法访问网格属性表 HRESULTID3DXMesh GetAttributeTable D3DXATTRIBUTERANGE pAttribTable DWORD pAttribTableSize 这个方法可以用来完成两个任务 返回属性表中存储的元素的数量 通过一个D3DXATTRIBUTERANGE结构的数组来获得指定的属性数据 15 11 5网格属性表 如果需要得到属性表里面元素的数量 需要再把第一个参数赋值为0 DWORDnumSubsets 0 Mesh GetAttributeTable 0 16 11 6邻接信息 邻接数组是一个DWORD类型的数组 邻接数组中的每一个元素都对应于网格中的一个三角形 比如 第i个元素代表了由以下这三个索引所组成的三角形 A i 3B i 3 1C i 3 2注意当邻接数组存储的元素值为ULONG MAX 4294967295 时 表示三角形当前的边没有邻接三角形 17 11 6邻接信息 由于三角形有三个边 因此每一个三角形都会有三个邻接三角形 在图11 4中 每一个三角形都在邻接数组里面有三个对应元素来指明与其邻接的三角形 邻接数组的大小必须为网格中的面数的三倍 假设面为三角形 用来存放网格中每个三角形对应的三个邻接三角形的索引值 18 11 6邻接信息 许多D3DX的网格创建函数都可以输出邻接信息 也可用下面的方法来获得邻接信息 HRESULTID3DXMesh GenerateAdjacency FLOATfEpsilon DWORD pAdjacency 例如 DWORDadjacencyInfo Mesh GetNumFaces 3 Mesh GenerateAdjacency 0 001f adjacencyInfo 19 11 7网格的克隆 Cloning 需要把一个网格的数据拷贝到另一个网格中去 这个工作可以通过ID3DXBaseMesh CloneMeshFVF方法来完成 HRESULTID3DXMesh CloneMeshFVF DWORDOptions DWORDFVF LPDIRECT3DDEVICE9pDevice LPD3DXMESH ppCloneMesh 20 11 7网格的克隆 Cloning 注意这个方法允许目标网格的灵活顶点格式和源网格的灵活顶点格式不同 例如 假设现有的网格的灵活顶点格式为D3DFVF XYZ 而需要灵活顶点格式为D3DFVF XYZ D3DFVF NORMAL的网格 那么可以按照以下方法编写程序 假定mesh和device都是可用的ID3DXMesh clone 0 Mesh CloneMeshFVF Mesh GetOptions 使用与源网格同样的设置D3DFVF XYZ D3DFVF NORMAL 指定目标网格的FVFDevice 21 11 8网格的创建 D3DXCreateMeshFVF 下面显示了如何使用D3DXCreateMeshFVF函数来创建一个网格 HRESULTD3DXCreateMeshFVF DWORDNumFaces DWORDNumVertices DWORDOptions DWORDFVF LPDIRECT3DDEVICE9pDevice LPD3DXMESH ppMesh 22 11 8网格的创建 D3DXCreateMeshFVF 还可以用D3DXCreateMesh方法来创建网格 它的原型是 HRESULTD3DXCreateMesh DWORDNumFaces DWORDNumVertices DWORDOptions CONSTLPD3DVERTEXELEMENT9 pDeclaration LPDIRECT3DDEVICE9pDevice LPD3DXMESH ppMesh 23 11 8网格的创建 D3DXCreateMeshFVF D3DXDeclaratorFromFVF通过一个给定的FVF输出一个D3DVERTEXELEMENT9结构的数组 注意这里MAX FVF DECL SIZE是一个枚举变量 定义如下 typedefenum MAX FVF DECL SIZE 18 MAX FVF DECL SIZE 24 11 9示例 创建并渲染一个网格 本节的示例程序将渲染一个代表箱子的网格 如图11 5所示 这个示例展示了在本章讨论的大部分函数 包括下面的操作 创建一个网格 为网格填充立方体的几何信息 指定网格中的网格子集 创建网格邻接信息 优化网格 渲染网格 25 11 9示例 创建并渲染一个网格 在函数中首先创建一个网格 boolSetup HRESULThr 0 hr D3DXCreateMeshFVF 12 24 D3DXMESH MANAGED Vertex FVF Device 要完成这些工作 先锁定这两个缓冲区 然后把数据填写到缓冲区中 参见教材P170 26 11 9示例 创建并渲染一个网格 在这个示例中 指定索引缓冲区里的前4个三角形存在于网格子集0中 接下来4个三角形存在于网格子集1中 最后4个三角形 总共12个 存在于网格子集2中 可以通过下面的代码来完成这些工作 参见教材P170在优化网格之前 必须要计算出网格的邻接信息 std vectoradjacencyBuffer Mesh GetNumFaces 3 Mesh GenerateAdjacency 0 0f 27 11 9示例 创建并渲染一个网格 下面通过这个示例输出的MeshDump txt文件中的内容 展示通过dumpAttributeTable 函数输出的网格属性表信息 参见教材P172可以发现这些数据与我们为网格所指定的数据 3个网格子集 每个网格子集里面有4个三角形 完全吻合 最后 可以用下面的代码来渲染网格 在渲染方法中循环遍历每一个网格子集 设置相关的纹理 然后渲染网格子集 28 11 9示例 创建并渲染一个网格 渲染实际上是一个很简单的工作 boolDisplay floattimeDelta if Device 这里更新Frame的代码忽略掉了Device Clear 0 0 D3DCLEAR TARGET D3DCLEAR ZBUFFER 0 x00000000 1 0f 0 Device BeginScene for inti 0 iSetTexture 0 Textures i Mesh DrawSubset i Device EndScene Device Present 0 0 0 0 returntrue 29 11 10小结 一个网格包括了顶点 索引和属性缓冲区 顶点和索引缓冲区存放了网格的几何信息 顶点和三角形 属性缓冲区为每个三角形保存了一个相应的元素 它指定了三角形所处的网格子集 网格可以用OptimizeInplace或者Opt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论