OpenGL ES 2.0 FBO 创建出错并出现未知错误

Posted

技术标签:

【中文标题】OpenGL ES 2.0 FBO 创建出错并出现未知错误【英文标题】:OpenGL ES 2.0 FBO creation goes wrong with unknown error 【发布时间】:2010-04-03 00:51:38 【问题描述】:

我已经为此苦苦挣扎了一段时间,而对我来说,这段代码崩溃的原因不明。我正在创建一个 FBO,绑定一个纹理,然后第一个 glDrawArrays() 在我的 iPhone 模拟器上以“EXC_BAD_ACCESS”崩溃。

这是我用来创建 FBO(以及绑定纹理和...)的代码

glGenFramebuffers(1, &lastFrameBuffer);
glGenRenderbuffers(1, &lastFrameDepthBuffer);
glGenTextures(1, &lastFrameTexture);

glBindTexture(GL_TEXTURE1, lastFrameTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 768, 1029, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_6_5, NULL);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

//Bind/alloc depthbuf
glBindRenderbuffer(GL_RENDERBUFFER, lastFrameDepthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 768, 1029);

glBindFramebuffer(GL_FRAMEBUFFER, lastFrameBuffer);

//binding the texture to the FBO :D
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, lastFrameTexture, 0);

// attach the renderbuffer to depth attachment point
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, lastFrameDepthBuffer);

[self checkFramebufferStatus];

正如你所看到的,它参与了一个对象,checkFrameBufferStatus 看起来像这样:

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
switch(status)

  case GL_FRAMEBUFFER_COMPLETE:
    JNLogString(@"Framebuffer complete.");
    return TRUE;

  case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
    JNLogString(@"[ERROR] Framebuffer incomplete: Attachment is NOT complete.");
    return false;

  case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
    JNLogString(@"[ERROR] Framebuffer incomplete: No image is attached to FBO.");
    return false;

  case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
    JNLogString(@"[ERROR] Framebuffer incomplete: Attached images have different dimensions.");
    return false;

  case GL_FRAMEBUFFER_UNSUPPORTED:
    JNLogString(@"[ERROR] Unsupported by FBO implementation.");
    return false;

   default:
    JNLogString(@"[ERROR] Unknown error.");
    return false;

JNLogString 只是一个 NSLog,在这种情况下它给了我:

2010-04-03 02:46:54.854 Bubbleeh[6634:207] ES2Renderer.m:372 [ERROR] Unknown error.

当我在那里调用它时。

所以,它崩溃了,诊断告诉我有一个未知错误,我有点卡住了。我基本上是从 OpenGL ES 2.0 Programming Guide 中复制代码...

我做错了什么?

【问题讨论】:

genpfault:你似乎有点损坏了身体。请修复它。提前致谢。 【参考方案1】:
        glBindTexture(GL_TEXTURE1, lastFrameTexture);

这是不允许的,我试图将纹理绑定到单元一(GL_TEXTURE1),但这应该由 glActiveTexture() 完成,而不是由 glBindTexture() 完成,它想知道纹理的类型(GL_TEXTURE_2D,GL_TEXTURE_3D等)不是纹理单元。要将纹理放置在纹理单元 1 中,我现在有以下我认为正确的代码:

//Bind 2D Texture lastFrameTexture to texture unit 1
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, lastFrameTexture);

【讨论】:

【参考方案2】:

在每次 GL 调用后尝试使用glGetError。特别是glTexImage2D

【讨论】:

【参考方案3】:

如果您使用 XCode,请在“Breakpoint Navigator”中为 OpenGL 错误添加断点([+] -> [添加 OpenGL ES 错误断点])。然后所有的OpenGL问题都会在线显示,出现问题。

【讨论】:

以上是关于OpenGL ES 2.0 FBO 创建出错并出现未知错误的主要内容,如果未能解决你的问题,请参考以下文章

Framebuffer FBO渲染到纹理很慢,在Android上使用OpenGL ES 2.0,为啥?

Android Opengl ES 2.0 FrameBuffer 不工作

OpenGL ES FBO 缩放

绘制到纹理后的Opengl ES 2.0 glDeleteFramebuffers

OpenGL ES 学习教程(十四) 帧缓冲区对象(FBO) 实现渲染到纹理(Render To Texture/RTT)

在 Android 上使用 FBO 进行慢速 OpenGL ES 渲染到纹理乒乓球