我想将图像处理OpenGL着色器程序的输出保存到图像文件中,并在屏幕上显示结果。我知道如何使用glReadPixels()
保存窗口帧缓冲区。但是,屏幕的分辨率小于图像的尺寸。
如果我渲染到FBO,在保存和取消绑定FBO以在屏幕上查看结果后,是否需要再次呼叫glDrawArrays()
?或者是否可以告诉窗口帧缓冲区从FBO渲染而不必再次运行着色器程序?
答案 0 :(得分:1)
要将渲染图像保存在RBO中,您可以通过设置哪个缓冲区OpenGL将通过调用glReadBuffer
来读取像素来直接读取像素。在您的特定情况下,将读缓冲区设置为GL_COLOR_ATTACHMENT<i>
应该可以解决问题。有关详细信息,请参阅glDrawBuffer man page。
为了在FBO中显示图像:是的,您需要制作一个额外的渲染过程,将FBO的图像复制到默认的帧缓冲区中。您可以将FBO绑定为纹理,并按照建议渲染几何体,以在屏幕上显示图像,或者,您可以使用glBlitFramebuffer
来简化复制和图像过滤。
答案 1 :(得分:1)
如果我渲染到FBO,在保存和取消绑定FBO以在屏幕上查看结果后,是否需要再次调用glDrawArrays()?
您应该使用glBlitFramebuffer (...)
,此功能的目的是将一个帧缓冲区( 读取缓冲区 )复制到另一个( 绘制)缓冲 强>)。如果您没有做一些不寻常的事情,比如绘制整数纹理附件,那么您的FBO的绘图缓冲区应该与您的默认帧缓冲区(窗口)兼容。
还有一些与滤镜方法有关的警告和你要复制的图像类型(例如深度缓冲区不能使用线性插值),但由于你在这里讨论“全尺寸”,我想你对{{{ 1}}无论如何。