我可以有多个GL_ARRAY_BUFFER缓冲区吗?

时间:2016-06-21 18:11:25

标签: c++ opengl vertex-buffer vertex-attributes vertex-array-object

所以我看着another SO question regarding the command glVertexAttribPointer,我遇到了轻微的困惑。这个问题的接受答案解释了,

  

但是当你进行调用时,还有另外一个暗示的状态,也存储了属性0:从当前绑定到GL_ARRAY_BUFFER的缓冲区中读取数据

这对我来说很有意义,但如果我有多个绑定为GL_ARRAY_BUFFER的缓冲区怎么办? glVertexAttribPointer()方法如何知道设置属性的哪一个?

例如,在我的代码中,我绘制了一个渐变三角形。为此,我创建了2个VBO,一个是数组中的颜色数据,另一个是顶点位置。

glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
    static const GLfloat points[] = {
    //data here
    };
    static const GLfloat colors[] = {
      //data here
    };
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
    vs = glCreateShader(GL_VERTEX_SHADER);
    fs = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(vs, 1, &vertexShaderData, NULL);
    glShaderSource(fs, 1, &fragShaderData, NULL);
    glCompileShader(vs);
    glCompileShader(fs);
    sp=glCreateProgram();
    glBindFragDataLocation(sp, 0, "outColor");
    glAttachShader(sp, vs);
    glAttachShader(sp, fs);
    glLinkProgram(sp);
    glUseProgram(sp);
    glGenBuffers(1, &colorBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(1);
    glDrawArrays(GL_TRIANGLES, 0, 9);

当我调用命令时,在哪里指定要使用的缓冲区?

1 个答案:

答案 0 :(得分:5)

  

这对我来说很有意义,但如果我有多个绑定为GL_ARRAY_BUFFER的缓冲区怎么办?

那是不可能的。将缓冲区(或任何OpenGL对象)绑定到目标时,它会自动取消绑定之前的任何内容。

OpenGL object targets就像全局变量。将全局整数设置为3时会发生什么?它的旧价值已经消失。

glVertexAttribPointer始终使用当前绑定到GL_ARRAY_BUFFER的任何缓冲区。因此,在您的第一次通话中,它将使用buffer。在第二次通话中,它将使用colorBuffer

这就是为什么重要的是要记住glVertexAttribPointer当前绑定的内容进行操作。因为即使在绑定colorBuffer并将其设置为由属性1使用之后,属性0 仍然buffer接收其顶点数据。

因此,虽然您不能将多个缓冲区绑定到GL_ARRAY_BUFFER,但可以使用多个缓冲区作为顶点数据的源。