2012-03-27 34 views
9

從我在網上看到的幾個例子中,gl_FragData [0]被認爲是一個顏色緩衝區。我試圖找到每個索引gl_FragData的意義和OpenGL着色語言的書(黃皮書)gl_FragData [0]總是一個顏色緩衝區嗎?

gl_FragData是可分配已寫入 值到一個或多個離屏緩衝區數組跨越這道來。該數組的大小爲 ,與實現相關,可以用glGet和 符號常量GL_MAX_DRAW_BUFFERS查詢。由於將值寫入 片段着色器中的gl_FragData而導致修改的 的離線緩衝區由glDrawBuffers指定。寫入gl_FragData [0]中的值 將更新第 中指定的列表中的第一個緩衝區,glDrawBuffers的調用將寫入gl_FragData [1] 中的值更新列表中的第二個緩衝區,依此類推。

沒有指定gl_FragData的第0個值始終是顏色緩衝區。如果有這樣的規格,我可以在哪裏找到它?如果不是,寫入gl_FragData時通常的做法是什麼?

回答

9

它不一定是一個顏色緩衝區本身。但如果它不是一個顏色緩衝區,那麼它就是什麼也沒有

gl_FragData輸出數組是指由glDrawBuffers設置的值。而使用FBO時,傳遞給該函數的值只能是GL_COLOR_ATTACHMENTnGL_NONE。其中,作爲名稱狀態,是顏色緩衝區。

所以它是一個顏色緩衝區或它的GL_NONE

對於不提供glDrawBuffers(即,不執行NV_draw_buffers)的GL ES實現,它被定義爲儘管索引零設置爲GL_COLOR_ATTACHMENT0

這是愚蠢的ES 2.0,允許多個附件的可能性實際上不提供一種方式來呈現他們不止一臺...

+0

我想glDrawBuffers是不是在OpenGL ES可用。在那種情況下,FBO在某個時候隱含地稱它爲? – Jayesh 2012-03-27 08:51:40

+0

'glDrawBuffers'(不要與'glDrawBuffer'混淆,非常聰明的選擇名字......)是ARB_draw_buffers的一部分,它是OpenGL 2.0核心。由於OpenGL ES 2.0是相對於OpenGL 2.0定義的,因此它應包含該功能。 – Damon 2012-03-27 09:33:37

+0

@Damon:從技術上講,['glDrawBuffer'](http://www.opengl.org/wiki/GLAPI/glDrawBuffer)是根據'glDrawBuffers'定義的;它只是一個更具限制性的形式(將索引0設置爲給予緩衝區,將所有其他設置爲「GL_NONE」)。但是在GL ES 2.0中都沒有。 – 2012-03-27 09:45:25