我知道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
目前,这是我使用的代码并且它有效,但我经过多次尝试后才开始这样做,所以我想确保这是正确的方法。
答案 0 :(得分:3)
z = 1'bx
可以在GL_ARRAY_BUFFER
之后立即解除绑定,因为绑定由这两个函数存储。之后不再将其解除绑定VAO不再注意。
由于始终只存在一个glEnableVertexAttribArray/glVertexAttribPointer
,因此VAO存储此缓冲区类型的最后一个绑定状态。因此,索引缓冲区必须绑定到VAO未绑定的时刻。
您的代码示例完全有效。您可以移动GL_ARRAY_BUFFER取消绑定某些行,但这不是必需的。