顶点数组对象绑定顺序

时间:2015-11-11 13:05:04

标签: opengl

我知道VAO存储顶点属性设置和绑定缓冲区对象,但我不确定我应该做的正确的绑定解除顺序是什么。下一个订单是对的吗?

glBindVertexArray(vao); //bind vao

glBindBuffer(GL_ARRAY_BUFFER, vbo); //bind vbo
glBufferData(GL_ARRAY_BUFFER, sizeof(vec3) * vertices.size(), vertices.data(), GL_STATIC_DRAW);
glVertexAttribPointer(vertex_index, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(vertex_index);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo); //bind ebo
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * indices.size(), indices.data(), GL_STATIC_DRAW);

glBindVertexArray(0); //unbind vao
glBindBuffer(GL_ARRAY_BUFFER, 0); //unbind vbo
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); //unbind ebo

目前,这是我使用的代码并且它有效,但我经过多次尝试后才开始这样做,所以我想确保这是正确的方法。

1 个答案:

答案 0 :(得分:3)

z = 1'bx可以在GL_ARRAY_BUFFER之后立即解除绑定,因为绑定由这两个函数存储。之后不再将其解除绑定VAO不再注意。

由于始终只存在一个glEnableVertexAttribArray/glVertexAttribPointer,因此VAO存储此缓冲区类型的最后一个绑定状态。因此,索引缓冲区必须绑定到VAO未绑定的时刻。

您的代码示例完全有效。您可以移动GL_ARRAY_BUFFER取消绑定某些行,但这不是必需的。