【问题标题】:Calculate Index-buffer size of a cube计算多维数据集的索引缓冲区大小
【发布时间】:2015-11-01 03:44:26
【问题描述】:

我已经学习了几周的计算机图形学课程,考试即将到来,但是我一直卡在索引缓冲区这个话题上。

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

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

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

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

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

【问题讨论】:

  • 嗯,这里有很多未指定的东西,但 32 似乎是一个奇怪的解决方案。所需的元素数量取决于选择的原始类型。例如,可以用只有 4 个顶点的三角形条或扇形来绘制每个面,总共 24 个。但是,您可能想要开始新的图元,因此您最终会得到 29 个。OTOH,由于只使用了 8 个顶点,因此边缘没有不连续点,因此您可以将条带跨得更长,从而进一步减少计数.以某种奇怪的方式使用 32 个顶点肯定是可能的,但我真的认为 36 是有意的答案。

标签: opengl buffer vertex vertex-buffer index-buffer


【解决方案1】:
  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 中的位数,这可能是您在索引缓冲区中用作索引类型的类型。这是某种东西的大小......索引......那是 32......
  • 可能答案认为使用GL_TRIANGLES 4 面和GL_TRIANGLE_STRIP 2 面是明智的做法。
  • 几乎可以肯定您读错了问题,阅读了其他问题的答案,或者您的答题卡有误。

32 就是没有意义。

【讨论】:

  • 感谢您的详尽解释 :) 我认为老师确实打错了,因为我的同学也无法弄清楚。不管怎样,你的解释对我帮助很大,再次感谢!
猜你喜欢
  • 1970-01-01
  • 2019-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-28
  • 1970-01-01
相关资源
最近更新 更多