由于将缓冲区绑定到目标(如GL_ARRAY_BUFFER )将修改任何绑定的顶点数组对象的状态,因此安全地编写缓冲区可能很棘手。最简单的解决方案似乎是使用缓冲区目标(如GL_COPY_WRITE_BUFFER ),它不影响VAO状态。
void write_buffer(GLint name, int size, const void* data)
{
// error handling omitted for clarity...
glBindBuffer(GL_COPY_WRITE_BUFFER, name);
glBufferData(GL_COPY_WRITE_BUFFER, size, data, GL_STATIC_DRAW);
}这具有安全调用的优点,而不考虑当前的OpenGL上下文(假设您正在共享状态)和当前绑定的VAO。
但是,根据OpenGL API对glBindBuffer的引用,缓冲区绑定的初始目标可以用作缓冲区内部存储方式的优化提示:
一旦创建,命名缓冲区对象就可以根据需要重新绑定到任何目标。但是,GL实现可以选择如何根据初始绑定目标优化缓冲区对象的存储。
这意味着,如果缓冲区name以前没有绑定到适当的最终目标,上述函数可能会阻碍优化。
避免这种损失的唯一方法是在创建之后立即手动将缓冲区绑定到所需的目标,然后恢复原始绑定:
GLint create_array_buffer()
{
GLint original, name;
glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &original);
glGenBuffers(1, &name);
glBindBuffer(GL_ARRAY_BUFFER, name);
glBindBuffer(GL_ARRAY_BUFFER, original);
return name;
}是否有更好的方法来安全地创建和填充缓冲区(关于VAOs)?这一进程应:
发布于 2015-06-05 09:41:39
仅绑定到GL_ARRAY_BUFFER并不会影响绑定的VAO。只有在调用glVertexAttribPointer时,绑定状态才会读取并放入到VAO中。重新绑定GL_ELEMENT_ARRAY_BUFFER确实会影响绑定的VAO状态。
这意味着您可以自由地更改GL_ARRAY_BUFFER的绑定,只要您在调用glVertexAttribPointer之前确保绑定正确的缓冲区。
https://stackoverflow.com/questions/30661022
复制相似问题