我在理解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回答。
答案 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 glBufferData
和OpenGL 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