2010-10-10 4 views
1

ok donc je peux charger un mesh parfaitement mais charger sa texture ne fonctionne pas. Je ne suis pas sûr de ce que je fais mal.
voici mon code ..C++ directx texture 9 mesh

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

Répondre

2

Tout d'abord, vous configurez toutes les textures à NULL dans votre boucle for, donc bien sûr il n'y a pas de texture à rendre!

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

aussi:

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

La fonction D3DXCreateTextureFromFile() ne supporte que des textures de chargement de ces types de fichiers: .bmp, .dds, .dib, .hdr, .jpg, .pfm, .png,. ppm, et .tga. Vous essayez de charger des textures à partir d'un fichier .x, ce qui ne peut pas être correct.

Je pense que vous vouliez passer tempMaterials[i].pTextureFilename à D3DXCreateTextureFromFile() pour charger les fichiers de texture, non?

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

que comment pouvez-vous charger une texture à un maillage – Ramilol

+0

@Ramiz Toma: J'ai mis à jour mon post pour répondre à ce commentaire. –

+0

erreur C2664: 'D3DXCreateTextureFromFileW': impossible de convertir le paramètre 2 de 'LPSTR' à 'LPCWSTR' 1> Les types pointés sont sans rapport; la conversion requiert reinterpret_cast, cast de style C ou cast de fonction – Ramilol

Questions connexes