OpenGL - 为什么GL_ELEMENT_ARRAY_BUFFER用于索引?

时间:2013-02-26 16:36:40

标签: opengl opengl-es

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

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

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

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

2 个答案:

答案 0 :(得分:23)

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表示第二个三角形(即:基本上是正方形)。

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

注意:以上示例仅显示顶点 - 您可以在此处交换尽可能多的数据(顶点颜色,法线,纹理坐标等)。

答案 1 :(得分:11)

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

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

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