我想确认一下我的理解是否正确(我本来想在SO Chat上问的,但那里已经死了!):
我们有一个Vertex Array,通过绑定它使其“当前”
然后我们有一个Buffer,将其绑定到Target
然后我们通过glBufferData
填充该Target
这实际上是填充绑定到该Target的任何内容,即我们的Buffer
然后我们调用glVertexAttribPointer
描述数据的布局方式——数据是绑定到GL_ARRAY_BUFFER
的任何内容
并将此描述符保存到我们原始的Vertex Array中
(1) 我的理解正确吗?
文档对所有内容的相关性有些缺乏解释。
(2) 是否有某种默认的Vertex Array?因为我忘记/省略了glGenVertexArrays
和glBindVertexArray
,但我的程序没有问题。
编辑:我错过了一个步骤... glEnableVertexAttribArray
。
(3) Vertex Attrib是否在调用glVertexAttribPointer
时与Vertex Array绑定,然后我们可以随时通过glEnableVertexAttribArray
启用/禁用该属性,而不管当前绑定的是哪个Vertex Array?
或者 (3b) 在调用glEnableVertexAttribArray
时,Vertex Attrib是否与Vertex Array绑定,因此我们可以通过在不同的时间点调用glEnableVertexAttribArray
来将相同的Vertex Attrib添加到多个Vertex Array中?
glVertexAttribPointer
之前启用它吗?在我的测试中,顺序似乎并不重要。(2) 如果我理解正确,顶点属性是全局的,只有它们的启用/禁用状态保存到当前绑定的VAO中? - mpenglDrawArrays
或glDrawElements
之前启用它即可。我会更新帖子以反映这一点。(2) 是的,但存储的不仅是启用/禁用状态,还包括与这些调用相关的所有内容 - 在GL_ARRAY_BUFFER上绑定的内容、类型、步幅和偏移量。基本上,它存储了足够的信息,可以将所有顶点属性更改回使用VAO设置它们的方式。 - Robert Rouhanilayout(location = x)
还是在编译着色器时使用glBindAttributeLocation
。示例 - Robert Rouhani