VAO和GL_ELEMENT_ARRAY_BUFFER关联

时间:2017-09-09 18:28:36

标签: opengl language-agnostic

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

  

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

但是我需要在VAO的绑定和取消绑定之间调用glBindBuffer(GL_ELEMENT_ARRAY_BUFFER)以确保它能够“保存”。它处于状态或VAO只会在创建VAO时采用当前绑定的EBO? 上面引用的答案也不清楚VAO是否只是知道' (作为属性存储缓冲区)必须从哪个缓冲区索引(glDrawElements)中获取,或者当VAO绑定时VAO是否绑定了正确的EBO?

编辑:我的第一个问题已经回答here,但我相信第二个问题已由@ Rabbid76回答。

2 个答案:

答案 0 :(得分:4)

  

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

OpenGL specification (chapter 10.3. VERTEX ARRAYS)清楚地说:

  

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

表23.3和23.4包含 ELEMENT_ARRAY_BUFFER_BINDING

这意味着,{<1}}必须在顶点数组对象绑定后绑定GL_ELEMENT_ARRAY_BUFFER)。 &#34;名称&#34; glBindVertexArray对象的数据存储在顶点数组对象状态向量中。
如果顶点数组对象已被解除绑定并再次绑定,则GL_ELEMENT_ARRAY_BUFFER也已知并再次绑定。

注意,GL_ELEMENT_ARRAY_BUFFER为缓冲区对象创建新的数据存储。 glBufferData删除任何现有数据存储,并设置缓冲区对象的状态变量的值。这意味着,在关联新数据之前,数据将与缓冲区对象关联。 - 请参阅Khronos reference page glBufferDataOpenGL 4.6 API Compatibility Profile Specification; 6.1 Creating and Binding Buffer Objects

答案 1 :(得分:2)

如果你设置正确,在抽奖时你应该只绑定VAO。这就是重点,避免为每个几何体重复调用GL驱动程序的CPU开销。

在初始设置期间,您应该创建并绑定VAO,然后绑定所有属性缓冲区并使用glVertexAttribPointer描述它们,使用glEnableVertexAttribArray启用它们,最后绑定GL_ELEMENT_ARRAY_BUFFER。之后,我会将VAO绑定为null,这样您就不会意外地绑定以下行中的其他内容。

(注意,属性缓冲区本身的glBindBuffer不是直接记录到VAO中,而是在glVertexAttribPointer的调用站点处推断。也就是说,当你调用glVertexAttribPointer时当前绑定到GL_ARRAY_BUFFER的任何内容都将是VAO源代码用于顶点拉动。)

在渲染循环期间,您应该绑定先前创建的不同VAO。

它有点混乱,因为在实践中有时绑定VAO意味着&#34;我想开始录制一个小宏&#34; (在初始设置时)并且有时绑定VAO意味着&#34;我希望你回放我之前记录的那个宏中的所有绑定&#34; (在渲染时)。它在原始RFC中描述为:

   The currently bound vertex array object is used for all commands
which modify vertex array state, such as VertexAttribPointer and
EnableVertexAttribArray; all commands which draw from vertex arrays,
such as DrawArrays and DrawElements; and all queries of vertex
array state.

https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_vertex_array_object.txt

另请参阅GL标准中的表6.4和6.5,以确切了解VAO结构中存储的字段:

https://www.khronos.org/registry/OpenGL/specs/gl/glspec32.core.pdf