2

私のレンダラーでは、マルチサンプリングされた FBO でアンチエイリアス処理されたシーンを生成します。このシーンは、カラー アタッチメントがテクスチャである FBO にブリットされます。テクスチャは、フレーム バッファへのレンダリング中に読み取られます。

ガンマ補正の結果が得られるように更新したいと思います。sRGB フレームバッファーを使用する利点は、非線形の sRGB 値をフレームバッファーに直接保存することで、色の精度をいくらか向上できることです。

私がよくわからないのは、これを取得するためにどのような変更を加える必要があるか、およびさまざまな設定によって何が変更されているかです。

拡張 ARB_framebuffer_sRGBは、sRGB フレームバッファーを使用した読み取りとブレンド操作を処理しているようです。私の状況では、sRGB 表現タイプを指定するテクスチャを使用する必要があります。つまり、拡張子EXT_texture_sRGBを使用することになります。線形テクスチャ フォーマットを使用すると、sRGB 変換が無効になります。

編集:しかし、私はこれを見ました:

3) sRGB フレームバッファの更新とブレンディングをサポートする機能は、フレームバッファの属性にする必要がありますか?

解決済み: はい。sRGB ブレンディングを有効にできるというのは、一部のピクセル形式 (ほとんどの場合、RGB8 と RGBA8 のみ) の機能である必要があります。

これにより、既存の RGB8 および RGBA8 ピクセル形式を sRGB ブレンディングをサポートするものとして簡単にマークし、そのような形式の sRGB 更新およびブレンディングの機能を提供する実装が可能になります。

テクスチャのピクセル形式に何を指定すればよいかわかりません。

さて、レンダバッファはどうですか? ARB_framebuffer_sRGB doc には、レンダーバッファーについては何も言及されていません。sRGB フォーマットで使用glRenderbufferStorageMultisampleできるので、sRGB ストレージ対応のブレンディングを取得できますか?

また、の内部フォーマットを指定する場合のGL_SRGB_ALPHAとの違いは何ですか?GL_SRGB8_ALPHA8glTexImage2D

4

1 に答える 1

7

よくわからないのは、これを取得するためにどのような変更を加える必要があるかです

それは、あなたの質問があなたがやろうとしていることについて確信が持てないように見えるからです.

これらすべての鍵は、入力データと出力データを常に把握しておくことです。

最初のステップは、各テクスチャに何が格納されているかを知ることです。特定のテクスチャは、線形データまたは sRGB 色空間のデータを保存しますか? 線形データを格納する場合は、線形イメージ形式のいずれかを使用します。sRGB 色空間データを格納する場合は、sRGB イメージ形式のいずれかを使用します。

これにより、シェーダーで必要なデータを確実に取得できます。それらをフレームバッファに書き込む/ブレンドするときが来たら、それを処理する方法を決定する必要があります。

画面は、ディスプレイ デバイスのガンマに事前にガンマ補正された値を想定しています。そのため、線形値を指定すると、正しくないカラー出力が得られます。

ただし、中間値に書き込みたい場合もあります。たとえば、フォワード レンダリングまたはディファード レンダリングを実行している場合、蓄積されたライティングを浮動小数点バッファーに書き込み、HDR トーン マッピングを使用して表示用の [0, 1] イメージに煮詰めます。後処理技術を再び使用することができます。[0, 1] への出力のみが sRGB 色空間の画像である必要があります。

sRGB に変換するリニア RGB 値を書き込む場合は、有効にする必要がありますGL_FRAMEBUFFER_SRGB。これは特別な有効化です (テクスチャには sRGB デコードをオフにする方法がないことに注意してください)。これは、既に sRGB にある値を書きたい場合があるためです。これは、既に sRGB 色空間にある色を使用して設計および構築された GUI インターフェイス ウィジェットの場合によくあります。

チュートリアル シリーズでは、ガンマ補正値の書き込みテクスチャからの読み取りに関連する問題について説明します。最初のものは、ガンマが重要である理由を説明し、シェーダーでガンマ補正を明示的に行います。2 番目のリンクでは、テクスチャとフレーム バッファの両方で sRGB 画像を使用する方法について説明しています。

さて、レンダバッファはどうですか? ARB_framebuffer_sRGB doc には、レンダーバッファーについては何も言及されていません。

そして、それはなぜですか?ARB_framebuffer_sRGB は、フレームバッファとその中の画像の性質にのみ関心があります。それらの画像がどこから来たのかを知りませんし、気にもしません。デフォルトのフレームバッファ、FBO にアタッチされたテクスチャ、FBO にアタッチされたレンダバッファ、または誰かが明日思いつくまったく新しいものについて話しているかどうかは気にしません。

拡張機能は、目的の画像が sRGB 色空間にあり、GL_FRAMEBUFFER_SRGB有効になっている場合に何が起こるかを示しています。そのイメージがどこから来るかはあなた次第です。

また、glTexImage2D の内部フォーマットを指定する場合、GL_SRGB_ALPHA と GL_SRGB8_ALPHA8 の違いは何ですか?

1つはサイズです。もう一つはそうではありません。理論的にGL_SRGB_ALPHAは、実装が必要とする任意のビット深度を提供できます。コンポーネントごとに2ビットを与えることができます。実装に必要なものを選択する自由を与えています。

実際には、違いが見つかるとは思えません。そうは言っても、可能な限り常にサイズの内部フォーマットを使用しました。あなたが望むものを具体的に示し、実装が愚かなことをしないようにすることは良いことです。OpenGL には、前述のように明示的にサポートする必要があるサイズのフォーマットもあります。

于 2012-02-26T22:46:45.207 に答える