作者:StrongCoding
邮箱:StrongCoding@qq.comDX群:130302441
若文中有误,请告知.十分感谢.一起加油.
下面我们一起学习一下,如何利用网格模型中级一的知识加载一个普通的.X文件,仅仅列一下核心代码:
一、实现关键思路:
1、加载.X文件
2、从.X文件中提取材质和纹理
3、释放材质指针
4、优化MESH
5、释放邻接信息指针
6、分批渲染
二、遵循上面的流程我们一起来写一下(注意是伪代码):
1、加载.X文件
ID3DXBuffer* adjBuffer = 0; // 存储邻接信息
ID3DXBuffer* mtrlBuffer = 0; // 用于描述材质
DWORD NumMaterials = 0; // 记录材质数目
ID3DXMesh *pMesh = NULL;
hr = D3DXLoadMeshFromX(
"bigship1.x", D3DXMESH_VB_MANAGED, pD3DDevice, &adjBuffer, &mtrlBuffer , 0, &NumMaterials, &pMesh );
2、从.X文件中提取材质和纹理
if( mtrlBuffer != 0 && numMtrls != 0 )
{
D3DXMATERIAL* mtrls = (D3DXMATERIAL*)mtrlBuffer->GetBufferPointer();
for(int i = 0; i < numMtrls; i++)
{
// the MatD3D property doesn't have an ambient value set
// when its loaded, so set it now:
// 当MatD3D加载的时候是没有环境值的,所以加载它之前呢,需要先指定一下
mtrls[i].MatD3D.Ambient = mtrls[i].MatD3D.Diffuse;
// save the ith material
// 保存材质信息于全局变量中
Mtrls.push_back( mtrls[i].MatD3D );
// check if the ith material has an associative texture
// 检测这个材质是不是有一个对应的纹理
if( mtrls[i].pTextureFilename != 0 )
{
// yes, load the texture for the ith subset
// 好的,从子集中加载纹理数据,来源从纹理文件中提取并使用
IDirect3DTexture9* tex = 0;
D3DXCreateTextureFromFile(
Device,
mtrls[i].pTextureFilename,
&tex
); // save the loaded texture Textures.push_back( tex ); } else { // no texture for the ith subset // 该材质编号处没有涉及纹理数据,便把0放置在当前的位置处 Textures.push_back( 0 ); } } }
3、释放材质信息指针
ID3DXMaterial_Temp->Realease();
4、优化MESH
hr = Mesh->OptimizeInplace( D3DXMESHOPT_ATTRSORT | D3DXMESHOPT_COMPACT | D3DXMESHOPT_VERTEXCACHE, (DWORD*)adjBuffer->GetBufferPointer(), 0,
0,
0
);
5、释放邻接信息指针
ID3DXBuffer_Temp->Realease();
6、分批渲染
for(int i = 0; i < Mtrls.size(); i++)
{
Device->SetMaterial( &Mtrls[i] );
Device->SetTexture(0, Textures[i]);
Mesh->DrawSubset(i);
}