d3d載入x網格

本系列文章由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);
	}
}


發佈了35 篇原創文章 · 獲贊 8 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章