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

Ash*_*pta 3 c++ opengl vertex-buffer vertex-attributes vertex-array-object

所以我正在寻找关于命令glVertexAttribPointer的另一个SO问题,我遇到了一些轻微的混乱.这个问题的接受答案解释了,

但是当你进行调用时,还会有一个额外的隐含状态,它也会被存储为属性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);
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*las 5

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

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

OpenGL对象目标就像全局变量.将全局整数设置为3时会发生什么?它的旧价值已经消失.

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

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

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