渲染到窗口帧缓冲区和FBO以保存全尺寸纹理图像

时间:2013-11-26 20:20:00

标签: opengl fbo

我想将图像处理OpenGL着色器程序的输出保存到图像文件中,并在屏幕上显示结果。我知道如何使用glReadPixels()保存窗口帧缓冲区。但是,屏幕的分辨率小于图像的尺寸。

如果我渲染到FBO,在保存和取消绑定FBO以在屏幕上查看结果后,是否需要再次呼叫glDrawArrays()?或者是否可以告诉窗口帧缓冲区从FBO渲染而不必再次运行着色器程序?

2 个答案:

答案 0 :(得分:1)

要将渲染图像保存在RBO中,您可以通过设置哪个缓冲区OpenGL将通过调用glReadBuffer来读取像素来直接读取像素。在您的特定情况下,将读缓冲区设置为GL_COLOR_ATTACHMENT<i>应该可以解决问题。有关详细信息,请参阅glDrawBuffer man page

为了在FBO中显示图像:是的,您需要制作一个额外的渲染过程,将FBO的图像复制到默认的帧缓冲区中。您可以将FBO绑定为纹理,并按照建议渲染几何体,以在屏幕上显示图像,或者,您可以使用glBlitFramebuffer来简化复制和图像过滤。

答案 1 :(得分:1)

  

如果我渲染到FBO,在保存和取消绑定FBO以在屏幕上查看结果后,是否需要再次调用glDrawArrays()?

您应该使用glBlitFramebuffer (...),此功能的目的是将一个帧缓冲区( 读取缓冲区 )复制到另一个( 绘制)缓冲 )。如果您没有做一些不寻常的事情,比如绘制整数纹理附件,那么您的FBO的绘图缓冲区应该与您的默认帧缓冲区(窗口)兼容。

还有一些与滤镜方法有关的警告和你要复制的图像类型(例如深度缓冲区不能使用线性插值),但由于你在这里讨论“全尺寸”,我想你对{{{ 1}}无论如何。