网格的表示 - 一个顶点(空间中的位置)=一个pos,tex coord,normal?

时间:2014-03-26 17:53:56

标签: c++ 3d directx mesh directx-11

我正在编写用于在DirectX应用程序中存储,加载和渲染静态网格物体的类。

我知道Box模型可以使用8个顶点,但通常它使用24或36(因为一个“空间顶点”实际上是3个顶点,具有相同的位置和不同的纹理坐标/法线)。

我的问题是:网格物体怎么样(例如从3ds max或类似应用程序导出的角色网格物体)?

我正在为我的应用程序处理导出程序插件。我应该:

  • 对于网格中的每个顶点,将其导出(作为位置,法线,纹理坐标) - 在某些情况下是否足够/?

或者可能:

  • 对于每个面,导出3个顶点(pos,normal,tex coord)

我不确定3ds max中相同“顶点”的纹理坐标/法线是否会不同(相同位置但不同法线/ tex坐标?)。

第二个aprouch应该可以与D3DPT_TRIANGLELIST一起使用,但是对于5.000个顶点来自3ds max的网格我将获得15.000个“实际”顶点(+/-每个3将具有相同的pos和不同的tex coord /法线)。

另外,在下面的例子中,对象由两部分组成 - 顶部一个有#1平滑组,底部一个有#2平滑组 - 我的问题看起来不同顶点“内部”平滑组和两组之间(例如顶部/底部的连接)?

换句话说:是黑色圆圈“顶点”一个“真实”顶点,具有相同的pos / tex坐标/法线,或者它的4个顶点只有相同的位置(4个顶点具有相同的一切有意义吗?)?< /强>

红色的呢?

我正在使用索引缓冲区。

enter image description here

1 个答案:

答案 0 :(得分:1)

为每个三角形导出三个顶点总是足够的,但可能涉及不必要地复制数据。如果相邻三角形具有不相交的纹理坐标或其他属性,则必须重复才能生成正确的渲染结果。如果需要,可以在后处理步骤中合并重复的顶点。

关于参考图像,它看起来没有任何纹理应用于曲面,因此红色圆圈顶点必须是缓冲区中的两个不同顶点才能创建颜色不连续,因为它应该是。黑色圆圈顶点不是必须的,但它仍然可能是重复的。通常,您应该在平滑组中共享顶点,而不必担心跨组进行重复数据删除。如果顶点吞吐量最终成为一个问题,您可以考虑优化它,但对于大多数工作负载,您将是像素或填充限制。