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

时间:2017-07-13 03:34:58

标签: opengl glsl vertex-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指向的缓冲区,还是它们的状态是未定义的?

1 个答案:

答案 0 :(得分:2)

OpenGL对象与宏不同(显示列表除外,实际上就像宏一样)。他们储存州。将新对象绑定到与前一个对象相同的目标时,所有受管状态都将被新对象占用;旧的那个没有从那个绑定点开始。

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