好的,所以我可以完美地加载网格,但加载它的纹理不起作用。我不确定我做错了什么 这是我的代码..
//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;
}
}
答案 0 :(得分: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]);
}