通常,我们获得了一个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!!