我正在尝试在我的应用中开始使用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);
}
在控制台中我看到“成功”,但在我的应用程序窗口中,我看到:
当我glReadPixels
并将它们保存到图像中时,我得到:
保存图像的大小应该是这样,一切都还可以,但我只是得到了带有神秘黑线的glClearColor
填充图像,而不是我用framebuffer
虽然使用相同的代码而根本没有使用帧缓冲,但在我的应用中我看到:
当我保存时,我看到:
我做错了什么?
因此,由于某种原因,帧缓冲拒绝我正在尝试绘制的纹理GL_QUAD。所以我猜问题必须在帧缓冲使用的某个地方。
默认图像(纹理图像,绘制到FBO):
我在应用窗口中看到的内容:
glReadPixels结果图像(从FBO渲染并保存到文件的纹理):
是的,它颠倒了。从OpenGL读取像素是正常的。我更新了有问题的代码,我的代码现在看起来像
答案 0 :(得分:0)
我已经解决了。问题出在我的glTranslatef上。我完成glPushMatrix()
并在渲染到FBO时设置了所需的矩阵参数,现在一切正常。