计算多维数据集的索引缓冲区大小
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 中使用的索引缓冲区)。
- 一个立方体有 6 个面
- 每张脸由2个三角形组成
- 每个三角形由3个顶点组成
- 因此,6 * 2 * 3 = 36个顶点。每个顶点在这里被索引一次,所以没有任何技巧,你的索引缓冲区中有 36 个元素。
但是,如果您使用GL_TRIANGLES
,即每个三角形的指定独立于下一个三角形,则此方法适用。
您可以使用 GL_TRIANGLE_STRIP
并使用 6 绘制调用使用 4 索引指定每个面,但这会让您4 * 6 = 24 的大小。这是对绘制调用的一种浪费,24 != 32。另外,您必须使用一些索引缓冲区偏移绘制调用,这对于绘制立方体来说很愚蠢。
您可以使用 GL_TRIANGLE_STRIP
和 degenerate triangle strip method 来进一步减少您需要的索引数量。
- 围绕一个轴包裹立方体的 4 个面。每条边有 2 个顶点,但必须重复第一条边以覆盖最后一个面。即 2 * 5 = 10.
- 索引步骤 1 中最后一个索引所在的未覆盖面,重复起始索引(导致退化三角形)。 4
- 在最后一个索引上添加退化索引,并在剩余立方体面的开头再次添加一个。 2
- 索引最后一个立方体面。 4
- 总共有 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就是说不通。
随着考试的临近,我已经学习了几周的计算机图形学课程,但是我一直停留在索引缓冲区的主题上。
我知道顶点缓冲区存储网格的所有顶点。现在假设我们想制作一个立方体。这意味着构建它需要 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 中使用的索引缓冲区)。
- 一个立方体有 6 个面
- 每张脸由2个三角形组成
- 每个三角形由3个顶点组成
- 因此,6 * 2 * 3 = 36个顶点。每个顶点在这里被索引一次,所以没有任何技巧,你的索引缓冲区中有 36 个元素。
但是,如果您使用GL_TRIANGLES
,即每个三角形的指定独立于下一个三角形,则此方法适用。
您可以使用 GL_TRIANGLE_STRIP
并使用 6 绘制调用使用 4 索引指定每个面,但这会让您4 * 6 = 24 的大小。这是对绘制调用的一种浪费,24 != 32。另外,您必须使用一些索引缓冲区偏移绘制调用,这对于绘制立方体来说很愚蠢。
您可以使用 GL_TRIANGLE_STRIP
和 degenerate triangle strip method 来进一步减少您需要的索引数量。
- 围绕一个轴包裹立方体的 4 个面。每条边有 2 个顶点,但必须重复第一条边以覆盖最后一个面。即 2 * 5 = 10.
- 索引步骤 1 中最后一个索引所在的未覆盖面,重复起始索引(导致退化三角形)。 4
- 在最后一个索引上添加退化索引,并在剩余立方体面的开头再次添加一个。 2
- 索引最后一个立方体面。 4
- 总共有 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就是说不通。