0

我在 C++ 中为 Direct X 创建加载网格函数时遇到问题。我似乎收到此错误:“_.exe 中 0x00401e64 处的未处理异常:0xC00000005:访问冲突读取位置 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 书和另一个网站源,它们都使用这种从临时材质缓冲区转换材质缓冲区的类型,就像正在崩溃的行所做的那样。请帮忙!

4

3 回答 3

1

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

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

D3DXCreateBuffer(NumBytes, &bufMaterial);

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

于 2009-06-15T16:06:20.563 回答
0

如果您的网格上没有材质,则它不会ID3DXBuffer为材质数组返回一个,因为没有材质。

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

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

此外,如果您尚未从 D3DX 获取其他调试信息,请考虑链接到调试D3DX。

于 2009-07-19T16:25:00.747 回答
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;
};

这只是我为帮助我进行测试而制作的简单示例。如果不起作用,请尝试使用其他动画

于 2010-11-02T01:51:43.840 回答