创建后,VAO 是否仅跟踪 VBO 索引(通过glBindVertexBuffer),或者哪些 VBO 名称与这些索引绑定?如果我使用指定绑定索引,例如 0glVertexAttribBinding在 VAO 创建期间,我可以在绘制调用之前将不同的 VBO 绑定到索引 0 并让它使用该 VBO 的内容,还是始终使用创建 VAO 时绑定到索引 0 的任何 VBO?
我问这个问题是因为我发现很多例子都在调用之前glVertexAttribFormat and glVertexAttribBinding打电话给glBindVertexBuffer
,如果 VAO 仅跟踪索引,则不需要这样做(因为绑定索引在glVertexAttribBinding
).
您可能知道,这是 OpenGL 4.3 中引入的相当新的功能。按照我阅读规范的方式,属性和缓冲区之间的映射现在具有一定程度的间接性:
- 每个属性都有一个属性指定它使用哪个绑定索引。
- 缓冲区绑定到绑定索引。
您可以将其视为两个表,一个定义从属性索引到绑定索引的映射,另一个定义从绑定索引到缓冲区名称的映射。这两个表都是 VAO 状态的一部分。
我相信这些可以完全独立地以任何顺序指定。glVertexAttribBinding()
在属性索引和绑定索引之间建立第一个关联。glBindVertexBuffer()
建立绑定索引和缓冲区名称之间的关联。
规范中的状态表证实了这一理解。 GL 4.4 规范中的表 23.4 标题为“顶点数组对象状态”,列出了:
-
VERTEX_ATTRIB_BINDING
,可以通过以下方式查询glGetVertexAttribiv()
,是给定属性索引的绑定索引的值。
-
VERTEX_BINDING_BUFFER
,可以通过以下方式查询glGetIntegeri_v()
,是给定绑定索引的缓冲区名称的值。
在此基础上,解决您的具体问题:
创建后,VAO 是否仅跟踪 VBO 索引(通过glBindVertexBuffer
),或者哪些 VBO 名称与这些索引绑定?
他们追踪两者。
我可以在绘制调用之前将不同的 VBO 绑定到索引 0 并让它使用该 VBO 的内容吗
是的,如果将不同的 VBO 绑定到绑定索引 0,则绑定索引 0 的所有属性都将使用该 VBO 的内容。
我发现很多例子都在调用之前glVertexAttribFormat
and glVertexAttribBinding
打电话给glBindVertexBuffer
,如果 VAO 仅跟踪指数,则没有必要
VAO 跟踪所有这些调用设置的状态,因此使用所有这些调用作为设置 VAO 的一部分确实有意义。跟踪 VAO 中的整个顶点设置状态是使用 VAO 的主要目的。它允许您在初始化期间设置一次状态,然后您只需要一次调用glBindVertexArray()
在您的绘制调用再次设置整个状态之前。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)