2009-06-15 5 views
0

У меня возникли проблемы с созданием функции Load Mesh в C++ для Direct X. Кажется, я получаю эту ошибку: «Необработанное исключение в 0x00401e64 в _.exe: 0xC00000005: Ошибка чтения нарушения прав доступа 0x83e05597 ". Я знаю, что это происходит сбой на этой линии:Загрузка Mesh из X-файла с Direct X 9 в C++

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

Могу ли я иметь вашу регистрационную информацию, я не могу успеть купить один им 13 лет;/ – Ramilol

ответ

1

Ошибка не является отличной от D3DXMATERIAL*, но, вероятно, это bufMaterial недействительный указатель.

LPD3DXBUFFER является typedef для ID3DXBuffer *, и поэтому указатель на ID3DXBuffer, который должен быть инициализирован перед использованием. Вы можете сделать это следующим образом:

D3DXCreateBuffer(NumBytes, &bufMaterial); 

NumBytes должно быть целое число, которое определяет размер буфера.

+0

Я думал, когда вы передаете ссылку на буфер в строке D3DXLoadMeshFromX() заполнит буфер для вас? – 2009-06-15 16:21:15

+0

Сначала я тоже подумал, и я не совсем уверен, что документ из http://msdn.microsoft.com/en-us/library/bb172890(VS.85).aspx означает, когда вы говорите «Указатель на буфер, содержащий материалов ». Из-за вашей проблемы я подумал, что мое предложение, возможно, решит его. Вы пробовали D3DXCreateBuffer? Попробуйте напечатать адрес, на который указывает указатель до и после вызова D3DXLoadMeshFromX, возможно, это поможет вам. – Elrohir

0

Если на вашей сетке нет материалов, то он не вернет ID3DXBuffer для массива материалов, потому что материалов нет.

Вы проверили model->numMaterials после возвращения функции?

Кроме того, вы должны инициализировать указатель ID3DXBuffer до нуля перед вызовом функции.

Кроме того, рассмотрите linking against the debug D3DX, если вы еще не получили дополнительную информацию об отладке от 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; 
}; 

Это просто простой пример, который я сделал, чтобы помочь мне с моим тестированием. если не работал, попробуйте использовать другую анимацию