ID3DXBaseMesh::CloneMeshFVF возвращает D3DERR_INVALIDCALL

Я пытаюсь взять сетку, загруженную из файла.x в DirectX 9, и клонировать ее в другой формат 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 ответ

Решение

Я понял. Проблема заключалась в том, что я создавал устройство DirectX9 EX. Я не уверен, почему это требует обычного устройства по сравнению с EX, но это исправило мою ошибку, и все работает нормально.

Другие вопросы по тегам