2017-02-21 179 views
1

OpenGL ES 3.0規範的一部分對我來說並不完全清楚。OpenGL ES 3.0:寫入多個緩衝區

https://www.khronos.org/registry/Ope...s_spec_3.0.pdf,第185頁:

如果一個OpenGL ES着色語言1.00片段着色器寫入 gl_FragColor或gl_FragData,DrawBuffers指定繪製緩衝區,如果 任何,到其中的單個片段的顏色由gl_FragColor定義或者 寫入gl_FragData [0]。如果一個OpenGL ES着色語言3.00 片段着色器寫入用戶定義的變化出變量, DrawBuffers指定一組繪製緩衝區成各由這些變量所限定的 多輸出顏色可單獨 寫入。

我此瞭解以下方式:

1)如果我使用OpenGL ES 3.0和寫入使用GLSL 1.0着色器,那麼唯一的辦法可以寫至2個緩衝器一次(COLOR0和COLOR1)是手動指定在片段着色器中寫入gl_FragData [0]和gl_FragData [1]的內容。如果我然後想回到僅寫入COLOR0,我必須將glPrograms切換爲只寫入gl_FragData [0](或gl_FragColor)的glPrograms。 2)如果另一方面我使用OpenGL ES 3.0並使用GLSL 3.0編寫我的着色器,那麼我可以編寫一個片段着色器,其輸出被定義爲單個變量,變量爲變量,並且動態地開啓並且關閉通過調用DrawBuffers()寫入COLOR1,而不需要交換glPrograms。

以上是否正確?

回答

1

以上是否正確?

號在ESSL 1.0着色器,你只能寫一個單一的顏色緩衝gl_FragData,或者它的別名gl_FragData[0]。 ESSL 1.0中沒有gl_FragData[1]這樣的東西。

,並動態地打開和關閉與調用DrawBuffers()並且不需要換glProgramsCOLOR1

是的,這是它在ESSL 3.x中的工作原理。

但是,在大多數情況下,交換程序的效率會更高。你執行着色器程序數百萬次(每個片段一次),因此有一個程序包含所有顏色目標的所有代碼,並且只是掩蓋輸出寫入,這是非常低效的。不要這樣做。你希望你的着色器程序儘可能地接近最優 - 這就是你的GPU運行時間去的地方...

+0

謝謝。還有一個問題(我想我應該試着做而不是問你):規範似乎是說即使使用GLSL 1.0,我仍然可以動態地將gl_FragColor的輸出重定向到任何COLOR_ATTACHMENTi,對於任何有附件的我,都通過簡單的調用DrawBuffers()? – Leszek

+0

從未嘗試過說實話;我曾經使用過MRT支持的唯一原因是我實際上有多個渲染目標;從來沒有試圖重新映射它們。 – solidpixel