2010-10-10 143 views
1

好吧,我可以完美加载网格,但加载其纹理无法正常工作。即时通讯不知道我做错了什么。
这里是我的代码..C++ directx 9网格纹理

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

首先,你设置所有的纹理NULLfor循环,所以当然没有质感呈现!

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].pTextureFilenameD3DXCreateTextureFromFile()加载纹理文件,不是吗?

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 2010-10-10 08:03:31

+0

@Ramiz托马:我已经更新了我的帖子回答这个问题发表评论。 – 2010-10-10 08:07:58

+0

错误C2664:'D3DXCreateTextureFromFileW':无法将参数2从'LPSTR'转换为'LPCWSTR'1>指向的类型是不相关的;转换需要reinterpret_cast,C风格转换或函数风格转换 – Ramilol 2010-10-10 08:15:32