欢迎来到天天文库
浏览记录
ID:38523785
大小:611.50 KB
页数:29页
时间:2019-06-14
《DirectX游戏编程第11章(全20章)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第11章网格(1)在DirectX中,除了ID3DXMesh接口从ID3DXBaseMesh接口继承外,另一个主要的Mesh接口ID3DXPMesh(ProgressiveMesh)也从ID3DXBaseMesh接口继承,如何运用不同类型的Mesh接口,也将是本章讨论的内容。主要目标:学习ID3DXMesh对象的内部数据组织。学习ID3DXMesh对象的创建。学习ID3DXMesh对象的优化方法。渲染ID3DXMesh对象。211.1几何信息ID3DXBaseMesh接口包括了一个用于保存网格中顶点数据的顶点缓冲区和一个用于记录三角形顶点在顶点缓冲区中索引信息的索引缓冲区。在ID3DXBas
2、eMesh中,可以通过下面的方法得到指向这些缓冲区的指针:HRESULTID3DXMesh::GetVertexBuffer(LPDIRECT3DVERTEXBUFFER9*ppVB);HRESULTID3DXMesh::GetIndexBuffer(LPDIRECT3DINDEXBUFFER9*ppIB);可以通过下列方式对这些方法进行调用:IDirect3DVertexBuffer9*vb=0;Mesh->GetVertexBuffer(&vb);IDirect3DIndexBuffer9*ib=0;Mesh->GetIndexBuffer(&ib);311.1几何信息如果需要锁定缓冲区
3、以进行缓冲区读写,可以通过下面的方法来实现,注意这里锁定的将是整个顶点缓冲区或索引缓冲区:HRESULTID3DXMesh::LockVertexBuffer(DWORDFlags,BYTE**ppData);HRESULTID3DXMesh::LockIndexBuffer(DWORDFlags,BYTE**ppData);对锁定缓冲区的访问结束后,应该调用相应的Unlock方法解除缓冲区锁定,如下所示:HRESULTID3DXMesh::UnlockVertexBuffer();HRESULTID3DXMesh::UnlockIndexBuffer();411.1几何信息下面是ID3DX
4、Mesh接口提供的用于获得相关几何数据信息的另外几个方法:DWORDGetFVF();//返回一个描述顶点格式的DWORDDWORDGetNumVertices();//返回顶点缓冲区中的顶点数目DWORDGetNumBytesPerVertex();//返回每个顶点所用的字节数DWORDGetNumFaces();//获得网格的面数511.2网格子集(Subset)和属性缓冲区网格由一个或者多个网格子集组成。网格子集是一个网格中可被按照同样属性进行渲染的三角形的集合。图11.1阐述了一个代表房子的网格怎样被划分成不同的网格子集。611.2网格子集(Subset)和属性缓冲区每个三角形对应的
5、子集ID被存储在网格的属性缓冲区中,这个缓冲区是一个DWORD类型的数组。由于网格中的每一个面(一个三角形对应一个面)在属性缓冲区中都有一个对应的元素,因此缓冲区中的元素个数等于网格中面的数量。图11.2展示了属性缓冲区中的元素与索引缓冲区中的三角形之间的对应关系。711.2网格子集(Subset)和属性缓冲区通过如下代码,可以锁定属性缓冲区,并获得指向属性缓冲区的指针:DWORD*buffer=0;Mesh->LockAttributeBuffer(lockingFlags,&buffer);//...读或写属性缓冲区Mesh->UnlockAttributeBuffer();811.3网
6、格的渲染ID3DXMesh接口提供了DrawSubset方法来渲染指定网格子集中的所有三角形。如果要渲染整个网格,就需要渲染网格中的所有子集。可以按顺序为每个网格子集指定网格ID为0、1、2、…、n-1,这里n是网格子集的数量,然后依次指定每个网格子集对应的材质和纹理。最后,通过简单的循环就可以渲染一个完整的网格:for(inti=0;iSetMaterial(mtrls[i]);Device->SetTexture(0,textures[i]);Mesh->DrawSubset(i);}911.4网格优化网格的顶点和索引可以进行重新组织以便
7、更有效率地渲染网格,即对网格进行优化。在ID3DXMesh接口中对网格的优化通过如下方法进行:HRESULTID3DXMesh::OptimizeInplace(DWORDFlags,CONSTDWORD*pAdjacencyIn,DWORD*pAdjacencyOut,DWORD*pFaceRemap,LPD3DXBUFFER*ppVertexRemap);1011.4网格优化另一个可以使用的、与Optim
此文档下载收益归作者所有