来自一个着色器中多个 VAO 的顶点属性绑定

Vertex attribute bindings from multiple VAOs in one shader

假设我有一个具有以下顶点属性的顶点着色器:

layout(location = 0) in vec4 foo1;
layout(location = 1) in vec4 bar1;
layout(location = 2) in vec4 foo2;
layout(location = 3) in vec4 bar2;

还有两个像这样初始化的 VAO:

glBindVertexArray(vao1);
...
glVertexAttribPointer(0, ...);
glVertexAttribPointer(1, ...);

glBindVertexArray(vao2);
...
glVertexAttribPointer(2, ...);
glVertexAttribPointer(3, ...);

那么,如果我依次绑定它们:

glBindVertexArray(vao1);
glBindVertexArray(vao2);
glDrawArrays(...);

我将从 foo1bar1 顶点属性中获得什么数据?我可以期望它们的值取自 vao1 指向的缓冲区,还是它们的状态未定义?

OpenGL 对象不像宏(显示列表除外,它实际上很像宏)。他们存储状态。当您将一个新对象绑定到与前一个对象相同的目标时,所有受控状态都会被新对象占用;旧的从那个绑定点解除绑定。

每个 VAO 包含 所有 个可用顶点属性的状态。这些属性默认为禁用。因此,如果您只在 VAO 中启用属性 2 和 3,那么当您绑定该 VAO 时,只会启用属性 2 和 3。