//LPSTR=CHAR*
加载X文件步骤:
1,声明一个模型指针
2,通过X文件加载模型(模型指针,材质列表,材质数量)
3,解析材质列表,读取对应的材质和纹理,并存储到相应的容器中
4,根据每一个子集设置当前子集的渲染状态(材质,纹理,alpha混合,alpha测试),并逐个子集进行绘制,恢复渲染状态
//加载X文件
LPD3DXBUFFER pBuffer=NULL; //拥有两个函数GetBufferPointer
//GetBufferSize
D3DXLoadMeshFromX(
_file.c_str(), //X文件路径及文件名
D3DXMESH_MANAGED, //内存存储位置
m_pDevice, //设备指针
NULL, //临界信息
&pBuffer, //返回X文件中的材质信息
NULL, //shader指针,效果示例指针
&m_dwMtrls, //返回的材质数量
&m_pMesh //返回的模型指针
);
if(!m_pMesh)
{
outputDebugString(TEXT("Load X File ERROR!"));
return;
}
D3DXMATRIAL *pMtrls=(D3DXMATRIAL*)pBuffer->GetBufferPointer();//
//解析文件中的材质,获取其中的材质,纹理
for(int i=0;i<m_dwMtrls;++i)
{
D3DMATERIAL9 *pMtrl=new D3DMATERIAL9;
*pMtrl=pMtrls[i].MatD3D;
//手动赋值,让当前模型对环境光的反射和漫反射一致
*pMtrl.Ambient=*pMtrl.Diffuse;
m_vMtrls.push_back(*pMtrl);
//读取纹理,加载后放入容器
LPDIRECT3DTEXTURE9 pTexture=NULL;
WCHAR strDest[100]=TEXT("res\\mesh\\");
WCHAR str[100]={};
MultibyteToWideChar(
CP_ACP,//固定参数
0,
pMatrls[i].pTextureFilename,
-1,
str,
PATH_MAX);
D3DXCreateTextureFromFile(
m_pDevice,
str,
&pTexture);
wcscat(strDest,str);
//由于在X文件中不是所有的材质都会对应一张纹理
m_vPTextures.push_back(pTexture);
}
//绘制
m_pDevice->SetTransform(D3DTS_WORLD,&m_matWorld);
//当前模型应该具有的渲染状态
for(int i=0;i<m_dwMatrls;++i)
{
//当前子集应该具有的渲染状态
m_pDevice->SetMaterial(&m_vMtrls.at(i));
m_pDevice->SetTexture(0,m_vTextures.at(i));
m_pMesh->DrawSubset(i);
};
m_pDevice->SetMaterial(&m_nullMtrl);
m_pDevice->SetTexture(0,0);
m_pDevice->SetTransform(D3DTS_WORLD,&m_matIdentity);
//释放