我正在将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,它失败了。
我不知道如何解决这个问题 - 我应该收集哪些信息来解决它?
答案 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 glFullScreen
在glGetError
之后立即获得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以某种方式限制我,我可能会对此进行调查。在那之前,我很高兴忽略这个问题。