您的位置:首页 > 其它

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

2009-04-01 17:33 155 查看
通常,我们获得了一个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!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: