运行结果:
源代码:
XFileModelClass.h:
//=============================================================================
//一个封装了X文件载入与渲染功能的头文件
//=============================================================================
#pragma once
#include <d3d9.h>
#include <d3dx9.h>
#include "D3DUtil.h"
class XFileModelClass
{
private:
LPDIRECT3DDEVICE9 m_pd3dDevice; //D3D设备对象
LPD3DXMESH m_pMesh; //网格模型对象
DWORD m_dwNumMaterials; //材质的数量
D3DMATERIAL9 *m_pMaterials; //模型材质结构体的实例
LPDIRECT3DTEXTURE9 *m_pTextures; //模型纹理结构体的实例
public:
XFileModelClass(LPDIRECT3DDEVICE9 pd3dDevice); //构造函数
~XFileModelClass(void); //析构函数
HRESULT LoadModelFromXFile(wchar_t *strFileName); //从.X文件读取模型到内存中
void RenderModel(); //渲染三维网格模型
};
XFileModelClass.cpp:
//=============================================================================
//一个封装了X文件载入与渲染功能的源文件
//=============================================================================
#include "XFileModelClass.h"
//-----------------------------------------------------------------------------
//构造函数
//-----------------------------------------------------------------------------
XFileModelClass::XFileModelClass(LPDIRECT3DDEVICE9 pd3dDevice)
{
//给各个变量赋初值
m_pd3dDevice = pd3dDevice;
m_pMesh = NULL;
m_dwNumMaterials = 0;
m_pMaterials = NULL;
m_pTextures = NULL;
}
//-----------------------------------------------------------------------------
//从.X文件读取模型到内存中
//-----------------------------------------------------------------------------
HRESULT XFileModelClass::LoadModelFromXFile(wchar_t *strFileName)
{
HRESULT hr;
LPD3DXBUFFER pAdjBuffer = NULL; //网格模型邻接信息
LPD3DXBUFFER pMtrlBuffer = NULL; //存储网格模型材质的缓存对象
//从磁盘文件加载网格模型
HR(D3DXLoadMeshFromX(strFileName, D3DXMESH_MANAGED, m_pd3dDevice, &pAdjBuffer,
&pMtrlBuffer, NULL, &m_dwNumMaterials, &m_pMesh));
m_pMaterials = new D3DMATERIAL9[m_dwNumMaterials];
m_pTextures = new LPDIRECT3DTEXTURE9[m_dwNumMaterials];
//读取材质和纹理数据
D3DXMATERIAL *pMtrls = (D3DXMATERIAL *)pMtrlBuffer->GetBufferPointer();
//逐子集提取材质属性和纹理文件名
for(DWORD i = 0; i < m_dwNumMaterials; ++i)
{
//获取纹理,并获取环境光的颜色值
m_pMaterials[i] = pMtrls[i].MatD3D;
m_pMaterials[i].Ambient = m_pMaterials[i].Diffuse;
//创造一下纹理对象
m_pTextures[i] = NULL;
//创造纹理
HR(D3DXCreateTextureFromFileA(m_pd3dDevice, pMtrls[i].pTextureFilename, &m_pTextures[i]));
}
//优化网格模型
HR(m_pMesh->OptimizeInplace(D3DXMESHOPT_COMPACT | D3DXMESHOPT_STRIPREORDER | D3DXMESHOPT_ATTRSORT,
(DWORD *)pAdjBuffer->GetBufferPointer(), NULL, NULL, NULL));
//用完后释放
SAFE_RELEASE(pAdjBuffer);
SAFE_RELEASE(pMtrlBuffer);
return S_OK;
}
//-----------------------------------------------------------------------------
//渲染三维网格模型
//-----------------------------------------------------------------------------
void XFileModelClass::RenderModel()
{
for(DWORD i = 0; i < m_dwNumMaterials; ++i)
{
m_pd3dDevice->SetMaterial(&m_pMaterials[i]); //设置材质
m_pd3dDevice->SetTexture(0, m_pTextures[i]); //设置纹理
m_pMesh->DrawSubset(i);
}
}
//-----------------------------------------------------------------------------
//析构函数
//-----------------------------------------------------------------------------
XFileModelClass::~XFileModelClass(void)
{
//释放网格模型对象
SAFE_RELEASE(m_pMesh);
//释放网格模型材质
SAFE_DELETE_ARRAY(m_pMaterials);
//释放网格模型纹理
if(m_pTextures)
{
for(DWORD i = 0; i < m_dwNumMaterials; ++i)
SAFE_REL