由于将缓冲区绑定到目标(例如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。
但是,根据glBindBuffer
的OpenGL API参考,绑定缓冲区的初始目标可以用作内部存储缓冲区的优化提示:
创建后,可以根据需要将命名缓冲区对象重新绑定到任何目标。但是,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;
}
有没有更好的方法来安全地创建和填充缓冲区(关于VAO)?这个过程应该:
答案 0 :(得分:0)
仅绑定到GL_ARRAY_BUFFER
不会影响绑定VAO
。只有在调用glVertexAttribPointer
时才会读取绑定状态并将其放入VAO
。重新绑定GL_ELEMENT_ARRAY_BUFFER
会影响绑定的VAO
州。
这意味着只要在调用GL_ARRAY_BUFFER
之前确保绑定正确的缓冲区,就可以自由更改glVertexAttribPointer
的绑定。