2010-10-10 3 views
1

ok, поэтому я могу загрузить сетку, но загрузка ее текстуры не работает. Я не уверен, что я делаю неправильно.
вот мой код ..C++ directx 9 mesh texture

//render a single frame 
void RenderFrame(void) 
{ 
    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); 
    d3ddev->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); 

    d3ddev->BeginScene(); 

    d3ddev->SetFVF(CUSTOMFVF); 

    InitMatrices(); 

    D3DXMATRIX matTran; // a matrix to store the rotation for each triangle 
    D3DXMATRIX matRotz; 
    D3DXMATRIX matRoty; 
    D3DXMATRIX matRotx; 
    D3DXMatrixTranslation(&matTran, x, y, z); 
    D3DXMatrixRotationZ(&matRotz, D3DXToRadian(rz)); 
    D3DXMatrixRotationY(&matRoty, D3DXToRadian(ry)); 
    D3DXMatrixRotationX(&matRotx, D3DXToRadian(rx)); 

    d3ddev->SetTransform(D3DTS_WORLD, &(matTran * matRotz * matRoty * matRotx)); // set the world transform 

    // draw the spaceship 
    for(DWORD i = 0; i < numMaterials; i++) // loop through each subset 
    { 
     d3ddev->SetMaterial(&material[i]); // set the material for the subset 
     if(texture[i] != NULL) // if the subset has a texture (if texture is not NULL) 
      d3ddev->SetTexture(0, texture[i]); // ...then set the texture 

     meshSpaceship->DrawSubset(i); // draw the subset 
    } 

    d3ddev->EndScene(); 

    d3ddev->Present(NULL, NULL, NULL, NULL); 
} 

// cleans up Direct3D and COM 
void CleanD3D(void) 
{ 
    meshSpaceship->Release(); 
    d3ddev->Release(); // close and release the 3D device 
    d3d->Release(); // close and release Direct3D 
} 

VOID InitGraphic() 
{ 
    LPD3DXBUFFER bufShipMaterial; 

    D3DXLoadMeshFromX(L"ramiz.x", // load this file 
         D3DXMESH_SYSTEMMEM, // load the mesh into system memory 
         d3ddev, // the Direct3D Device 
         NULL, // we aren't using adjacency 
         &bufShipMaterial, // put the materials here 
         NULL, // we aren't using effect instances 
         &numMaterials, // the number of materials in this model 
         &meshSpaceship); // put the mesh here 

    // retrieve the pointer to the buffer containing the material information 
    D3DXMATERIAL* tempMaterials = (D3DXMATERIAL*)bufShipMaterial->GetBufferPointer(); 

    // create a new material buffer and texture for each material in the mesh 
    material = new D3DMATERIAL9[numMaterials]; 
    texture = new LPDIRECT3DTEXTURE9[numMaterials]; 

    for(DWORD i = 0; i < numMaterials; i++) // for each material... 
    { 
     material[i] = tempMaterials[i].MatD3D; // get the material info 
     material[i].Ambient = material[i].Diffuse; // make ambient the same as diffuse 
     D3DXCreateTextureFromFile(d3ddev, 
            L"ramiz.x" 
            , 
            &texture[i]); 
     texture[i]=NULL; 
    } 
} 

ответ

2

Прежде всего, вы устанавливаете все текстуры на NULL в вашем for цикле, поэтому, конечно, нет текстуры, чтобы сделать!

for(DWORD i = 0; i < numMaterials; i++) 
{ 
    /* ... */ 
    texture[i]=NULL; // <--- You're setting all your textures to NULL! 
} 

также:

D3DXCreateTextureFromFile(d3ddev, L"ramiz.x", &texture[i]); 

Функция D3DXCreateTextureFromFile() поддерживает только загрузку текстур из этих типов файлов: .bmp, .DDS, .dib, .hdr, .jpg, .pfm, .png. ppm и .tga. Вы пытаетесь загрузить текстуры из файла .x, который не может быть прав.

Я думаю, вы хотели пройти tempMaterials[i].pTextureFilename до D3DXCreateTextureFromFile(), чтобы загрузить файлы текстур, нет?

Here's how to properly load texture files for (simple) .x file rendering:

////////////////////////////////////////////////////////////////////////////// 
// Code snippet from http://www.toymaker.info/Games/html/load_x_simply.html // 
////////////////////////////////////////////////////////////////////////////// 

for (DWORD i=0; i<m_numMaterials; i++) 
{ 

// Copy the material 
meshMaterials[i] = d3dxMaterials[i].MatD3D; 

// Set the ambient color for the material (D3DX does not do this) 
meshMaterials[i].Ambient = meshMaterials[i].Diffuse; 

// Create the texture if it exists - it may not 
meshTextures[i] = NULL; 
if (d3dxMaterials[i].pTextureFilename) 
    D3DXCreateTextureFromFile(gD3dDevice, 
           d3dxMaterials[i].pTextureFilename, 
           &meshTextures[i]); 
} 
+0

чем то, как вы можете загрузить текстуру сетки – Ramilol

+0

@Ramiz Toma: Я обновил свой пост, чтобы ответить на этот комментарий. –

+0

ошибка C2664: «D3DXCreateTextureFromFileW»: не может преобразовать параметр 2 из «LPSTR» в «LPCWSTR» 1> Указанные типы не связаны; Для преобразования требуется reinterpret_cast, листинг в стиле C или стиль функции – Ramilol