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】:你完全正确。苹果glFullScreen
在glClear
之后得到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的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio 3.0.1模拟器启动报错Emulator: glClear:466 GL err 0x502