您的位置:首页 > 其它

欢迎使用CSDN-markdown编辑器

2017-04-07 18:46 225 查看
//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);
//释放
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: