如何在glTexImage2D上传完成后收到通知?

时间:2012-10-23 14:10:10

标签: ios multithreading opengl-es textures

我希望在将纹理上传到OpenGL后进行渲染,但我无法获得有关completition的通知。

我确实想避免使用动画或任何类型的重复渲染。

glTexImage2D是否异步?据我所知,几乎每个OpenGL调用都是异步的。


无论如何,如果我也能了解glDrawArrays completition,那将会很棒。

2 个答案:

答案 0 :(得分:6)

答案是,在致电glTexImage2D后返回。从您的角度来看,它是一个同步调用,因为一切都在返回后正确设置。您可以通过将PBO用作中间存储来使纹理上载异步,但即使这样,一切都由驱动程序为您管理,您需要知道的是,当glTexImage2D返回时,您可以假设纹理数据正确上载并且开始渲染。如果纹理数据尚未在内部上传,则无论如何都不会渲染,并等待纹理设置。

你是正确的,大多数OpenGL调用可以看作是异步的,因为它们只安排命令发送到显卡,驱动程序决定何时最终将它们发送到硬件,硬件可以自由决定何时处理它们,而不是说没有人知道它们何时实际完成。但你知道吗,你通常只是不在乎。如果有什么需要阻止以等待一些先前的操作完成(如异步纹理上传),那么它将自动为您管理,一旦OpenGL函数返回,您可以确定它已完成其工作从您的角度来看图。

免责声明:确实有些情况下您确实需要知道实际操作何时最终完成其在设备上的工作。虽然您的方案不是其中之一。当您为调试或分析原因计时时,您可能真正想要同步操作的少数几种情况之一。由于OpenGL ES可能缺少ARB_timer_query,因此在这种情况下发出glFinish(如 BlueVoodoo 的答案中建议的那样)可能是一个选项。

编辑以同样的方式,当您使用glDrawArrays绘制的内容最终呈现为屏幕时,您不会收到通知,但您只是不关心它。

答案 1 :(得分:0)

我猜你的意思是异步电话?否则,为什么需要通知?如果您需要它是同步的,请查看glFinish()。我不知道有关openGL方法的任何通知。