19

マルチサンプルレンダリングバッファを使用してFBOに描画し、サンプルを解決するためにテクスチャを使用して別のFBOにブリットし、テクスチャを読み取ってバックバッファに描画しながら後処理シェーディングを実行するレンダリングシステムがあります( FBOインデックス0)。

ここで、正しいsRGB出力を取得したいと思います...問題は、OS XとWindowsで実行したときのプログラムの動作がかなり一貫していないことです。これは、マシンによっても異なります。IntelHDを搭載したWindowsの場合3000は、sRGB非線形性を適用しませんが、NvidiaGTX670を搭載した他のマシンでは適用します。OSXのIntelHD3000でも、それが適用されます。

したがって、これはおそらくGL_FRAMEBUFFER_SRGB、プログラムの適切なポイントで有効化状態を設定していないことを意味します。ただし、いつ有効にする必要があるかを実際に教えてくれるチュートリアルは見つからないようです。彼らは、それが非常に簡単で、パフォーマンスコストがかからないと言っているだけです。

現在、テクスチャをロードしていないので、まだ色の線形化を処理する必要はありません。

プログラムに線形カラー値を単純に吐き出さないようにするには、行をコメントアウトするだけですglDisable(GL_FRAMEBUFFER_SRGB)。これは、この設定がパイプライン全体で有効になっていることを意味し、実際にはすべてのフレームで冗長に強制的に戻します。

これが正しいかどうかはわかりません。それは確かに色に非線形化を適用しますが、これが2回適用されているかどうかはわかりません(これは悪いことです)。最初のFBOにレンダリングするときにガンマを適用できます。私が最初のFBOを2番目のFBOにブリットしたときにそれを行うことができました。なぜだめですか?

これまで、最終フレームのスクリーンショットを撮り、生のピクセルカラー値をプログラムで設定したカラーと比較しました。

入力色をRGB(1,2,3)に設定すると、出力はRGB(13,22,28)になります。

これは、ローエンドでの色の圧縮が非常に多いように思われ、ガンマが複数回適用されているかどうかを疑問視するようになります。

sRGBの式を調べたところ、線形1 / 255、2 / 255、および3/255が実際にsRGB 13 / 255、22 / 255にマップされるため、変換が1回だけ適用されるように見えることを確認できます。方程式を使用して28/255 1.055*C^(1/2.4)+0.055。これらの低いカラー値の展開が非常に大きいことを考えると、sRGBカラー変換が複数回適用されているかどうかは明らかです。

ですから、私はまだ正しいことを決めていません。最終的glEnable(GL_FRAMEBUFFER_SRGB)なフレームバッファ値にのみ適用されます。この場合、GL initルーチン中にこれを設定するだけで、今後は忘れることができますか?

4

1 に答える 1

26

が有効になっている場合、sRGB画像形式GL_FRAMEBUFFER_SRGBでの画像へのすべての書き込みは、入力色(書き込まれる色)が線形色空間にあると想定します。したがって、それらをsRGB色空間に変換します。

sRGB形式ではない画像への書き込みは影響を受けません。したがって、浮動小数点イメージに書き込んでいる場合は、何も起こらないはずです。したがって、オンにしてそのままにしておくことができるはずです。OpenGLは、sRGBフレームバッファにレンダリングしていることを認識します。

一般に、線形色空間でできるだけ長く作業する必要があります。後処理後の最終レンダリングのみがsRGB色空間を含む必要があります。したがって、マルチサンプリングされたフレームバッファはおそらく線形のままである必要があります(ただし、精度を維持するために、色の解像度を高くする必要があります。、、、または最後の手段として使用してGL_RGB10_A2くださいGL_R11F_G11F_B10FGL_RGBA16F

これに関して:

Intel HD 3000を搭載したWindowsでは、sRGBの非直線性は適用されません。

これはほぼ間違いなく、IntelがOpenGLドライバーの作成に夢中になっているためです。有効にしたときに正しく機能しない場合GL_FRAMEBUFFER_SRGBは、コードではなくIntelが原因です。

もちろん、Intelのドライバーが最初からsRGB画像を提供しなかった可能性もあります(デフォルトのフレームバッファーにレンダリングしている場合)。

于 2012-07-08T21:21:49.303 に答える