作者:StrongCoding
邮箱:StrongCoding@qq.comDX群:130302441
若文中有误,请告知.十分感谢.一起加油.
从这篇开始,我们将一起开启中级的网格模型教程,深夜了,不罗嗦了,直插主题:
一、涉及的相关概念:
1、 ID3DXBuffer
ID3DXBuffer是用来存储D3DX的邻接信息的。它仅有两个方法:
LPVOID GetBufferPointer(); // 用于获取邻接信息的首地址的
DWORD GetBufferSize(); // 用于获取邻接信息数组大小的
ID3DXBuffer会用在加载文件网格模型的方法中。稍后做介绍。
2、如何创建一个空的缓冲?
ID3DXBuffer* pBuffer = NULL;
D3DXCreateBuffer( 4*sizeof(int), &pBuffer );
原型:
HRESULT D3DXCreateBuffer(
DWORD NumBytes, LPD3DXBUFFER * ppBuffer );
3、从ID3DXBuffer中获取相关信息的时候,只需要做下强制转换就可以,其实也不能说强制转换了,因为本身ID3DXBuffer就 是一个LPVOID(即Void*),示例如下:
(1) 你比方说,我们想要获取它所容纳的MESH的邻接信息我们就可以这样子做:
DWORD* dataAdjacencyInfo = ( DWORD* )ID3DXBuffer_Temp->GetBufferPointer();
(2) 再者比方说,你想要获取它的材质信息,那你就可用这样子做:
D3DXMATERIAL *pMaterial = ( D3DXMATERIAL* )ID3DXBuffer_Temp->GetBufferPointer();
4、收尾
因为D3DXBuffer这个东西是基于COM机制的,所以在你不需要它的时候,请记得释放:
ID3DXBuffer_Temp->Realsase();
二、X文件简介:
我们之前使用过D3DXCreate*之类的东西创造了例如茶壶、圆柱、正方体等,其实,理论上来说,我们自己通过前面网格模型 的初级教程里边所学到的,完全我们可以通过我们自己指定顶点来生成这些东西,但是麻烦程度可想而知。基于这个原因,为了速度 简化我们程序员的负担,行业内出现了很多建模软件例如3DMAX、Maya等,于是乎出现了美工这一职业的诞生,来辅助程序员对于 真实世界的刻画。这些建模软件建出模型来之后,完全可以导入到一个外部的文件中存储模型的顶点、法线、纹理、动画信息。我们 程序员要做的事情便是解析导出来的文件。如果使用DX标准的X模型文件,我们只需要调用底层函数便可以导入这些数据,避免了我 们自己手动写某种特定格式的模型文件。
三、从磁盘文件加载X文件
HRESULT D3DXLoadMeshFromX(
LPCTSTR pFilename, DWORD Options, LPDIRECT3DDEVICE9 pD3DDevice, LPD3DXBUFFER * ppAdjacency, LPD3DXBUFFER * ppMaterials, LPD3DXBUFFER * ppEffectInstances, DWORD * pNumMaterials, LPD3DXMESH * ppMesh );
参数请自行查阅帮助文档.
注意:LPD3DXBUFFER *ppMaterials, 这是记录材质相关的,里边包含两层信息一个是材质信息D3DMATERIAL9
和纹理文件名。下面是ID3DXMATERIAL的原型:
typedef struct D3DXMATERIAL {
D3DMATERIAL9 MatD3D;
LPSTR pTextureFilename;
} D3DXMATERIAL, *LPD3DXMATERIAL;
四、从磁盘文件加载纹理( 实际上加载的是X文件对应的纹理文件 )
D3DXCreateTextureFromFile(
Device,
mtrls[i].pTextureFilename,
&tex);
原型:
HRESULT D3DXCreateTextureFromFile(
LPDIRECT3DDEVICE9 pDevice, LPCTSTR pSrcFile, LPDIRECT3DTEXTURE9 * ppTexture );