我正在做2遍渲染,第一遍渲染到紋理,第二遍渲染到屏幕。OpenGL ES 2.x:重新使用深度緩衝區進行離屏和屏幕渲染的任何方式?
我在兩次渲染中渲染相同的多邊形,但我使用了不同的着色器。特別是,第二遍使用着色器,將第一遍生成的紋理作爲參數。
目前我的第一遍有一個帶有用於顏色附件的紋理的framebuffer和用於深度附件的渲染緩衝器(禁用了stenciling),而第二遍渲染爲默認幀緩衝區(0)。
我想到,由於我在pass-2中渲染了完全相同的多邊形,所以深度緩衝區最終看起來與我的pass-1深度緩衝區相同。如果我能以某種方式將pass-2深度緩衝區初始化爲pass-1的深度緩衝區,那麼我可以將我的深度測試函數更改爲GL_LEQUAL,並避免爲pass-2的片段着色器做大量不必要的工作。深度寫入也可以禁用此傳遞。
所以......有沒有辦法做到以下一種?
- 創建自己的幀緩存,它使用屏幕的深度緩衝(但仍寫的顏色紋理)
- 附上我自己的渲染到默認的幀緩衝的深度附着
我能想到的唯一解決方法(並且我還沒有嘗試過這個,所以我不知道這會對性能產生什麼樣的影響)是讓第二遍渲染紋理,然後進行第三遍,只是「點擊」紋理到屏幕。
它可能不在規範中,但我重新使用了帶有屏幕外渲染的FBO的深度緩衝區,並在iOS上爲屏幕繪製了一些內容。蘋果公司的實施支持這一點,但他們有一個輕微的小故障,Y軸在他們的屏幕外深度緩衝區和屏幕之間翻轉。他們正在解決這個問題,但我還沒有在更新的iOS版本上再次嘗試過。 – 2012-04-05 17:58:09
@BradLarson互動。你如何告訴屏幕外FBO使用屏幕上的深度緩衝區?將0綁定到深度附件? – 2012-04-05 20:27:32
至少在iOS上,您仍然需要手動爲屏幕上的內容創建深度緩衝區,然後將其附加到與承載OpenGL ES內容的CAEAGLLayer關聯的幀緩衝區。除了創建新的深度緩衝區並將其附加到顯示幀緩衝區之外,您可以將之前使用的緩衝區重新附加到顯示幀緩衝區。再次,這在iOS上可行,但其他平臺可能不一樣。 – 2012-04-05 21:16:21