2012-04-01 60 views
3

我正在做2遍渲染,第一遍渲染到紋理,第二遍渲染到屏幕。OpenGL ES 2.x:重新使用深度緩衝區進行離屏和屏幕渲染的任何方式?

我在兩次渲染中渲染相同的多邊形,但我使用了不同的着色器。特別是,第二遍使用着色器,將第一遍生成的紋理作爲參數。

目前我的第一遍有一個帶有用於顏色附件的紋理的framebuffer和用於深度附件的渲染緩衝器(禁用了stenciling),而第二遍渲染爲默認幀緩衝區(0)。

我想到,由於我在pass-2中渲染了完全相同的多邊形,所以深度緩衝區最終看起來與我的pass-1深度緩衝區相同。如果我能以某種方式將pass-2深度緩衝區初始化爲pass-1的深度緩衝區,那麼我可以將我的深度測試函數更改爲GL_LEQUAL,並避免爲pass-2的片段着色器做大量不必要的工作。深度寫入也可以禁用此傳遞。

所以......有沒有辦法做到以下一種?

  • 創建自己的幀緩存,它使用屏幕的深度緩衝(但仍寫的顏色紋理)
  • 附上我自己的渲染到默認的幀緩衝的深度附着

我能想到的唯一解決方法(並且我還沒有嘗試過這個,所以我不知道這會對性能產生什麼樣的影響)是讓第二遍渲染紋理,然後進行第三遍,只是「點擊」紋理到屏幕。

回答

0

從閱讀OpenGL® ES Common Profile Specification Version 2.0.25 看來,這些都是不可能的。

第4.4.2節說:

Framebuffer的可附着的圖像可以被附連到和從 應用創建的幀緩衝區的對象分離。相比之下,OpenGL ES可能不會更改窗口系統提供的幀緩衝區的圖像附件

(強調我的)所以問題中的第二個選項是不可能的。

第4.4.3節表明,第一個選項是不可能的要麼...

一個渲染對象不能與 名零創建。如果渲染緩衝區爲零,則以前與目標的任何綁定都會中斷 ,並且目標綁定會恢復到初始狀態。

在初始狀態下,保留名0被綁定到RENDERBUFFER。 沒有與名稱零對應的渲染緩衝區對象,因此客戶端嘗試修改 或查詢目標RENDERBUFFER的渲染緩衝區狀態,而零被綁定將會導致 生成錯誤。

...雖然這不太明確。目前尚不清楚是否有其他一些 名稱可用於引用默認幀緩衝區的 渲染緩衝區,儘管很難想象哪個名稱會使得更多 的傳感比0更有意義,因爲它被用於其他地方的默認設置。

+0

它可能不在規範中,但我重新使用了帶有屏幕外渲染的FBO的深度緩衝區,並在iOS上爲屏幕繪製了一些內容。蘋果公司的實施支持這一點,但他們有一個輕微的小故障,Y軸在他們的屏幕外深度緩衝區和屏幕之間翻轉。他們正在解決這個問題,但我還沒有在更新的iOS版本上再次嘗試過。 – 2012-04-05 17:58:09

+0

@BradLarson互動。你如何告訴屏幕外FBO使用屏幕上的深度緩衝區?將0綁定到深度附件? – 2012-04-05 20:27:32

+1

至少在iOS上,您仍然需要手動爲屏幕上的內容創建深度緩衝區,然後將其附加到與承載OpenGL ES內容的CAEAGLLayer關聯的幀緩衝區。除了創建新的深度緩衝區並將其附加到顯示幀緩衝區之外,您可以將之前使用的緩衝區重新附加到顯示幀緩衝區。再次,這在iOS上可行,但其他平臺可能不一樣。 – 2012-04-05 21:16:21

相關問題