获取加载进ID3DXMESH后的.x文件的信息

 

通常,我们获得了一个LPD3DXMESH指针来保存一个.x文件的顶点与索引信息,但是,我们通常会需要直接针对顶点来做一些事情,比如,求包围盒等。那么这个时候我们就需要提取模型中的相关顶点信息。接下来,我就简单的说一下我实现提取顶点位置信息的过程。

大家首先要知道以下这个方法:

       static LPVOID pV;

       pMesh->LockVertexBuffer( 0,&pV );    // 锁定顶点缓冲区 

pMesh->UnlockVertexBuffer();   

这个方法是为了获取由ID3DXMESH所保存的顶点缓冲区的首地址,但是,我们此时并不知道顶点声明的结构是怎么样的。所以,除了明确知道第一个指向的是第一个的顶点的位置信息(可以通过(LPD3DXVEC3)pV来编译查看),我们并不能准确的猜测下一个顶点需要如何移动指针的位置来定位。

这个时候,我们希望能够让pV只保存顶点位置信息,这可以通过:

HRESULT CloneMesh(

     DWORD Options,

     CONST D3DVERTEXELEMENT9 * pDeclaration,

     LPDIRECT3DDEVICE9 pDevice,

     LPD3DXMESH * ppCloneMesh

);

来做到,当然使用CloneFVFMesh也可以做到,但是现在是shader编程大行其道的时代,感觉灵活顶点格式有点力不从心了。

这个函数是ID3DXMESH的成员函数,他通过传入一个你需要的顶点声明结构来从现有的ID3DXMESH中提取你需要的部分,并把他们克隆到一个新的ID3DXMESH中去,这样你就可以掌握当前的指针所指向的是什么样的信息,并通过强制类型转换读取它。

下面是整个提取顶点信息的代码:

 

 

//需要重新设置的节点结构

     D3DVERTEXELEMENT9 _decl[] =

     {

            {0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},

            D3DDECL_END()

     };

   //重新设置用到的mesh指针

     LPD3DXMESH pMesh;

     //克隆顶点

     m_pMesh->CloneMesh( D3DXMESH_MANAGED, _decl, pDevice, &pMesh );

 

 

从上面的代码中可以看出,我定义的顶点声明中只包含了位置信息,那么克隆出来的pMesh中的顶点缓冲自然也只包含顶点位置信息。

同理我们也可以提取顶点中法线,纹理坐标等所有有用的东东。

Enjoy!!

 

你可能感兴趣的:(编程,float,shader)