glClear 失败并显示 GL_FRAMEBUFFER_UNDEFINED

Posted

技术标签:

【中文标题】glClear 失败并显示 GL_FRAMEBUFFER_UNDEFINED【英文标题】:glClear fails with GL_FRAMEBUFFER_UNDEFINED 【发布时间】:2012-04-03 03:47:48 【问题描述】:

我正在将 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

如您所见,两个调用最终都是 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 失败。

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

【问题讨论】:

您是否尝试在此处使用帧缓冲区? 您是否在某处绑定了帧缓冲区? glGenBuffers 为索引和顶点缓冲区生成名称,而不是为帧缓冲区生成名称 在 OSX Lion 之前,代码“刚刚工作”,所以我的假设是帧缓冲区是自动创建和绑定的。这可能是一个错误的假设。另一件可能很重要的事情是,我们已经从 Carbon 支持的 Qt 变为 Cocoa 支持的 Qt,因为不再支持 Carbon 支持的 Qt。因此,我们可能需要做一些额外的设置。 我已修改代码以在 aglCreateContext 之后包含以下内容: GLuint fb; glGenFramebuffers(1, &fb); glBindFramebuffer(GL_FRAMEBUFFER, fb);它仍然以完全相同的方式失败。 您知道如何完成这项工作吗?这里有同样的问题。 【参考方案1】:

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

我的发现是,如果任何 NSOpenGLView 祖先 (1) 具有层(即,层支持或通过 setWantsLayer 托管层)或 (2) 使用 Interface Builder 初始化,那么 NSOpenGLView 帧缓冲区将不会被初始化!为了让我以编程方式实例化的 NSOpenGLView 工作,我不得不修改我的 OpenGLView 及其祖先以不使用图层并且不被接口生成器分配。 (通过编程实例化,我的意思是 openGLView 是使用 [[NSOpenGLVIew alloc]init..] 创建的。)

【讨论】:

【参考方案2】:

你完全正确。苹果glFullScreenglClear 之后得到glGetError。开始时发生一次,然后再次从窗口翻转到全屏。

【讨论】:

【参考方案3】:

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

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

它已作为一个 bug 提交到苹果 bug 跟踪器,radar # 11974524。

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

【讨论】:

【参考方案4】:

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

你可以找到GLFullscreen here。

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

【讨论】:

以上是关于glClear 失败并显示 GL_FRAMEBUFFER_UNDEFINED的主要内容,如果未能解决你的问题,请参考以下文章

仿真器:glClear:466 GL错误0x502

glClear()不服从剪刀区域[关闭]

Android Studio 3.0.1模拟器启动报错Emulator: glClear:466 GL err 0x502

学习OpenGL时找不到glClear

来自 glClear() 的 OpenGL 帧缓冲区错误

glclear 和 GL_COLOR_BUFFER_BIT 有问题