图形学 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龙书

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值