1

我正在尝试在我的应用程序中开始使用帧缓冲区。我休学了 Apple 教程Using a Framebuffer Object as a Texture。我的代码如下所示:

头文件中的某处:

GLuint framebuffer, texture;
GLenum status;

和 .m 文件:

-(void)initFBO {
    glGenFramebuffersEXT(1, &framebuffer);
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer);
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0,
                 GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
                              GL_TEXTURE_2D, texture, 0);
    status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
    if (status != GL_FRAMEBUFFER_COMPLETE_EXT) {
        NSLog(@"failed");
    } else {
        NSLog(@"success");
    }
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}

-(void)someDrawingFunc {
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer);
glClearColor(0.0, 0.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE, GL_ZERO);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, someTexture);
    glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f);
    glVertex2f(0.0, height);
    glTexCoord2f(0.0f, 1.0f);;
    glVertex2f(0.0, 0.0);
    glTexCoord2f(1.0f, 1.0f);
    glVertex2f(width, 0.0);
    glTexCoord2f(1.0f, 0.0f);
    glVertex2f(width, height);
    glEnd();
glFlush();
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

    [self drawFBO];
}

-(void)drawFBO {
glClearColor(1.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glColor4f(1.0, 1.0, 1.0, 1.0);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex2f(1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex2f(1.0f, 0.0f);
glEnd();
glFlush();
glBindTexture(GL_TEXTURE_2D, 0);
}

在控制台中,我看到“成功”,但在我的应用程序窗口中,我看到:
在此处输入图像描述

当我这样做glReadPixels并将它们保存到图像时,我得到: 在此处输入图像描述

保存图像的大小应该是这样,一切都很好,但我只是得到了glClearColor带有神秘黑线的填充图像,而不是我绘制的framebuffer

虽然使用相同的代码根本不使用帧缓冲区,但在我的应用程序中我看到:
在此处输入图像描述

当我保存时,我看到: 在此处输入图像描述

我究竟做错了什么?


因此,出于某种原因,帧缓冲区拒绝了我试图绘制的纹理 GL_QUAD。所以我想问题必须在帧缓冲区使用的某个地方。


编辑

奇怪的事情。现在将 fbo 绘制到屏幕时,我只看到红色(glClearColor 将 FBO 绘制到屏幕),但是当我执行 glReadPixels 时,它读取的像素很好。它用我的纹理保存图像。

默认图像(纹理图像,绘制到 FBO): 在此处输入图像描述

我在应用程序窗口中看到的内容: 在此处输入图像描述

glReadPixels 结果图像(从 FBO 读取并保存到文件的纹理): 在此处输入图像描述

是的,它是颠倒的。从 OpenGL 读取像素是正常的。我用我的代码现在的样子更新了有问题的代码

4

1 回答 1

0

我已经解决了。问题出在我的 glTranslatef 上。我glPushMatrix()在渲染到 FBO 时完成并设置了所需的矩阵参数,现在一切正常。

于 2012-08-20T09:33:04.247 回答