我正在尝试在我的应用程序中开始使用帧缓冲区。我休学了 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 读取像素是正常的。我用我的代码现在的样子更新了有问题的代码