3

我想在纹理上传到 OpenGL 后进行渲染,但我无法收到有关完成的通知。

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

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


无论如何,如果我也能被告知 glDrawArrays 的完成情况,那就太好了。

4

2 回答 2

6

答案是,在调用glTexImage2D返回后继续。从您的角度来看,这是一个同步调用,因为它返回后一切都已正确设置。您可以通过使用 PBO 作为中间存储来异步上传纹理,但即便如此,一切都由驱动程序为您管理,您需要知道的是,当glTexImage2D返回时,您可以假设纹理数据已正确上传并开始渲染。如果纹理数据还没有在内部上传,你的东西无论如何都不会被渲染,而是等待纹理被设置。

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

免责声明:在某些情况下,您确实需要知道实际操作何时最终完成了设备上的工作。尽管您的情况不是其中之一。您可能真正想要同步操作的少数情况之一是,当您出于调试或分析原因而计时某些事情时。而且由于 OpenGL ES 可能缺少ARB_timer_query,因此在这种情况下,发出 a glFinish(如BlueVoodoo的回答中所建议的)可能是一种选择。

编辑:以同样的方式,当您绘制的东西最终呈现到屏幕上时,您不会收到通知glDrawArrays,但您只是不关心它。

于 2012-10-24T11:30:44.443 回答
0

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

于 2012-10-23T18:37:43.413 回答