GLKit Offscreen渲染到纹理不起作用

时间:2014-03-10 09:04:48

标签: ios objective-c opengl-es glkit

当我尝试在OpenGl ES 2.0中创建一个附加了纹理的FBO时,如下所示:

    glGenFramebuffers(1, &framebuffer);
    glGenTextures(1, &textureId);

    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);

    glBindTexture(GL_TEXTURE_2D, textureId);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, framebuffer, 0);

    GLenum status;
    status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
    switch(status) {
        case GL_FRAMEBUFFER_COMPLETE:
            NSLog(@"fbo complete");
            break;

        case GL_FRAMEBUFFER_UNSUPPORTED:
            NSLog(@"fbo unsupported");
            break;

        default:
            /* programming error; will fail on all hardware */
            NSLog(@"Framebuffer Error");
            break;
    }

    glBindTexture(GL_TEXTURE_2D, 0);
    glBindFramebuffer(GL_FRAMEBUFFER, 0);

然后像这样应用:

    glBindFramebuffer(GL_FRAMEBUFFER, renderTarget.framebufferId);
    glBindTexture(GL_TEXTURE_2D, renderTarget.textureId);

    glViewport(0, 0, renderTarget.width, renderTarget.height);

然后在其上渲染一些东西,最后将附加的纹理绘制到屏幕上。结果是一个空的黑屏(如果我直接将它渲染到屏幕上,一切正常)。我尝试了几个FBO教程(当前代码就是其中之一),但没有区别。

此外,当我使用xcode的OpenGl调试器时,我有一些警告:glDrawArrays上的“慢帧缓冲加载问题”但我也可以看到纹理不是空的(我可以看到具有正确尺寸和右glClearColor的纹理)

如果之前有人遇到过这个问题并且知道我在这里做错了什么,那将会很棒。)

提前致谢

1 个答案:

答案 0 :(得分:1)

确定解决了我的问题。有一些小问题但主要问题是我将帧缓冲和纹理绑定在一起(参见顶部相关问题)。另一个问题是$!&()#^(我的意思是精彩)opengl坐标系(左下角),但这是一个快速修复。现在一切都工作得很好,期望在绘制全屏四边形时性能非常差,但我会打开另一个问题。