【发布时间】:2021-01-04 03:36:48
【问题描述】:
我在我的应用程序中使用了两个 OpenGL 上下文。
第一个用于渲染数据,第二个用于后台加载和生成 VBO 和纹理。
当我的加载上下文生成一个 VBO 并将其发送到我的渲染线程时,我在 VBO 中得到无效数据(全为零),除非我在加载上下文上创建 VBO 后调用 glFlush 或 glFinish。
我认为这是由于我的加载上下文没有任何缓冲区交换或任何告诉 GPU 开始处理其命令队列并且什么都不做(这导致渲染上下文侧的 VBO 为空)。
据我所知,这种刷新在 Windows 上不是必需的(使用 Nvidia GPU 测试,即使没有刷新也可以工作),但在 linux/macOS 上是必需的。
Apple 文档上的这个页面说调用 glFlush 是必要的 (https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/OpenGLESApplicationDesign/OpenGLESApplicationDesign.html)
如果您的应用在多个上下文之间共享 OpenGL ES 对象(例如顶点缓冲区或纹理),您应该调用 glFlush 函数来同步对这些资源的访问。例如,您应该在一个上下文中加载顶点数据后调用 glFlush 函数,以确保其内容已准备好被另一个上下文检索。
但是调用glFinish 或glFlush 是必要的,还是有更简单/更轻松的命令可以实现相同的结果? (哪个是必要的,glFlush 或 glFinish?)
另外,是否有文档或参考资料在某处谈论这个?我找不到任何提及,而且它似乎在实现之间的工作方式不同。
【问题讨论】:
标签: opengl vbo openglcontext