我有一個渲染系統,我用一個多重採樣的渲染緩衝區繪製到一個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初始化例程中設置此值,並在以後忘記它?
嗯,這是事情。當我在初始化時啓用'GL_FRAMEBUFFER_SRGB'並且不要在之後永遠觸摸它,即使是在Windows中的Intel HD 3000上,它也會執行正確的轉換。只是它似乎需要啓用更多的代碼路徑而不是Nvidia。 – 2012-07-08 21:44:12
你說的話很有意義,緩衝區的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
英特爾是否在Apple上爲其處理器維護OpenGL驅動程序機器嗎?我的印象是,蘋果公司自己編寫了一切(根據我的經驗,這將解釋爲什麼他們的AMD驅動程序是如此錯誤纏身)。 – Philip 2015-04-02 20:39:15