欢迎使用CSDN-markdown编辑器

//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);
//释放
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值