繁体   English   中英

osx中的帧缓冲区

[英]framebuffers in osx

我试图在我的应用程序中开始使用帧缓冲区。 我不喜欢使用帧缓冲对象作为纹理的 Apple教程。 我的代码如下所示:

头文件中的某处:

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并将其保存到图像时,我得到: 在此处输入图片说明

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

虽然完全没有使用帧缓冲区,但使用相同的代码,在我的应用程序中,我看到了:
在此处输入图片说明

然后保存时,我看到: 在此处输入图片说明

我究竟做错了什么?


因此,出于某些原因,framebuffer拒绝了我尝试绘制的纹理化GL_QUAD。 所以我想问题一定是在帧缓冲区的使用上。


编辑

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

默认图像(纹理图像,绘制到FBO): 在此处输入图片说明

我在应用程序窗口中看到的内容: 在此处输入图片说明

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM