DirectX 90 3D 网格二
网格二
ID3DXBuffer
ID3DXBuffer接口是一种泛型数据结构 该接口有两个方法
· LPVOID GetBufferPointer() ; 返回指向缓存中数据起始位置的指针
· DWORD GetBufferSize(); 返回缓存的大小,单位为字节。
为了保持该接口的通用性, 该接口使用了void类型指针,这就意味着必须由我们来实现被存储的数据类型。例如:D3DXLoadMeshFromX函数用ID3DXBuffer 类型的指针返回一个网格对象的邻接信息。由于邻接信息被 存储在一个DWORD类型的数组中,所以当我们想要使用该接口的邻接信息时。我们必须对缓存进行强制类型转换。
例:
DWORD *info = (DWORD*)adjacencyInfo->GetBufferPointer();
D3DXMATERIAL *mtrls = (D3DXMTRIAL*) mtrlBuffer->GetBufferPointer();
用完之后 要释放:
adjacencyInfo->Release();
mtrlBuffer->Release();
创建一个空的ID3DXBuffer对象
HRESULT D3DXCreateBuffer(
DWORD NumBytes, //Size of the Buffer
LPD3DXBUFFER *ppBuffer //Returns the created buffer
);
加载XFile 文件
使用D3DXLoadMeshFromX加载网格数据并其在XFile文件中
HRESULT D3DXLoadMeshFromX(
LPCTSTR pFilename,
DWORD Options,
LPDIRECT3DDEVICE9 pDevice,
LPD3DXBUFFER* ppAdjacency,
LPD3DXBUFFER* ppMaterials,
LPD3DXBUFFER* ppEffectInstances,
DWORD* pNumMaterials,
LPD3DXMESH* ppMesh
);
说明一下:
·pFileName 所在加载的XFile文件名。
·Options 创建网格进所使用的创建标记。
·D3DXMESH_32BIT 网格将使用32位索引。
·D3DXMESH_MANAGED 网格数据将被存储于托管池中
·D3DXMESH_WRITEONLY 指定网格为只读
·D3DMXESH_DYNAMIC 网格缓存将使用动态内存
·pDevice 与该网格对象相关的设备指针。
·ppAdjacency 返回一个ID3DBuffer 对象,该对象包含了一个描述了该网格对象的邻接信息的DWORD类型的数组。
·ppMaterials 返回一个ID3DXBuffercf对象,该对象包含了一个存储了该网格材质数据的D3DXMATERIAL类型的结构数组。
·ppEffectInstances 返回一个ID3DXBuffer对象,
包含一个D3DXEFFECTINSTANCE结构。指定为0忽略。
·pNumMaterials 返回网格中的材质数目(即
·ppMesh 返回所他创建的并已填充了XFile几何数据的ID3DXMesh对象。
XFile材质
D3DXLoadMeshFronX函数中第5个参数返回了一个存储了材质数据的
D3DXMATRIAL类型的结构数组。D3DXMATRIAL定义如下:
typedef struct D3DXMATRIAL{
D3DMATERIAL9 MatD3D;
LPSTR pTextureFilename;
} D3DXMATERIAL;
LPSTR pTextureFilename 指向以NULL结尾的字符串的指针, 该字符串指定了与网格相关的纹理文件名。XFile文件中并未存储纹理数据, 它只包含了纹理图像文件名。该文件名是对包含了实际纹理数据的纹理图像的引用。当用D3DXLoadMeshFromX 函数加载了一个XFile文件后,我们必须根据指定的纹理文件名加载纹理数据。
生成顶点法线
XFile 文件中有可能没有存放顶点的法向量。为了使用光照,我们可能需要手工计算每个顶点的法向量。
HRESULT D3DXComputNormals(
LPD3DXBASEMESH pMesh, //Mesh to compute the normals of,
CONST DWORD *pAdjacency //Input adjacency info
);
如果一个XFile文件不含顶点法线数据,则由函数D3DXLoadMeshFromX所创建的ID3DXMesh网格对象在其顶点格式中的将不含D3DFVF_NORMAL标记。所以,在使函数D3DXComputeNormals之前,我们必须克隆该网格,并为其指定一个包含了D3DFVF_NORMAL标记的顶点格式。
ID3DXPMesh接口方法
ID3DXPMesh接口继承自ID3DXBaseMesh 接口。
DWORD GetMaxFaces(VOID); //返回渐进网格面片数可被指定的上限
DWORD GetMaxVertices(VOID); //返回渐进网格顶点数据可被指定的上限
DWORD GetMinFaces(VOID); //返回渐进网格面片数可被指定的下限
DWORD GetMinVertices(VOID); //返回渐进顶点数可被指定的下限
HRESULT SetNumFaces(DWORD Faces);//设置网格的面片数被简化或细化到//的个数。
HRESULT SetNunVertices(DWORD Vertices);// 设置网格的顶点数可被简化或细//化的个数。
HRESULT TrimByFaces (
DWORD NewFacesMin,
DWORD NewFacesMax,
DWORD *rgiFaceRemap, //Face remap info
DWORD *rgiVertRemap, //Vertex remap info
);
//重新设定面片数据的最小值(NewFacesMin)和最大值(NewFaceMax)。
//NewFacesMin 和NewFacesMax 必须位于[GetMinFaces(), GetMaxFaces()]内。
HRESULT TrimByVertices (
DWORD NewVerticesMin,
DWORD NewVerticesMax,
DWORD *rgiFaceRemap, //Face remap info
DWORD *rgiVertRemap, //Vertex remap info
);
// 重新设定顶点数的最小值(NewVerticesMin)和最大值(NewVerticesMax)。
// NewVerticesMin 和NewVerticesMax 必须位于区间[GetMinVertices (),
//GetMaxVertices ()]
江西理工大学 Fangshenghui2010-5-5