2012-10-25 48 views
3

我有一個opengl上下文,其中我渲染了幾個線框圖元。我想對一些(不是全部)應用一些後期處理效果(例如模糊,開花)。爲了達到這個目的,我定義了一個帶有附加紋理(顏色緩衝區)和渲染緩衝區(深度緩衝區)的屏幕外幀緩衝區。然後,我做到以下幾點:如何將圖像後處理着色器的結果添加到場景中

  1. 綁定的脫屏緩衝區
  2. 設置透視圖
  3. 畫,我想模糊
  4. 取消綁定離屏幀緩衝,並結合「主」的framebuffer的線框圖元
  5. 繪製進一步元不應進行後處理

  6. 設置鄰視圖

  7. 設置的後處理的着色器,使所述離屏緩衝器的質地均勻的參數
  8. 繪製全屏四

  9. 顯示mainframebuffer

問題的內容,即通過將紋理渲染到屏幕外緩衝區,並將結果用作2D四邊形的紋理,我失去了深度信息,整個場景看起來並不現實。

所以我的問題是,我怎樣才能將我的深度緩衝區合併到幀緩衝區?或者將模糊或其他碎片影響效果應用於複雜的3D場景的常見方法是什麼?

回答

0

我會使用早期的深度測試來實現這一點。這個想法是,你首先只將整個場景渲染到深度緩衝區,即沒有顏色寫入。接下來,您將執行顏色過關,您可以禁用深度寫入,並使用相同的轉換對相等進行深度測試。這給你所需的隱藏表面去除。顏色是否像你已經概述的那樣通過。現在通過疊加模糊的圖片,它應該看起來很好(有些病例可能會破壞,但可能會使用一些模板緩衝區技巧來修復)。

順便說一句,你不需要設置全屏四點頂點着色器的投影。只需穿過頂點位置並使用座標(-1,-1)(1,-1)(1,1)(-1,1)作爲頂點。

2

爲了解決這個問題一個明確:

所以我的問題是,如何將我的的depthbuffers合併 幀緩存?

沒有什麼阻止你分享不同宗教組織之間附件,如果他們是紋理(通過glFramebufferTexture2D)。這甚至適用於深度/深度模板緩衝區。 afaik GL3甚至可以使用不同大小的附件。

如果您在後期需要主幀緩衝區(可見窗口)中的深度信息,則可以使用Framebuffer Blitting進行復制。 blit操作非常快。

有很多方法處理渲染順序。個人喜好/靈活性/表現。我個人在FBO中儘可能地做到了這一點,因爲它具有靈活性,並在需要時進行優化。最終的顏色結果也通過blit移動到幀緩衝區。

我在某些Linux驅動程序和某些情況下在OS X下共享深度附件(或一般的附件)時遇到了問題,並且最終使用blit代替深度附件並取得了巨大成功。

相關問題