2012-07-08 44 views
14

我有一個渲染系統,我用一個多重採樣的渲染緩衝區繪製到一個FBO,然後用一個紋理將其粘貼到另一個FBO上,以便解析樣本以讀取紋理,以便在繪製到圖像時執行後期處理着色backbuffer(FBO索引0)。何時調用glEnable(GL_FRAMEBUFFER_SRGB)?

現在我想要得到一些正確的sRGB輸出...問題是,當我在OS X和Windows上運行它時,程序的行爲並不一致,並且這也取決於計算機:Windows上使用英特爾HD 3000時,它不會應用sRGB非線性,但會在我的另一臺機器上安裝Nvidia GTX 670。在OS X中的Intel HD 3000上,它也將應用它。

所以這可能意味着我沒有設置我的GL_FRAMEBUFFER_SRGB啓用狀態在程序的正確點。然而,我似乎無法找到任何實際上告訴我什麼時候應該啓用它的教程,他們只是提到它很容易,並且沒有性能成本。

我目前沒有加載任何紋理,所以我還沒有需要處理線性化他們的顏色呢。

要強制程序不是簡單地吐回了線性顏色值,我曾嘗試是簡單地註釋掉我glDisable(GL_FRAMEBUFFER_SRGB)線,這實際上意味着該設置對整個管道被啓用,而我居然冗餘迫使其回在每一幀。

我不知道這是否正確。它肯定會對顏色應用非線性化,但我無法判斷這是否應用了兩次(這會很糟糕)。它可以將伽瑪應用到我的第一個FBO。它可以做到這一點,當我第一個FBO blit到第二個FBO。爲什麼不?

我竟然把我的最後一幀的屏幕截圖和原始像素的顏色值進行比較,以我將它們設置爲在程序中的顏色了:

我設置的輸入顏色爲RGB(1, 2,3),輸出是RGB(13,22,28)。

這似乎是相當多的低端顏色壓縮,並導致我懷疑伽瑪是否得到多次應用。

我剛剛通過sRGB公式,我可以驗證轉換似乎只應用一次,因爲線性1/255,2/255和3/255確實映射到sRGB 13/255,22/255和28/255使用等式1.055*C^(1/2.4)+0.055。鑑於這些低色彩值的擴展非常大,如果sRGB色彩轉換不止一次應用,它應該很明顯。

所以,我仍然沒有確定要做什麼是正確的。 glEnable(GL_FRAMEBUFFER_SRGB)僅適用於最終幀緩衝區值,在這種情況下,我可以在我的GL初始化例程中設置此值,並在以後忘記它?

回答

17

當啓用GL_FRAMEBUFFER_SRGB時,所有對具有an sRGB image format的圖像的寫入都將假定輸入顏色(正在寫入的顏色)在線性顏色空間中。因此,它會將它們轉換爲sRGB色彩空間。

不應該影響以sRGB格式寫入圖像而不是的任何寫入。所以如果你正在寫一個浮點圖像,什麼都不應該發生。因此,你應該能夠打開它並離開它; OpenGL將知道你何時渲染到sRGB幀緩衝區。

一般而言,您想盡可能長時間在線性色彩空間中工作。在後期處理之後,只有您的最終渲染應該包含sRGB色彩空間。因此,您的多重採樣幀緩衝區應該保持線性(儘管您應該爲其顏色提供更高的分辨率以保持準確性,但使用GL_RGB10_A2,GL_R11F_G11F_B10FGL_RGBA16F作爲最後的手段)。

至於這樣的:

在Windows與Intel HD 3000將不適用的sRGB非線性

這是幾乎可以肯定,由於英特爾吸吮在寫OpenGL驅動程序。如果啓用GL_FRAMEBUFFER_SRGB時沒有做正確的事,那是因爲英特爾,而不是你的代碼。

當然,也可能是因爲英特爾的驅動程序並沒有爲您提供sRGB映像(如果您正在渲染到默認幀緩衝區)。

+1

嗯,這是事情。當我在初始化時啓用'GL_FRAMEBUFFER_SRGB'並且不要在之後永遠觸摸它,即使是在Windows中的Intel HD 3000上,它也會執行正確的轉換。只是它似乎需要啓用更多的代碼路徑而不是Nvidia。 – 2012-07-08 21:44:12

+0

你說的話很有意義,緩衝區的sRGB格式應該決定是否寫入sRGB值。我會測試這個,看看它是否正確實現,並且它肯定會讓我在每個通道8位中獲得更多的里程。我希望多樣本解析步驟也能夠正確地做到這一點:我之前遇到了不正確的多重採樣解析結果,但當時我可能一直在錯誤的模式下工作。 (請參閱此主題http://www.opengl.org/discussion_boards/showthread.php/165081-Multisample-resolve-is-not- gamma-correct -with -FBOs) – 2012-07-08 21:45:54

+0

英特爾是否在Apple上爲其處理器維護OpenGL驅動程序機器嗎?我的印象是,蘋果公司自己編寫了一切(根據我的經驗,這將解釋爲什麼他們的AMD驅動程序是如此錯誤纏身)。 – Philip 2015-04-02 20:39:15

相關問題