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