directx中第三卷

Model

声明变量

ID3DXMesh* mesh = 0;
vector<D3DMATERIAL9> Mtrls(0);
vector<IDirect3DTexture9*> Textures(0);
DWORD numMtrl = 0;

加载模型

HRESULT hr = 0;
ID3DXBuffer* adjbuffer = 0;
ID3DXBuffer* mtrlbuffer = 0;
//加载x文件(路径,附加标志,设备指针,把多边形信息存到缓存指针,把材质纹理信息存到缓存指针,基本为null,把材质数目存到变量,把结果存到网格指针)
hr = D3DXLoadMeshFromX("bigship1.x", D3DXMESH_MANAGED, g_pd3dDevice, &adjbuffer, &mtrlbuffer, 0, &numMtrl, &mesh);
if (FAILED(hr))
{
    ::MessageBox(0, "D3DXLoadMeshFromX-lost", 0, 0);
    return false;
}

if (mtrlbuffer != 0 && numMtrl != 0)
{
    //读取材质和纹理数据
    D3DXMATERIAL* mtrls = (D3DXMATERIAL*)mtrlbuffer->GetBufferPointer();
    for (int i = 0; i < numMtrl; i++)
    {
        //设置环境光颜色
        mtrls[i].MatD3D.Ambient = mtrls[i].MatD3D.Diffuse;
        //获取材质
        Mtrls.push_back(mtrls[i].MatD3D);
        if (mtrls[i].pTextureFilename != 0)
        {
            IDirect3DTexture9* tex = 0;
            //创建纹理对象
            D3DXCreateTextureFromFile(g_pd3dDevice, mtrls[i].pTextureFilename, &tex);
            Textures.push_back(tex);
        }
        else
        {
            Textures.push_back(0);
        }
    }
}

mtrlbuffer->Release();
//优化原网格(优化类型,优化前的邻接数组指针,优化后的邻接数组指针,通常为null,通常为null)
hr = mesh->OptimizeInplace(
    D3DXMESHOPT_ATTRSORT |
    D3DXMESHOPT_COMPACT |
    D3DXMESHOPT_VERTEXCACHE,
    (DWORD*)adjbuffer->GetBufferPointer(), 0, 0, 0
    );
adjbuffer->Release();

if (FAILED(hr))
{
    ::MessageBox(0, "OptimizeInplace-lost", 0, 0);
    return false;
}

绘制模型

//渲染网格的各个部分
for (int i = 0; i < numMtrl; i++)
{
    g_pd3dDevice->SetMaterial(&Mtrls[i]);
    g_pd3dDevice->SetTexture(0, Textures[i]);
    mesh->DrawSubset(i);
}

效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值