【问题标题】:OpenGL - why is GL_ELEMENT_ARRAY_BUFFER for indices?OpenGL - 为什么 GL_ELEMENT_ARRAY_BUFFER 用于索引?
【发布时间】:2013-02-26 16:36:39
【问题描述】:

我目前是 OpenGL ES 2.0 领域的新手,希望尽可能多地了解绑定、缓冲区、着色器等方面的知识。

到目前为止,我只是想了解GL_ELEMENT_ARRAY_BUFFERGL_ARRAY_BUFFER 之间的区别以及何时使用每个提到的预设。

我目前的理解使我相信GL_ELEMENT_ARRAY_BUFFER 专门用于上述三角形的索引,而另一个用于其他所有内容。

有人可以详细说明为什么以及这是否正确吗? GL_ELEMENT_ARRAY_BUFFER 的处理方式有何不同?

【问题讨论】:

    标签: opengl opengl-es


    【解决方案1】:

    GL_ELEMENT_ARRAY_BUFFER 用于指示您呈现的缓冲区包含“其他”(GL_ARRAY_BUFFER) 缓冲区中每个元素的索引。

    所以,作为一个非常基本的例子,只有顶点(没有其他数据),如果你有一个索引缓冲区:

    {0, 1, 2} {0, 2, 3}

    并且数据缓冲区包含:

    {{0, 0, 0}, {1, 0, 0}, {1, 1, 0}, {0, 1, 0}}

    然后,当您调用 glDrawElements 时,它知道为第一个三角形挑选顶点 0、1 和 2,然后为第二个三角形挑选顶点 0、2、3(即:基本上是一个正方形)。

    当您拥有具有大量顶点和面的更复杂的模型时,这将变得更加有用 - 因为许多面将共享相同的顶点(因此您不需要“重新发送”相同的数据)。

    注意:上面的示例只显示了顶点 - 您可以在其中交错任意数量的数据(顶点颜色、法线、纹理坐标等)。

    【讨论】:

    • 这是我了解到的理解。我唯一真正的问题是为什么缓冲区标签中的元素一词?这就是每次都让我失望的原因,因为……它只是一个数组。我不会把它称为元素数组。
    • 就我个人而言,该名称中的“元素”一词意味着它是“元素”引用的数组 - 因为数据缓冲区可以包含任意数据 - 但每个数据分组(顶点 + 法线 + 颜色+ tex coord) 基本上可以称为“元素”。
    • 嗯,元素数组只包含包含元素的数组的顺序......这是我能想到的唯一合乎逻辑的原因,这对我来说毫无意义。如果 GL_ARRAY_BUFFER 包含元素,为什么它不称为元素缓冲区?这就是我有点失落的地方哈哈。
    【解决方案2】:

    这主要有历史原因。回到没有 VBO 的时候,用 glVertexPointer 指定的指针和类似的指针都没有与任何类型的 OpenGL 对象“关联”。当 VBO 被引入时,这种行为会延续到 VBO 的语义中,这需要索引和属性的不同缓冲区目标。

    随着通用顶点属性的引入,添加了这样的关联功能。

    今天,它主要是提示 OpenGL 实现了解数据将以何种方式处理,以相应地优化数据流。但它也可以很好地提醒程序员当前正在处理的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多