VAO和GL_ELEMENT_ARRAY_BUFFER关联

Cri*_*iss 5 language-agnostic opengl

我在理解VAO和绑定到的缓冲区之间的关联时遇到了问题GL_ELEMENT_ARRAY_BUFFER(我们称其为EBO)。我知道它是VAO状态的一部分,但与glVertexAttribPointer调用一起使用的缓冲区有所不同(那些缓冲区只是被VAO记住,因为属性存储不需要绑定它们-如果我理解正确的话)。
讨论中,它要求:

与GL_ARRAY_BUFFER不同,VAO存储GL_ELEMENT_ARRAY_BUFFER的当前绑定。调用glBindBuffer(GL_ELEMENT_ARRAY_BUFFER)将对指定缓冲区的引用存储在当前绑定的VAO中。glDrawElements()等从当前绑定的VAO中存储的缓冲区中获取顶点索引。因此,在VAO之间切换会在元素数组之间切换。

但是我是否需要glBindBuffer(GL_ELEMENT_ARRAY_BUFFER)在VAO的绑定和解除绑定之间进行调用以确保它会“保存”在其状态中,或者在创建VAO时VAO只会获取当前绑定的EBO?
同样,上面引述的答案对我来说也不清楚,即VAO是否只是“知道”(作为属性存储缓冲区)glDrawElements必须从哪个缓冲区索引()中获取,还是当VAO绑定时VAO绑定了正确的EBO?

编辑:我的第一个问题已在此处回答,但是我相信第二个问题已由@ Rabbid76回答。

Rab*_*d76 4

\n

我需要glBindBuffer(GL_ELEMENT_ARRAY_BUFFER)在VAO的绑定和解除绑定之间调用吗?

\n
\n\n

OpenGL规范(第 10.3 章 VERTEX ARRAYS)明确指出:

\n\n
\n

顶点数组对象是通过将 GenVertexArrays 返回的名称与命令
void BindVertexArray( uint array ); arrayis 顶点数组对象名称绑定来创建的。
生成的顶点数组对象是一个新的状态向量,包含所有状态并具有表 23.3 和 23.4 中列出的相同初始值。
\n BindVertexArray还可以用于绑定现有的顶点数组对象。\n 如果绑定成功,则不会更改绑定的顶点数组\n 对象的状态,并且任何先前的绑定都会被破坏

\n
\n\n

表 23.3 和 23.4 包含ELEMENT_ARRAY_BUFFER_BINDING

\n\n

这意味着,必须GL_ELEMENT_ARRAY_BUFFER在绑定顶点数组对象之后glBindVertexArray才能绑定 ( )。
\n对象的“名称”GL_ELEMENT_ARRAY_BUFFER存储在顶点数组对象状态向量中。
如果顶点数组对象已被解除绑定并再次绑定,则GL_ELEMENT_ARRAY_BUFFER也已知并再次绑定。

\n\n
\n\n

注意,glBufferData为缓冲区对象创建一个新的数据存储。glBufferData删除任何现有数据存储,并设置缓冲区对象\xe2\x80\x99s 状态变量的值。这意味着,数据将与缓冲区对象关联,直到关联新数据为止。- 请参阅Khronos 参考页glBufferDataOpenGL 4.6 API 兼容性配置文件规范;6.1 创建并绑定缓冲区对象

\n