glClear因GL_FRAMEBUFFER_UNDEFINED而失败

时间:2012-04-03 03:47:49

标签: macos opengl osx-lion

我正在将OpenGL / Qt升级到OSX Lion并出现一些我需要帮助解决的新错误。我莫名其妙地在GLClear上得到了GL_FRAMEBUFFER_UNDEFINED。

我已经阅读了所有可能的原因,似乎没有任何匹配。为了帮助跟踪问题,我将以下两行添加到我们使用的一些常用检查代码中:

glCheckFramebufferStatus(GL_FRAMEBUFFER);
glCheckFramebufferStatusEXT(GL_FRAMEBUFFER);

这是OpenGL Trace,首先是应用程序的开头:

1: 0x01021b06 glGenBuffers(1, 0x11c461c0); 
2: 0x01021b06 glGenBuffers(1, 0x11c4616c);  
3: 0x01021b06 glGenBuffers(1, 0x11c46118); 
4: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
5: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
6: 0x01021b06 glGetError(); returns: GL_NO_ERROR  
7: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
8: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
9: 0x01021b06 glGetError(); returns: GL_NO_ERROR  
10: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
11: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED

正如您所看到的,BOTH调用最终成为glCheckFramebufferStatusEXT,我认为这是OSX正在做的事情。我不确定为什么没有帧缓冲,但是。

现在,这是错误时的跟踪:

29842: 0x01021b06 glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_ONE); 
29843: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
29844: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
29845: 0x01021b06 glGetError(); returns: GL_NO_ERROR  
29846: 0x01021b06 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 32, 32, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, 0x11c3d010); 
29847: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
29848: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
29849: 0x01021b06 glGetError(); returns: GL_NO_ERROR  
29850: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
29851: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
29852: 0x01021b06 glGetError(); returns: GL_NO_ERROR  
29853: 0x01021b06 glGetError(); returns: GL_NO_ERROR  
29854: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
29855: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
29856: 0x01021b06 glGetError(); returns: GL_NO_ERROR  
29857: 0x01021b06 glClearColor(0, 0, 0, 1); 
29858: 0x01021b06 glGetError(); returns: GL_NO_ERROR  
29859: 0x01021b06 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); returns: GL_FRAMEBUFFER_UNDEFINED  
29860: 0x01021b06 glClear(GL_COLOR_BUFFER_BIT); 
29861: 0x01021b06 glGetError(); returns: GL_INVALID_FRAMEBUFFER_OPERATION

如您所见,我们得到GL_NO_ERROR,直到GlClear,它失败了。

我不知道如何解决这个问题 - 我应该收集哪些信息来解决它?

4 个答案:

答案 0 :(得分:3)

我在OS X 10.8中使用NSOpenGLView时也看到了这个错误,但我找到了一个解决方法。如果glCheckFrameBufferStatus返回GL_FRAMEBUFFER_UNDEFINED,则表示未实例化帧缓冲区。请确保顺便调用[[self openGLContext] setView:self],以确保上下文具有与之关联的可绘制区域。

我的发现是,如果任何NSOpenGLView祖先(1)有层(即通过setWantsLayer进行层支持或层托管)或(2)使用Interface Builder初始化,那么NSOpenGLView帧缓冲区将不会被初始化!我不得不修改我的OpenGLView及其祖先不使用图层而不是由界面构建器分配,以便我以编程方式实例化NSOpenGLView。 (通过编程实例化,我的意思是openGLView是使用[[NSOpenGLVIew alloc] init ..]创建的。)

答案 1 :(得分:2)

你是对的。 Apple glFullScreenglGetError之后立即获得glClear。在开始时发生一次,再次从窗口翻到全屏。

答案 2 :(得分:1)

这似乎是由Mac OS X附带的GL实现问题引起的。显然,在glClear调用时帧缓冲还没有准备好使用。

http://lists.apple.com/archives/mac-opengl/2012/Jul/msg00038.html

它已被提交为苹果虫追踪器上的一个错误,雷达#11974524。

如果你在glClear之后调用glGetError()一次,我发现一切正常,这会重置OpenGL错误标志。

答案 3 :(得分:0)

我遇到了同样的问题。在使用Apples自己的GLFullscreen示例应用程序后,我注意到该错误仅在使用Mac OSX SDK 10.7时表现出来,如果我切换到10.6它会神奇地消失。

您可以找到GLFullscreen here

可能你需要在10.7中以另一种方式设置帧缓冲区。如果我发现使用10.6以某种方式限制我,我可能会对此进行调查。在那之前,我很高兴忽略这个问题。