2009-06-15 6 views
0

Direct XのC++でLoad Mesh関数を作成する際に問題が発生しました。このエラーが発生するようです:「_.exeの0x00401e64で未処理の例外:0xC00000005: 0x83e05597 "というアクセス違反を読み込んでいます。私はそれがこのラインにクラッシュされて知っている:Direct X 9 with C++のXファイルからメッシュをロード

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;} 

私はこのようにそれを呼び出す:私は私の古い始まりのDirectXの本とすべてが、一時的な材料バッファから材料バッファのこの型キャストを使用する他のWebサイトのソースを発見した、

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

しかし、クラッシュしているラインのようにしています。助けてください!

+0

私はあなたのログイン情報を持っていることができます私は13歳の私を購入することはできません/ – Ramilol

答えて

1

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

LPD3DXBUFFERID3DXBuffer *のtypedefであるため、使用する前に初期化する必要があるID3DXBufferへのポインタです。

D3DXCreateBuffer(NumBytes, &bufMaterial); 

NumBytesは、バッファのサイズを指定する整数でなければなりません。

+0

私はあなたがD3DXLoadMeshFromX()あなたのためのバッファを埋めるでしょうか? –

+0

最初に私はそれも考えていました。http://msdn.microsoft.com/en-us/library/bb172890(VS.85).aspxのdocが "材料データ。あなたの問題のために私は私の提案がおそらくそれを解決できると思った。 D3DXCreateBufferを試しましたか? D3DXLoadMeshFromXの呼び出しの前後にポインターが指し示すアドレスを印刷してみてください。おそらくそれが役に立ちます。 – Elrohir

0

メッシュに材料がない場合は、材料がないため材料配列にID3DXBufferを返しません。

関数が返ってからmodel->numMaterialsをチェックしましたか?

また、関数を呼び出す前に、ポインタID3DXBufferを0に初期化する必要があります。

さらに、D3DXから追加のデバッグ情報をまだ取得していない場合は、linking against the debug D3DXを検討してください。

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; 
} 

UPDATE
あなたがこれです見たいかもしれ重要な何か。

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

これは私のテストで私を助けるために作られた単なる例です。もしあなたが別のアニメーションを使ってみると、

関連する問題