10

我正在渲染到 OpenGL 屏幕外帧缓冲区对象,并希望将其保存为图像。请注意,FBO大于显示尺寸。我可以渲染到屏幕外缓冲区并将其用作纹理,这很有效。我可以使用偏移量在显示器上“滚动”这个更大的纹理,这让我确信我渲染到比窗口更大的上下文中。

如果我将屏幕外缓冲区保存到图像文件中,它总是会被裁剪。保存的代码片段是:

void ofFBOTexture::saveImage(string fileName) { 
    glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); 
    // get the raw buffer from ofImage
    unsigned char* pixels = imageSaver.getPixels();
    glReadPixels(0, 0, 1024, 1024, GL_RGB, GL_UNSIGNED_BYTE, pixels); 

    imageSaver.saveImage(fileName); 
} 

请注意,图像内容被裁剪,可见部分被正确保存(这意味着像素格式没有错误,GL_RGB 问题等),但剩余空间被一种颜色填充。

所以,我的问题是——我做错了什么?

4

4 回答 4

11

最后我解决了这个问题。

我必须激活 fbo 才能保存其内容:

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
// save code
...
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

而只选择通过的glReadPixelsfbo

glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);

还不够。

(所有其他正确和测试的东西,例如视口大小、缓冲区的宽度和高度、图像纹理等)

于 2009-03-26T09:31:39.397 回答
0

有两个问题要开始:你是如何创建 imageSaver 的,你确定你的宽度和高度是正确的(例如你想保存一个 1024 x 1024 的图像吗?你得到什么尺寸)?

于 2009-03-25T17:16:35.217 回答
0

您没有做错任何事情,长期以来,这在 OpenGL 图形驱动程序中一直很常见-我记得至少十年前在 nVidia Geforce 3 卡上遇到了完全相同的问题,我采用了类似的解决方案-渲染到离屏纹理。

于 2009-03-25T17:40:57.530 回答
0

这听起来像你有错误的视口大小或类似的东西。

于 2009-03-26T09:12:53.483 回答