我正在开发一款在OpenGL ES中使用大纹理的iPad应用。当场景第一次加载时,我会在天花板上得到一个大的黑色神器几帧,如下图所示。就好像还没有填写更高级别的mipmap。在后续帧中,天花板显示正确。
当我开始使用mipmapping时,这个问题才开始显现。一种可能的解释是glGenerateMipmap()调用异步工作,产生一些mipmap创建工作者(在一个单独的进程中,或者可能在GPU中)并返回。
这是可能的,还是我在错误的树上吠叫?
答案 0 :(得分:3)
在单个上下文中,所有操作都将严格按顺序执行。但是,在您最近的回复中,您提到使用第二个线程。为此,您必须创建第二个共享上下文:重新输入OpenGL上下文始终是非法的。如果已经使用了共享上下文,则必须遵循一些同步规则,记录在http://developer.apple.com/library/ios/ipad/#DOCUMENTATION/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithOpenGLESContexts/WorkingwithOpenGLESContexts.html
答案 1 :(得分:2)
它应该是同步的; OpenGL本身并没有任何真正的线程概念(除了CPU和GPU之间的隐式异步对话)。
诊断的好方法是切换到GL_LINEAR_MIPMAP_LINEAR
。如果真正的问题是较低分辨率的mip贴图直到晚些时候才会到达,那么你会看到天花板上的麻烦区域相互融合而不是当前的黑色或正确效果。
基于输出的第二个猜测是某种深度缓冲清除问题。
答案 2 :(得分:1)
我按照@ Tommy的建议,切换到GL_LINEAR_MIPMAP_LINEAR
。现在黑色或正确的效果变为正确和黑色之间的淡入淡出。
我想尽管我们都知道OpenGL是一个管道(因此除非你正在检索状态或明确的同步,否则它是异步的),我们倾向于忘记它。在这种情况下,我确实做过,我没有绘图,而是加载和设置纹理。
一旦我确认问题的性质,我在加载所有纹理后添加了glFinish(),问题就消失了。 (顺便说一句,我的绘制循环在前景中,我的纹理加载循环 - 因为它非常耗时并且会损害交互性 - 在后台。此外,由于这可能因平台而异,我在iPad 2上使用iOS5 )