本系列文章由zhmxy555(毛星雲)編寫,轉載請註明出處。
文章鏈接: http://blog.csdn.net/zhmxy555/article/details/8586540
作者:毛星雲(淺墨) 郵箱: [email protected]
照此文碼的,有點問題就是
for(DWORD i = 0; i < m_num_mtrl; i++)
{
p_mtrl[i].MatD3D.Ambient = p_mtrl[i].MatD3D.Diffuse;
m_mtrl.push_back(&p_mtrl[i].MatD3D);
D3DXCreateTextureFromFile(m_Device, p_mtrl[i].pTextureFilename, &p_tex);
m_tex.push_back(p_tex);
}
這個D3DXCreateTextureFromFile函數得到的是相對路徑,
比如我將x文件和bmp放入src文件夾中那麼D3DXCreateTextureFromFile得到的是.bmp而不是src//.bmp
空的紋理自然無法渲染...
#include "d3dUtility.h"
#include <string>
#include <vector>
using namespace std;
template < class T > void ClearVector( vector< T >& vt )
{
vector< T > vtTemp;
vtTemp.swap( vt );
}
class CMesh
{
public:
CMesh();
~CMesh();
void LoadMesh(string FileName);
void CreateMesh();
void Init(IDirect3DDevice9* device);
void Draw();
private:
ID3DXMesh* m_mesh;
IDirect3DDevice9* m_Device;
LPD3DXBUFFER m_adj;
vector<D3DMATERIAL9*> m_mtrl;
vector<IDirect3DTexture9*> m_tex;
DWORD m_num_mtrl;
};
#include "SimpleMesh.h"
CMesh::CMesh()
{
m_adj = NULL;
}
CMesh::~CMesh()
{
ClearVector<D3DMATERIAL9*>(m_mtrl);
ClearVector<IDirect3DTexture9*>(m_tex);
d3d::Release<ID3DXMesh*>(m_mesh);
d3d::Release<LPD3DXBUFFER>(m_adj);
}
void CMesh::Init(IDirect3DDevice9* device)
{
m_Device = device;
}
void CMesh::CreateMesh()
{
}
void CMesh::LoadMesh(string FileName)
{
HRESULT hr;
LPD3DXBUFFER mtrl_buffer;
hr = D3DXLoadMeshFromX(
FileName.c_str(),
D3DXMESH_MANAGED,
m_Device,
&m_adj,
&mtrl_buffer,
NULL,
&m_num_mtrl,
&m_mesh);
if(FAILED(hr))
MessageBox(NULL, "D3DXCreateFont FAILED", "MSG", 0);
/*
typedef struct D3DXMATERIAL {
D3DMATERIAL9 MatD3D; //材質信息
LPSTR pTextureFilename; //紋理貼圖文件
} D3DXMATERIAL, *LPD3DXMATERIAL;
*/
D3DXMATERIAL* p_mtrl = (D3DXMATERIAL*)mtrl_buffer->GetBufferPointer();
IDirect3DTexture9* p_tex;
for(DWORD i = 0; i < m_num_mtrl; i++)
{
p_mtrl[i].MatD3D.Ambient = p_mtrl[i].MatD3D.Diffuse;
m_mtrl.push_back(&p_mtrl[i].MatD3D);
string str("src\\");
str += p_mtrl[i].pTextureFilename;
// D3DXCreateTextureFromFile(m_Device, p_mtrl[i].pTextureFilename, &p_tex);
D3DXCreateTextureFromFile(m_Device, str.c_str(), &p_tex);
m_tex.push_back(p_tex);
}
d3d::Release<LPD3DXBUFFER>(mtrl_buffer);
}
void CMesh::Draw()
{
for(DWORD i = 0; i < m_num_mtrl; i++)
{
m_Device->SetMaterial(m_mtrl[i]);
m_Device->SetTexture(0, m_tex[i]);
m_mesh->DrawSubset(i);
}
}