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)
当我调用该命令时,在哪里指定要使用的缓冲区?
这对我来说很有意义,但如果我有多个绑定为GL_ARRAY_BUFFER的缓冲区怎么办?
那是不可能的.将缓冲区(或任何OpenGL对象)绑定到目标时,它会自动解除之前的任何内容.
OpenGL对象目标就像全局变量.将全局整数设置为3时会发生什么?它的旧价值已经消失.
glVertexAttribPointer将始终使用当前绑定的任何缓冲区GL_ARRAY_BUFFER.因此,在您的第一次通话中,它将使用buffer.在你的第二次通话中,它将使用colorBuffer.
这就是为什么重要的是要记住glVertexAttribPointer对目前的约束进行操作.因为即使在绑定colorBuffer并将其设置为由属性1使用之后,属性0 仍然从其接收其顶点数据buffer.
因此,虽然您不能绑定多个缓冲区GL_ARRAY_BUFFER,但可以使用多个缓冲区作为顶点数据的源.