OpenGL - 为什么GL_ELEMENT_ARRAY_BUFFER用于索引?

The*_*Art 16 opengl opengl-es

我目前是OpenGL ES 2.0领域的新手,我想尽可能多地了解绑定,缓冲区,着色器等.

截至目前,我只是想了解之间的差异GL_ELEMENT_ARRAY_BUFFERGL_ARRAY_BUFFER以及何时使用每个指出预设.

我目前的理解使我相信这GL_ELEMENT_ARRAY_BUFFER是专门针对所述三角形的指数,而另一个是针对其他一切的指数.

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

goa*_*der 24

GL_ELEMENT_ARRAY_BUFFER用于指示您呈现的缓冲区包含"other"(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(即:基本上是一个正方形).

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

注意:上面的例子只显示顶点 - 您可以在那里交错尽可能多的数据(顶点颜色,法线,纹理坐标等).

  • 这是我所了解的理解。我唯一真正的问题是为什么缓冲区标签中有 ELEMENT 一词?这就是每次都让我失望的原因,因为......它只是一个数组。我不会完全称它为元素数组。 (3认同)
  • 就我个人而言,术语“元素”在我的名字中意味着它是“元素”引用的数组-因为数据缓冲区可以包含任意数据-但每组数据(顶点+法线+颜色+ tex坐标)基本上都可以称为一个“元素”。 (2认同)

dat*_*olf 12

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

通过引入通用顶点属性,添加了关联功能.

今天,主要是暗示OpenGL实现要知道数据将以何种方式进行处理,以相应地优化数据流.但它也可以很好地提醒程序员,目前正在处理什么.