ID3DXBaseMesh :: CloneMeshFVF返回D3DERR_INVALIDCALL

时间:2012-09-27 18:23:35

标签: c++ directx-9

我正在尝试从directx 9中的.x文件中加载网格,并将其克隆为另一种FVF格式以获取我想要的顶点。

LPD3DXMESH pMesh;
DWORD numMaterials;
LPD3DXBUFFER pMaterialBuffer;
HRESULT hr = D3DXLoadMeshFromX( file, D3DXMESH_SYSTEMMEM, pDevice, NULL, &pMaterialBuffer, NULL, &numMaterials, &pMesh ); // Loads just fine, I can even render it

LPD3DXMESH clone;
pMesh ->CloneMeshFVF(D3DXMESH_SYSTEMMEM, D3DFVF_XYZ, pDevice, &clone); // Trying to get only the xyz data out

在克隆阶段,我收到D3DERR_INVALIDCALL错误。但是,我的任何论点都没有看错。

我想从中实现的是最终将所有顶点数据从缓冲区中取出,我想要不依赖于我正在加载的.x文件的类型。

typedef struct VERTEX_TYPE 
{
    float position[3];
} VERTEX;

void* pTemp;
VERTEX* pVertexData;

DWORD nNumVerts = mesh->GetNumVertices();
DWORD nSizeVerts = mesh->GetNumBytesPerVertex();
DWORD nNumFaces = mesh->GetNumFaces();


pVertexData = new VERTEX[nNumFaces * 3];
mesh->LockVertexBuffer(D3DLOCK_READONLY, &pTemp);
memcpy(pVertexData, pTemp, sizeof(VERTEX)*nNumVerts);
mesh->UnlockVertexBuffer();

关于我哪里出错的任何帮助?

1 个答案:

答案 0 :(得分:0)

我明白了。问题是我正在创建一个directX9 EX设备。我不确定为什么它需要一个普通的设备与EX的设备相比,但它修复了我的错误,一切正常。