第11章DirectX编程.ppt

  1. 1、本文档共29页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第11章DirectX编程

第11章 网格(1) 在DirectX中,除了ID3DXMesh接口从ID3DXBaseMesh接口继承外,另一个主要的Mesh接口ID3DXPMesh(Progressive Mesh)也从ID3DXBaseMesh接口继承,如何运用不同类型的Mesh接口,也将是本章讨论的内容。 主要目标: 学习ID3DXMesh对象的内部数据组织。 学习ID3DXMesh对象的创建。 学习ID3DXMesh对象的优化方法。 渲染ID3DXMesh对象。 11.1 几 何 信 息 ID3DXBaseMesh接口包括了一个用于保存网格中顶点数据的顶点缓冲区和一个用于记录三角形顶点在顶点缓冲区中索引信息的索引缓冲区。 在ID3DXBaseMesh中,可以通过下面的方法得到指向这些缓冲区的指针: HRESULT ID3DXMesh::GetVertexBuffer(LPDIRECT3DVERTEXBUFFER9 *ppVB); HRESULT ID3DXMesh::GetIndexBuffer(LPDIRECT3DINDEXBUFFER9 *ppIB); 可以通过下列方式对这些方法进行调用: IDirect3DVertexBuffer9 *vb = 0; Mesh-GetVertexBuffer(vb); IDirect3DIndexBuffer9 *ib = 0; Mesh-GetIndexBuffer(ib); 11.1 几 何 信 息 如果需要锁定缓冲区以进行缓冲区读写,可以通过下面的方法来实现,注意这里锁定的将是整个顶点缓冲区或索引缓冲区: HRESULT ID3DXMesh::LockVertexBuffer(DWORD Flags, BYTE **ppData); HRESULT ID3DXMesh::LockIndexBuffer(DWORD Flags, BYTE **ppData); 对锁定缓冲区的访问结束后,应该调用相应的Unlock方法解除缓冲区锁定,如下所示: HRESULT ID3DXMesh::UnlockVertexBuffer(); HRESULT ID3DXMesh::UnlockIndexBuffer(); 11.1 几 何 信 息 下面是ID3DXMesh接口提供的用于获得相关几何数据信息的另外几个方法: DWORD GetFVF(); //返回一个描述顶点格式的DWORD DWORD GetNumVertices(); //返回顶点缓冲区中的顶点数目 DWORD GetNumBytesPerVertex(); //返回每个顶点所用的字节数 DWORD GetNumFaces(); //获得网格的面数 11.2 网格子集(Subset)和属性缓冲区 网格由一个或者多个网格子集组成。网格子集是一个网格中可被按照同样属性进行渲染的三角形的集合。 图11.1阐述了一个代表房子的网格怎样被划分成不同的网格子集。 11.2 网格子集(Subset)和属性缓冲区 每个三角形对应的子集ID被存储在网格的属性缓冲区中,这个缓冲区是一个DWORD类型的数组。由于网格中的每一个面(一个三角形对应一个面)在属性缓冲区中都有一个对应的元素,因此缓冲区中的元素个数等于网格中面的数量。 图11.2展示了属性缓冲区中的元素与索引缓冲区中的三角形之间的对应关系。 11.2 网格子集(Subset)和属性缓冲区 通过如下代码,可以锁定属性缓冲区,并获得指向属性缓冲区的指针: DWORD *buffer = 0; Mesh-LockAttributeBuffer(lockingFlags, buffer); //...读或写属性缓冲区 Mesh-UnlockAttributeBuffer(); 11.3 网格的渲染 ID3DXMesh接口提供了DrawSubset方法来渲染指定网格子集中的所有三角形。 如果要渲染整个网格,就需要渲染网格中的所有子集。可以按顺序为每个网格子集指定网格ID为0、1、2、…、n-1,这里n是网格子集的数量,然后依次指定每个网格子集对应的材质和纹理。最后,通过简单的循环就可以渲染一个完整的网格: for(int i=0; inumSubsets; i++) { Device-SetMaterial(mtrls[i]); Device-SetTexture(0, textures[i]); Mesh-DrawSubset(i); } 11.4 网 格 优 化 网格的顶点和索引可以进行重新组织以便更有效率地渲染网格,即对网格进行优化。在ID3DXMesh接口中对网格的优化通过如下方法进行: HRESULT ID3DXMesh::OptimizeInplace( DWORD Flags, C

文档评论(0)

wyjy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档