2013-11-26 109 views
3

我想將我的圖像處理OpenGL着色器程序的輸出保存到圖像文件中,並將結果顯示在屏幕上。我知道如何使用glReadPixels()保存窗口幀緩衝區。但是,屏幕的分辨率小於圖像的尺寸。渲染窗口framebuffer和FBO以保存全尺寸紋理圖像

如果我渲染一個FBO,在保存和解除綁定FBO後,是否需要再次調用glDrawArrays()以在屏幕上查看結果?或者是否可以告訴窗口幀緩衝區從FBO渲染而不必再次運行着色器程序?

回答

1

要將渲染圖像保存在RBO中,可以通過調用glReadBuffer來設置哪個緩衝區將OpenGL讀取像素,從而直接讀取像素。在你的具體情況下,將讀取緩衝區設置爲應該有效。詳情請參閱glDrawBuffer man page

爲了在FBO中顯示圖像:是的,您需要進行額外的渲染過程才能將FBO的圖像複製到默認幀緩衝區。您可以將FBO作爲紋理進行綁定,並根據您的建議渲染幾何圖形,以便在屏幕上顯示圖像,或者,您可以使用glBlitFramebuffer來簡化複製和圖像過濾。

+0

我假設您的「否」回覆是我的問題的第二部分。因此,我需要在渲染到附加到FBO的紋理後再次調用'glDrawArrays()',以便在屏幕上顯示結果。所以,我應該呈現給FBO,用渲染的顏色附件調用'glReadBuffer()',然後調用'glReadPixels()'來保存結果。之後,我將不得不再次調用'glDrawArrays()'(在更改視口尺寸之後)將紋理渲染到屏幕上。 – informer2000

+0

對不起;編輯來解決您的其他問題。有很多不同的方法可以完成你所要求的內容,但實際上,你需要(不知何故)複製 - 通過渲染紋理和着色器,或者使幀緩衝區傳輸 - 從FBO到默認的幀緩衝區。 – radical7

+0

感謝您的澄清。我已經用第二個渲染通道實現了它,並且它工作正常。我全尺寸保存了圖像,屏幕輸出縮放到窗口尺寸。 – informer2000

1

如果我渲染到FBO,我需要保存和解除綁定FBO看到屏幕上的結果後再次調用(4,8)?

你應該使用glBlitFramebuffer (...),該功能的目的是爲一個幀緩衝(讀緩衝區)複製到另一個(繪圖緩衝器)。假如你沒有像繪製成一個整數紋理附件那樣做一些不尋常的事情,那麼你的FBO的繪製緩衝區應該與你的默認幀緩衝區(窗口)兼容。

有和與過濾方法的一些額外的警告圖像的要複製的類型(例如深度緩衝區不能用線性插值法),但因爲你在這裏討論「全尺寸」,我想你有興趣GL_NEAREST無論如何。

+0

+1解釋如何執行blitting和可能出現的問題。學到了新東西。謝謝。 – informer2000