首页 文章

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

提问于
浏览
2

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

我知道顶点缓冲区存储网格的所有顶点 . 现在假设我们想制作一个立方体 . 这意味着构造它需要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 回答

  • 4
    • 一个立方体有 6 个面孔

    • 每个面由 2 三角形组成

    • 每个三角形由 3 顶点组成

    • 因此, 6 * 2 * 3 = 36 顶点 . 每个顶点在这里都被索引一次,所以没有任何技巧,你的索引缓冲区中有 36 个元素 .

    However ,此方法适用于您使用 GL_TRIANGLES ,即每个三角形独立于下一个指定的位置 .

    您可以使用 GL_TRIANGLE_STRIP 并使用 6 绘制调用为 4 索引指定每个面,但这会使您的大小为 4 * 6 = 24 . 这是一个浪费的绘制调用,24!= 32.另外,你将不得不使用一些索引缓冲区偏移绘制调用,这对绘制一个多维数据集来说是愚蠢的 .

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

    • 围绕一个轴缠绕立方体的4个面 . 每个边都有2个顶点,但必须重复第一个边以覆盖最后一个面 . 那是 2 * 5 = 10 .

    • 索引步骤1中最后一个索引所在的未覆盖面,重复起始索引(导致退化三角形) . 4

    • 在最后一个索引上添加退化索引,并在剩余多维数据集面的开头再次添加一个退化索引 . 2

    • 索引最后一个立方体面 . 4

    • 总的来说,我们有 10 4 2 4 = 20 指数 .

    但这不是32.真可惜 .

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

    唉,这也不等于32 .

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

    • 它可能是一个int中的位数,这可能是你're using as the index type in your index buffer. This is a size of something...indexy...that' 32 ...

    • 这可能是因为4边使用 GL_TRIANGLES 而2边是 GL_TRIANGLE_STRIP 的答案是明智的做法 .

    • It could almost certainly be 要么您误读了问题,请阅读其他问题的答案,要么您的答题纸是错误的 .

    32 只是没有意义 .

相关问题