0

Direct X の C++ で Load Mesh 関数を作成する際に問題が発生しました。「_.exe の 0x00401e64 で未処理の例外: 0xC00000005: アクセス違反の読み取り位置 0x83e05597」というエラーが発生するようです。私はそれがこの行でクラッシュしていることを知っています:

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

関数全体は次のようになります (直接の X ヘルプについては、これまで directxtutorial.com をたどっています)。

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 ブックと別の Web サイト ソースを見つけました。助けてください!

4

3 に答える 3

1

バグは へのキャストではありませんD3DXMATERIAL*が、おそらくそれbufMaterialは有効なポインターではありません。

LPD3DXBUFFERは typedef であるID3DXBuffer *ため、使用する前にウィッチへのポインタを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

OK、あなたのコードを簡単なテストに使用しました。いくつか変更しましたが、大きな変更はありません。お役に立てば幸いです。

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 に答える