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

时间:2015-08-08 22:02:13

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

我一直在关注计算机图形学课程几周,考试即将开始,但我已经陷入了索引缓冲的主题。

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

我读过index-buffers存储顶点的索引。所以我们立方体的顶点索引是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中使用的索引缓冲区,如果这很重要的话)。

1 个答案:

答案 0 :(得分:4)

  1. 立方体有 6
  2. 每张脸由 2 三角形
  3. 组成
  4. 每个三角形由 3 顶点
  5. 组成
  6. 因此, 6 * 2 * 3 = 36 顶点。每个顶点都在这里被索引一次,所以没有任何技巧,你的索引缓冲区中有 36 元素。
  7. 然而,如果您使用的是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 indices。
    6. 但这不是32.糟糕。


      如果您真的想要将该索引缓冲区打包,您可以使用2个三角形粉丝(通过GL_TRIANGLE_FAN)和一些花哨的绘制调用将其降低到 16 < / strong>指数。每个风扇从相对的角落开始,并围绕其相邻的面。

      唉,这也不等于32。


      那么,这个eldritch 32 来自哪里?

      • 可能是int中的位数,这可能是您在索引缓冲区中用作索引类型的位数。这是一个大小的东西... indexy ......那是32 ......
      • 几乎可以肯定你要么误读了这个问题,要么回答不同的问题,要么你的答题纸错了。

      32 只是没有意义。