使用C ++中的Direct X 9从X文件加载网格

时间:2009-06-15 15:51:48

标签: c++ directx mesh

我在使用C ++ for Direct X制作加载网格功能时遇到了问题。我似乎得到了这个错误:“在_.exe中的0x00401e64处的未处理异常:0xC00000005:访问冲突读取loaction 0x83e05597”。我知道它正在崩溃:

D3DXMATERIAL* tempMaterials = (D3DXMATERIAL*)bufMaterial->GetBufferPointer();

整个功能看起来像这样(到目前为止,我一直关注directxtutorial.com直接提供X帮助)。

void LoadModel(Model* model, LPCTSTR File){
LPD3DXBUFFER bufMaterial;

D3DXLoadMeshFromX(File, D3DXMESH_SYSTEMMEM, d3ddev, NULL, &bufMaterial, NULL,
                  &model->numMaterials, &model->Mesh);
OutputDebugString("LOAD MESH \n");

D3DXMATERIAL* tempMaterials = (D3DXMATERIAL*)bufMaterial->GetBufferPointer();
OutputDebugString("GET BUFFER\n");

model->Material = new D3DMATERIAL9[model->numMaterials];
model->Texture = new LPDIRECT3DTEXTURE9[model->numMaterials];

OutputDebugString("LOAD MESH \n");

for(DWORD index = 0; index < model->numMaterials; index++)
{
    model->Material[index] = tempMaterials[index].MatD3D;
    model->Material[index].Ambient = model->Material[index].Diffuse;

    // if there is a texture to load, load it
    if(FAILED(D3DXCreateTextureFromFileA(d3ddev,
                                     tempMaterials[index].pTextureFilename,
                                     &model->Texture[index])))
        model->Texture[index] = NULL;    // if there is no texture, set the texture to NULL
}   

return;}

我称之为:

LoadModel(networkBase, TEXT("E:\\C++\\Skirmish\\X\\gridbox.x"));

但是,我已经找到了我的旧的Beginning DirectX书和另一个网站源,它们都使用这种类型来自临时材料缓冲区的材质缓冲区,就像正在崩溃的行一样。请帮忙!

3 个答案:

答案 0 :(得分:1)

该错误不是D3DXMATERIAL*的强制转换,但可能bufMaterial不是有效指针。

LPD3DXBUFFERID3DXBuffer *的typedef,因此在使用之前必须初始化指向ID3DXBuffer的指针。你可以这样做:

D3DXCreateBuffer(NumBytes, &bufMaterial);

NumBytes应该是一个整数,指定缓冲区的大小。

答案 1 :(得分:0)

如果您的网格上没有材质,那么它将不会返回材质数组的ID3DXBuffer,因为没有材质。

在函数返回后检查model->numMaterials了吗?

此外,您应该在调用函数之前将ID3DXBuffer指针初始化为零。

此外,如果您尚未从D3DX获取其他调试信息,请考虑linking against the debug D3DX

答案 2 :(得分:0)

好吧我把你的代码快速测试我改变了一些东西,但没有大的改变,我希望它能帮到你!

void LoadModel(Model* model, LPCTSTR File)
{ 
 LPD3DXBUFFER bufMaterial;
D3DXLoadMeshFromXW(File, D3DXMESH_SYSTEMMEM, d3ddev, NULL, &bufMaterial, NULL, 
                  &model->numMaterials, &model->Mesh); 
OutputDebugString(L"LOAD MESH \n"); 

D3DXMATERIAL* tempMaterials = (D3DXMATERIAL*)bufMaterial->GetBufferPointer(); 
OutputDebugString(L"GET BUFFER\n"); 

model->Material = new D3DMATERIAL9[model->numMaterials]; 
model->Texture = new LPDIRECT3DTEXTURE9[model->numMaterials]; 

OutputDebugString(L"LOAD MESH \n"); 

for(DWORD index = 0; index < model->numMaterials; index++) 
{ 
    model->Material[index] = tempMaterials[index].MatD3D; 
    model->Material[index].Ambient = model->Material[index].Diffuse; 

        // if there is a texture to load, load it 
        if(FAILED(D3DXCreateTextureFromFileA(d3ddev, 
                                     tempMaterials[index].pTextureFilename, 
                                     &model->Texture[index]))) 
                model->Texture[index] = NULL;    // if there is no texture, set the texture to NULL 
}    

return;
} 

<强>更新
你可能想看看的重要事情就是这个。

struct Model
{
    DWORD numMaterials;
    LPD3DXMESH Mesh;
    LPDIRECT3DTEXTURE9* Texture;
    D3DMATERIAL9* Material;
};

这只是我帮助我进行测试的简单示例。如果不起作用尝试使用另一个动画