`
jgsj
  • 浏览: 960639 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

邻接三角形信息

对于某些的模型操作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龙书

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics