计算多维数据集的索引缓冲区大小

Calculate Index-buffer size of a cube

随着考试的临近,我已经学习了几周的计算机图形学课程,但是我一直停留在索引缓冲区的主题上。

我知道顶点缓冲区存储网格的所有顶点。现在假设我们想制作一个立方体。这意味着构建它需要 8 个顶点。每个顶点由 3 个坐标 (x,y,z) 组成,因此顶点缓冲区将占用 3 x 8 = 24 个单位的 space.

我读到索引缓冲区存储顶点的索引。所以我们的立方体顶点的索引将是 1 到 8。这意味着 1 个三角形占用 3 个单位的 space。

一个困扰我的问题是:我们的索引缓冲区需要多少个 space 单位?

我推断立方体有 6 个面。每个面由 2 个三角形组成。这意味着有 12 个三角形,因此索引缓冲区将占用 3 x 12 = 36 个单位的 space。 (我使用这个网站得出这个结论:https://msdn.microsoft.com/en-us/library/windows/desktop/bb147325(v=vs.85).aspx)。 但是,我的回答 sheet 声称是 32。

通常我不会费心去 post 上 Whosebug,只是问问我的老师,但是他目前正在休假,要等到考试结束后才会回来。因此, 谁能向我解释索引缓冲区的大小是如何调节的? (如果重要的话,假设它是 OpenGL 中使用的索引缓冲区)。

  1. 一个立方体有 6 个面
  2. 每张脸由2个三角形组成
  3. 每个三角形由3个顶点组成
  4. 因此,6 * 2 * 3 = 36个顶点。每个顶点在这里被索引一次,所以没有任何技巧,你的索引缓冲区中有 36 个元素。

但是,如果您使用GL_TRIANGLES,即每个三角形的指定独立于下一个三角形,则此方法适用。


您可以使用 GL_TRIANGLE_STRIP 并使用 6 绘制调用使用 4 索引指定每个面,但这会让您4 * 6 = 24 的大小。这是对绘制调用的一种浪费,24​​ != 32。另外,您必须使用一些索引缓冲区偏移绘制调用,这对于绘制立方体来说很愚蠢。


您可以使用 GL_TRIANGLE_STRIPdegenerate triangle strip method 来进一步减少您需要的索引数量。

  1. 围绕一个轴包裹立方体的 4 个面。每条边有 2 个顶点,但必须重复第一条边以覆盖最后一个面。即 2 * 5 = 10.
  2. 索引步骤 1 中最后一个索引所在的未覆盖面,重复起始索引(导致退化三角形)。 4
  3. 在最后一个索引上添加退化索引,并在剩余立方体面的开头再次添加一个。 2
  4. 索引最后一个立方体面。 4
  5. 总共有 10 + 4 + 2 + 4 = 20 指数.

但这不是 32 岁。真可惜。


如果你真的想要压缩索引缓冲区,你可以使用 2 个三角形扇形(通过 GL_TRIANGLE_FAN)和一些花哨的绘制调用来将其压缩到16 个索引。每个扇形从相对的角开始并环绕其相邻的面。

唉,这也不等于 32。


那么,这个可怕的 32 来自哪里?

  • 可能是 int 中的位数,这可能是您在索引缓冲区中用作索引类型的。这是一个大小...indexy...那是 32...
  • 可能 认为使用 GL_TRIANGLES 用于 4 面和 GL_TRIANGLE_STRIP 用于 2 面的答案是明智的做法。
  • 几乎可以肯定是您误读了问题,阅读了另一个问题的答案,或者您的答案sheet是错误的。

32就是说不通。