19

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

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

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

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

4

2 回答 2

29

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(即:基本上是一个正方形)。

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

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

于 2013-02-27T07:53:03.593 回答
14

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

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

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

于 2013-02-26T17:20:15.797 回答