创建VAOs时,VAOs是否只跟踪VBO索引(通过glBindVertexBuffer),还是还将哪些VBO名称绑定到这些索引?如果我在VAO创建期间指定了一个使用glVertexAttribBinding的绑定索引,那么我是否可以在抽签调用之前将不同的VBO绑定到索引0,并让它使用该VBO的内容,还是在创建VAO时总是使用绑定到索引0的任何VBO?
我之所以问这个问题,是因为我在调用glVertexAttribFormat和glVertexAttribBinding之前发现了许多调用glBindVertexBuffer
的例子,如果VAO只跟踪索引(因为绑定索引是在glVertexAttribBinding
中给出的),就不应该需要调用glBindVertexBuffer
。
发布于 2014-12-19 19:02:01
答案是,它们不存储顶点名称,只存储索引。如果将不同的VBO绑定到不同VAO中的相同索引,则必须在使用第一个VAO的任何glDraw调用之前重新绑定第一个VBO。
至少在我的Macbook Pro上有:
渲染器: NVidia GeForce GT 650 m OpenGL引擎
版本: 4.1 NVIDIA-10.0.43 310.41.05f01
发布于 2014-11-06 04:25:24
您可能知道,这是OpenGL 4.3中引入的相当新的功能。按照我阅读规范的方式,属性和缓冲区之间的映射现在有了一个间接的级别:
您可以将它看作两个表,一个定义从属性索引到绑定索引的映射,另一个定义绑定索引到缓冲区名称的映射。这两个表都是VAO状态的一部分。
我相信这些都可以完全独立地按任何顺序指定。glVertexAttribBinding()
在属性索引和绑定索引之间建立了第一个关联。glBindVertexBuffer()
建立绑定索引与缓冲区名称之间的关联。
这种理解被规范中的state表所证实。表23.4在GL4.4规范标题为“顶点阵列对象状态”的表23.4中列出:
VERTEX_ATTRIB_BINDING
可以用glGetVertexAttribiv()
查询,它是给定属性索引的绑定索引的值。VERTEX_BINDING_BUFFER
可以使用glGetIntegeri_v()
查询,它是给定绑定索引的缓冲区名称的值。在此基础上,回答你的具体问题:
创建VAOs时,VAOs是否只跟踪VBO索引(通过
glBindVertexBuffer
),还是还将哪些VBO名称绑定到这些索引?
他们都会追踪。
是否可以在抽签调用之前将不同的VBO绑定到索引0,并让它使用该VBO的内容?
是的,如果将不同的VBO绑定到绑定索引0,则绑定索引0的所有属性都将使用该VBO的内容。
在调用
glVertexAttribFormat
和glVertexAttribBinding
之前,我发现了许多调用glBindVertexBuffer
的例子,如果VAO只跟踪索引,就不需要调用glBindVertexBuffer
。
VAO跟踪所有这些调用设置的状态,因此使用它们作为设置VAO的一部分是有意义的。首先,跟踪VAO中的整个顶点设置状态是拥有VAOs的主要目的。它允许您在初始化期间设置一次状态,然后在抽签调用之前只需要对glBindVertexArray()
进行一次调用就可以再次设置整个状态。
https://stackoverflow.com/questions/26767939
复制相似问题