c++ - 网格表示 - 一个顶点(空间位置)= 一个位置,tex 坐标,法线?

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

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

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

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

我现在正在为我的应用程序开发导出器插件。我应该:

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

或者可能:

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

?

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

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

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

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

那红色的呢?

我正在使用索引缓冲区。

enter image description here

最佳答案

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

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

关于c++ - 网格表示 - 一个顶点(空间位置)= 一个位置,tex 坐标,法线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22669228/

相关文章:

c# - 在特定窗口上执行 Ctrl-C 而不聚焦它

java - Java 的 3D 场景图形库?

3d - 匹配世界空间中的对象矩阵 - Three.js

c++ - 普通顶点结构中的 textureMappingu/v?

c++ - 在 DirectX 项目中正确设置 MMDevice

c++ - 如何使用 Direct3D9 缩放 IDirect3DTexture9?

C++ Long Long INT - 64 位此限制仅用于 64 位操作系统吗?

c++ - 如何制作不依赖 msvc dll 的 win32 应用程序?

java - openGL 中的帧速率和绘制流程

c++ - 多态对象复制