2009-06-15 3 views
0

Direct X 용 C++에서로드 메쉬 기능을 만드는 데 문제가 있습니다.이 오류가 발생하는 것 같습니다. "_.exe의 0x00401e64에서 처리되지 않은 예외 : 0xC00000005 : 액세스 위반 읽기 0x83e05597 "위반. 나는이 라인에 충돌 알고 :C에서 Direct X 9를 사용하여 X 파일에서 메쉬로드

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

전체 기능 (내가 지금까지 직접 X의 도움을 directxtutorial.com을 그대로 따라) 다음과 같습니다. 나는 나의 오래된 시작 다이렉트 책과 모든 임시 재료 버퍼에서 재료 버퍼 이러한 유형의 캐스팅을 사용하는 다른 웹 사이트의 소스를 발견,

LoadModel(networkBase, TEXT("E:\\C++\\Skirmish\\X\\gridbox.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;} 

나는 다음과 같이 호출 충돌하고있는 선과 같이하고 있습니다. 도와주세요!

+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

괜찮 았어. 나는 당신의 코드를 빨리 바꾸었다. 나는 큰 변화가 아닌 몇 가지를 바꿨다.

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

이것은 내 테스트를 돕기 위해 만든 간단한 예입니다. 만약 작동하지 않는다면 다른 애니메이션을 사용해보십시오