作者:StrongCoding
邮箱:StrongCoding@qq.comDX群:130302441
若文中有误,请告知.十分感谢.一起加油.
这一篇我们一起学习下渐进网格,不多说废话,开主题:
一、渐变网格的概念
渐进网格通过ID3DXPMESH接口来实现.允许我们通过简化边来简化我们的MESH模型.我们能够简化,或者说简化到一定程度后, 复原之前的MESH.可分三个层次:高、中、低.
二、渐进网格的优势
渐进网格就像LOD地形一样,根据距离摄像机的远近,可降低其渲染细节,所以提高了渲染效率.
三、如何产生一个渐变网格
我们通过D3DXGeneratePMesh这个方法来实现渐变网格,其原型:
HRESULT D3DXGeneratePMesh(
LPD3DXMESH pMesh, // 原MESH CONST DWORD * pAdjacency, // 指向一个包含原MESH的邻接信息数组 CONST D3DXATTRIBUTEWEIGHTS * pVertexAttributeWeights,
// 原MESH的顶点品质权重值
CONST FLOAT * pVertexWeights, // 原MESH的顶点权重值 DWORD MinValue, // 指定我们期望简化的最少顶点数或者面数 DWORD Options, // 指定上面这个参数到底指的是顶点还是面数 LPD3DXPMESH * ppPMesh // 输出我们的渐进网格MESH
);
四、对于顶点品质权重的相关补充说明:
顶点权重值允许我们为每一个顶点属性指定一个权值,0.0表示没有权值值,顶点的权重值越高,被溢出的可能性就越低.
原型:
typedef struct D3DXATTRIBUTEWEIGHTS {
FLOAT Position; // 顶点位置 默认1.0 FLOAT Boundary; // 混合权重值 默认1.0 FLOAT Normal; // 正常值 默认1.0 FLOAT Diffuse; // 漫反射值 默认0.0 FLOAT Specular; // 高光值 默认0.0 FLOAT Texcoord[8]; // 8个纹理{ 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 } FLOAT Tangent; // 正切 FLOAT Binormal; // 次法线 } D3DXATTRIBUTEWEIGHTS, *LPD3DXATTRIBUTEWEIGHTS;
注意:默认的品质权重值是被推荐使用的,除非你的应用程序有一个很重要的理由而不使用它.
五、构建渐进网格模型的核心 ID3DXPMESH
DWORD GetMaxFaces(); // 返回渐进网格能够被设置的最大面数
DWORD GetMaxVertices(); // 返回渐进网格能够被设置的最大顶点数
DWORD GetMinFaces(); // 返回渐进网格能够被设置的最小面数
DWORD GetMinVertices(); // 返回渐进网格能够被设置的最小顶点数
HRESULT SetNumFaces(DWORD Faces); // 设置渐进网格所能设置的面数,以便让MESH简便或者复杂化
HRESULT SetNumVertices(DWORD Vertices); // 设置渐进网格所能设置的顶点数
HRESULT TrimByFaces( DWORD NewFacesMin, DWORD NewFacesMax,
DWORD * rgiFaceRemap,DWORD * rgiVertRemap
);// 允许我们设置新的最小最大渐变网格MESH的面数,也返回面或者顶点的重映射信息
HRESULT TrimByVertices( DWORD NewVerticesMin, DWORD NewVerticessMax,
DWORD * rgiFaceRemap, DWORD * rgiVertRemap );// 允许我们设置新的最小最大渐变网格MESH的顶点数,也返回面或者顶点的重映射信息