我在使用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书和另一个网站源,它们都使用这种类型来自临时材料缓冲区的材质缓冲区,就像正在崩溃的行一样。请帮忙!
答案 0 :(得分:1)
该错误不是D3DXMATERIAL*
的强制转换,但可能bufMaterial
不是有效指针。
LPD3DXBUFFER
是ID3DXBuffer *
的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;
};
这只是我帮助我进行测试的简单示例。如果不起作用尝试使用另一个动画