2

所以我在看another SO question regarding the command glVertexAttribPointer,我遇到了一些困惑。在接受这个问题的答案解释,我可以有多个GL_ARRAY_BUFFER缓冲区吗?

但有状态的附加隐含一块也存储离开属性0,当你拨打电话:将数据从当前绑定到GL_ARRAY_BUFFER

缓冲区中读取

这对我有意义,但是如果我有多个缓冲区绑定为GL_ARRAY_BUFFERglVertexAttribPointer()方法如何知道哪个设置属性?

例如,在我的代码中,我绘制了一个渐变三角形。为此,我创建了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); 

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

回答

4

这对我有意义,但如果我有多个缓冲区绑定为GL_ARRAY_BUFFER会怎样?

这是不可能的。当你将一个缓冲区(或任何OpenGL对象)绑定到一个目标时,它会自动解除之前所有的绑定。

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

glVertexAttribPointer总是使用任何缓冲区目前势必GL_ARRAY_BUFFER。所以在你的第一个电话中,它将使用buffer。在你的第二个电话中,它将使用colorBuffer

这就是为什么重要的是要记住glVertexAttribPointer目前的有什么作用。因为即使绑定了colorBuffer并将其设置为属性1使用,属性0 仍然buffer接收其顶点数据。

所以,虽然你不能有多个缓冲区绑定到GL_ARRAY_BUFFER,你可以可以使用多个缓冲区作为你的顶点数据的来源。

相关问题