在OpenGL中使用围栏同步对象

在OpenGL中使用围栏同步对象,opengl,synchronization,opengl-3,Opengl,Synchronization,Opengl 3,我试图寻找可以在OpenGL中使用同步对象的场景。我的理解是,一个同步对象一旦放入GL命令流(使用glFenceSync())中,就会在执行和实现所有GL命令后发出信号。 如果同步对象是同步原语,为什么我们不能手动向它们发送信号?这项功能在哪里可以帮助GL程序员 以下情况正确吗 Thread 1 : Load model Draw() glFenceSync() Thread 2 : glWaitSync(); ReadPixels Use data for subsequent oper

我试图寻找可以在OpenGL中使用同步对象的场景。我的理解是,一个同步对象一旦放入GL命令流(使用glFenceSync())中,就会在执行和实现所有GL命令后发出信号。 如果同步对象是同步原语,为什么我们不能手动向它们发送信号?这项功能在哪里可以帮助GL程序员

以下情况正确吗

Thread 1 :

Load model
Draw()
glFenceSync()

Thread 2 :

glWaitSync();
ReadPixels
Use data for subsequent operation.

这是否意味着除非在线程1中调用glFenceSync(),否则我无法启动线程2?

围栏并不是为了同步线程,而是为了知道异步操作何时完成。例如,如果在像素缓冲区对象(PBO)中执行
glReadPixels
,则在尝试从PBO读取或将PBO映射到客户端地址空间之前,您可能希望知道读取已完成


如果以PBO为目标执行
glReadPixels
,调用将立即返回,但数据传输可能确实需要一些时间。这就是fences派上用场的地方。

“这是否意味着除非在线程1中调用了glFenceSync(),否则我无法启动线程2?”嗯,在调用
glFenceSync
之前,同步对象还不存在。你不能等待不存在的东西。我有一种情况,我在一个线程中绘制FBO,然后在另一个线程中从颜色附着纹理渲染到屏幕(并创建一个围栏,以了解渲染何时完成)。当一个新的FBO可用时,我将旧的FBO和围栏交还给FBO经理,以便其可以查询围栏,并知道FBO可以再次写入。