Загрузка сетки из файла X с помощью Direct X 9 в C ++ - PullRequest
0 голосов
/ 15 июня 2009

У меня возникли проблемы при создании функции Load Mesh в C ++ для Direct X. Кажется, я получаю эту ошибку: «Необработанное исключение по адресу 0x00401e64 в _.exe: 0xC00000005: ошибка чтения прав доступа Lox 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 и другой источник на веб-сайте, которые все используют этот тип приведения буфера материала из временного буфера материала, как это делает строка, вызывающая сбой. Пожалуйста, помогите!

Ответы [ 3 ]

1 голос
/ 15 июня 2009

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

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

D3DXCreateBuffer(NumBytes, &bufMaterial);

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

0 голосов
/ 02 ноября 2010

хорошо, я взял ваш код для быстрого тестирования, я изменил некоторые вещи, но не большие изменения, я надеюсь, что это поможет вам!

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

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

0 голосов
/ 19 июля 2009

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

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

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

Кроме того, рассмотрите возможность связывания с отладочной D3DX , если вы еще не получили дополнительную отладочную информацию от D3DX.

...