2

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

我知道顶点缓冲区存储网格的所有顶点。现在假设我们想要制作一个立方体。这意味着构建它需要 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 中使用的索引缓冲区,如果这很重要的话)。

4

1 回答 1

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

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


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


您可以使用GL_TRIANGLE_STRIP退化三角形带方法来进一步减少您需要的索引数量。

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

但这不是 32. 无赖。


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

唉,这也不等于 32。


那么,这个 eldritch 32是从哪里来的呢?

  • 可能是 int 中的位数,这可能是您在索引缓冲区中用作索引类型的类型。这是某种东西的大小......索引......那是32......
  • 可能是认为使用GL_TRIANGLES4 面和GL_TRIANGLE_STRIP2 面的答案是明智的做法。
  • 几乎可以肯定的是,要么你读错了问题,要么阅读了另一个问题的答案,要么你的答题纸错了。

32只是没有意义。

于 2015-08-09T20:22:04.077 回答