本系列文章由zhmxy555(毛星云)编写,转载请注明出处。
文章链接: http://blog.youkuaiyun.com/zhmxy555/article/details/8586540
作者:毛星云(浅墨) 邮箱: happylifemxy@163.com
照此文码的,有点问题就是
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);
}
}