c++ directx 9 mesh texture
ok so i can load a mesh perfectly but loading its texture is not working. im not sure what im doing wrong.
here is my code..//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 contai开发者_如何学Goning 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;
}
}
First of all, you're setting all the textures to NULL
in your for
loop, so of course there's no texture to render!
for(DWORD i = 0; i < numMaterials; i++)
{
/* ... */
texture[i]=NULL; // <--- You're setting all your textures to NULL!
}
Also:
D3DXCreateTextureFromFile(d3ddev, L"ramiz.x", &texture[i]);
The function D3DXCreateTextureFromFile()
only supports loading textures from these file types: .bmp, .dds, .dib, .hdr, .jpg, .pfm, .png, .ppm, and .tga. You're attempting to load textures from an .x file, which can't possibly be right.
I think you meant to pass tempMaterials[i].pTextureFilename
to D3DXCreateTextureFromFile()
to load the texture files, no?
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]);
}
精彩评论