osx中的framebuffers

时间:2012-08-10 07:09:18

标签: objective-c macos opengl framebuffer

我正在尝试在我的应用中开始使用framebuffers。我厌倦了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);
}

在控制台中我看到“成功”,但在我的应用程序窗口中,我看到:
enter image description here

当我glReadPixels并将它们保存到图像中时,我得到: enter image description here

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

虽然使用相同的代码而根本没有使用帧缓冲,但在我的应用中我看到:
enter image description here

当我保存时,我看到: enter image description here

我做错了什么?


因此,由于某种原因,帧缓冲拒绝我正在尝试绘制的纹理GL_QUAD。所以我猜问题必须在帧缓冲使用的某个地方。


修改

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

默认图像(纹理图像,绘制到FBO): enter image description here

我在应用窗口中看到的内容: enter image description here

glReadPixels结果图像(从FBO渲染并保存到文件的纹理): enter image description here

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

1 个答案:

答案 0 :(得分:0)

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