图形学 Direct3D的3D模型处理2 - 邻接三角形的信息及优化

来源:互联网 发布:java erp 开源框架 编辑:程序博客网 时间:2024/05/18 08:47

邻接三角形信息

对于某些的模型操作mesh operations),例如优化,需要知道三角形的邻接信息。Mesh的adjacency array存储着这样的信息。

ajacency array是一个DWORD数组。每个元素存储一个索引,表示一个mesh中的三角形。例如下标为i的就表示第i个三角形,可以通过计算得到三角形顶点索引信息:

A = i · 3

B = i · 3 + 1

C = i · 3 + 2

注意值为 ULONG_MAX = 4294967295,代表改边没有邻接三角形。可以用-1来赋值。-1变为无符号通常为最大值。

三角形有三条表,所以最多有三个邻接三角形,所以pAdjacency(ajacency array)必须是ID3DXBaseMesh::GetNumFaces() * 3(三角形面的三倍)。

计算邻接三角形信息:

HRESULT ID3DXMesh::GenerateAdjacency(    FLOAT fEpsilon,    DWORD* pAdjacency);
  • 用法:

DWORD* adjacencyInfo = new DWORD[Mesh->GetNumFaces() * 3];Mesh->GenerateAdjacency(0.001f, adjacencyInfo);

 

优化:

顶点和索引合理安排可以更加有效的渲染mesh模型。

Direct3D函数:

HRESULT ID3DXMesh::Optimize(    DWORD Flags,    CONST DWORD *pAdjacencyIn,    DWORD *pAdjacencyOut,    DWORD *pFaceRemap,    LPD3DXBUFFER *ppVertexRemap,    LPD3DXMESH *ppOptMesh);
 

 

应用:

// 读取未优化的mesh信息DWORD* adjacencyInfo = new DWORD[Mesh->GetNumFaces() * 3];Mesh->GenerateAdjacency(0.0f, adjacencyInfo);// 用来保存新的优化了的mesh邻接三角形信息DWORD* optimizedAdjacencyInfo = new DWORD[Mesh->GetNumFaces() * 3];ID3DXMesh* meshOut = 0;//新的mesh模型Mesh->Optimize(D3DXMESH_MANAGED | D3DXMESHOPT_COMPACT |D3DXMESHOPT_ATTRSORT | D3DXMESHOPT_VERTEXCACHE,adjacencyInfo, optimizedAdjacencyInfo, 0, 0, &meshOut);

下面的函数是直接优化原mesh模型:

HRESULT ID3DXMesh::OptimizeInplace(    DWORD Flags,    CONST DWORD *pAdjacencyIn,    DWORD *pAdjacencyOut,    DWORD *pFaceRemap,    LPD3DXBUFFER *ppVertexRemap

这里并没有太多深入其原理。只是讲用法。

 

Reference:

Direct3D龙书

 

原创粉丝点击