|
|
发表于 2005-2-7 13:20:00
|
显示全部楼层
Re:先给各位同仁拜个年!然后问个问题:)
先要使用D3D给我们提供的模型接口定义一个模型的指针出来。
LPD3DXMESH g_pMesh = NULL; // 模型对象指针
D3DMATERIAL8* g_pMeshMaterials = NULL; // 模型的材质数组(一个模型可以有多个材质)
LPDIRECT3DTEXTURE8* g_pMeshTextures = NULL; // 模型的纹理数组(一个模型可以有多个纹理)
DWORD g_dwNumMaterials = 0L; // 材质的数量(等于纹理数量)
//接着就是从.x文件读入我们的模型。
// 材质缓冲
LPD3DXBUFFER pD3DXMtrlBuffer;
// 读入tiger.x到我们的模型
if( FAILED( D3DXLoadMeshFromX(
"Tiger.x", // [输入].x文件名
D3DXMESH_SYSTEMMEM, // [输入]使用系统内存
g_pd3dDevice, // [输入]d3d设备指针
NULL, // 不用管
&pD3DXMtrlBuffer, // [输出]获取模型的材质缓冲
&g_dwNumMaterials, // [输出]材质的数量
&g_pMesh ) ) ) // [输出]模型对象指针
{
return E_FAIL;
}
//遗憾的是D3DXMESH并没有为什么提供模型的材质和纹理管理,所以必须自己做这件事情。
// 获取材质指针
D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer-> GetBufferPointer();
g_pMeshMaterials = new D3DMATERIAL8[g_dwNumMaterials];
g_pMeshTextures = new LPDIRECT3DTEXTURE8[g_dwNumMaterials];
for( DWORD i=0; i<g_dwNumMaterials; i++ )
{
// 把需要的材质拷贝到我们的材质对象中
g_pMeshMaterials = d3dxMaterials.MatD3D;
// 为材质设置环境色
g_pMeshMaterials.Ambient = g_pMeshMaterials.Diffuse;
// 创建对应的纹理
if( FAILED( D3DXCreateTextureFromFile( g_pd3dDevice,
d3dxMaterials.pTextureFilename,
&g_pMeshTextures ) ) )
{
g_pMeshTextures = NULL;
}
}
// 释放缓冲
pD3DXMtrlBuffer->Release();
//一切准备就绪,渲染吧。要注意,在.x文件被读入时,模型是被切分了的,每一个材质对应一部分的模型。
// 根据材质的数量我们的模型被切分了,每个材质对应一部分
// 所以渲染的时候也要分几个部分渲染
for( DWORD i=0; i<g_dwNumMaterials; i++ )
{
// 为这一部分设置材质
g_pd3dDevice->SetMaterial( &g_pMeshMaterials );
g_pd3dDevice->SetTexture( 0, g_pMeshTextures );
// 渲染这一部分
g_pMesh->DrawSubset( i );
看看吧 |
|