iOS的glGenerateMipmap是同步的,还是可能是asynchronous的?

我正在开发一个在OpenGL ES中使用大纹理的iPad应用程序。 当场景第一次加载的时候,我会在天花板上看到一个很大的黑色神器,如下图所示。 就好像更高级别的mipmap尚未填充。在随后的帧中,天花板正确显示。

这个问题才开始显示,当我开始使用mipmapping。 一个可能的解释是,glGenerateMipmap()调用asynchronous执行其工作,产生一些mipmap创build工作(在一个单独的进程,或在GPU中)并返回。

这是可能的,还是我吠叫错了树?

更高的mipmap级别不存在

在一个上下文中,所有的操作都将严格按照顺序执行。 但是,在最近的回复中,您提到了使用第二个线程。 为此,您必须创build第二个共享上下文:重新inputOpenGL上下文总是非法的。 如果已经使用共享上下文,则仍然需要遵循一些同步规则,请参阅http://developer.apple.com/library/ios/ipad/#DOCUMENTATION/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithOpenGLESContexts/WorkingwithOpenGLESContexts.html。

它应该是同步的; OpenGL本身没有任何真正的线程概念(除了CPU和GPU之间的隐式asynchronous对话)。

诊断的一个好方法是切换到GL_LINEAR_MIPMAP_LINEAR 。 如果真的是低分辨率的mip地图还没有到达,那么你会看到天花板上的麻烦区域相互融合,而不是现在的黑色或正确的效果。

基于输出的第二个猜测是某种深度缓冲区清除问题。

我遵循@ Tommy的build议,并切换到GL_LINEAR_MIPMAP_LINEAR 。 现在,黑色或者正确的效果在正确和黑色之间变成淡入淡出。

我猜,尽pipe我们都知道OpenGL是一个pipe道(因此,除非你正在检索状态或显式同步),我们往往会忘记它。 在这种情况下,我当然做了,我没有绘制,但加载和设置纹理。

一旦我确认了问题的本质,我加载了所有纹理后添加了一个glFinish(),问题就消失了。 (顺便说一下,我的绘制循环是在前台和我的纹理加载循环 – 因为它是如此费时,会损害交互性 – 在后台。此外,因为这可能会有所不同平台之间,我使用iOS5的iPad 2 )