邻接三角形信息
对于某些的模型操作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龙书