【发布时间】:2015-06-05 07:41:01
【问题描述】:
由于将缓冲区绑定到 GL_ARRAY_BUFFER 等目标会修改任何绑定顶点数组对象的状态,因此安全地写入缓冲区可能会很棘手。最简单的解决方案似乎是使用不影响 VAO 状态的缓冲区目标,例如 GL_COPY_WRITE_BUFFER。
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)?该过程应该:
- 保留第一个绑定目标的优化提示
- 不干扰任何绑定 VAO 的状态
- 不像我上面那样读取状态、更改状态和恢复状态
【问题讨论】:
标签: opengl