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);
}

效果

文章目录
  1. 1. Model
    1. 1.1. 声明变量
    2. 1.2. 加载模型
    3. 1.3. 绘制模型