14

色空間。RGB については誰もが知っています。[0.0,1.0] の範囲で正規化された 3 つの値は、赤、緑、青の色成分の強度を意味します。この強度は線形を意味していますね。

ガンマ。私が理解できる限り、ガンマは RGB カラー コンポーネントを別の値にマップする関数です。これをグーグルで調べてみると、線形関数と非線形関数を見てきました...線形関数はRGBコンポーネントをスケーリングするように見えるため、画像の明るさを調整しているようです。非線形関数は、暗い/明るいコンポーネントを「解凍」しているようです。

現在、さまざまな画像形式をテクスチャとして表示する画像ビューアの実装を開始しています。これらの画像のガンマを変更したいので、フラグメント シェーダーを構築し、テクスチャ化されたクワッドを実行する必要があります。わかりましたが、正しいガンマ補正を決定するにはどうすればよいですか?

OpenGL は、浮動小数点コンポーネントを使用して、線形 RGB 色空間を使用して動作します。実際、これらの値から (特別な浮動小数点精度で) ガンマ補正された値を計算できたので、ガンマ補正された値をクランプした後に表示されます。

まず、ガンマ ランプを決定します。どうすればそれを判断できますか?(分析的に、またはルックアップ テーブルを使用して)

次に、OpenGL 拡張 EXT_framebuffer_sRGB について調査することになりました。これは、拡張EXT_texture_sRGBと非常に関連しているようです。

EXT_texture_sRGB は、textel 値を RGB 線形空間に線形化するために使用される新しいテクスチャ形式を導入します。(脚注1) このようにsRGB色空間を意識してリニアRGB色空間として使っています。

代わりに、EXT_framebuffer_sRGB 拡張を使用すると、心配することなく、線形 RGB 値を sRGB フレームバッファーにエンコードできます。

...

待って、この情報は何のために?sRGB フレームバッファを使用して sRGB テクスチャをロードできる場合は、sRGB 変換なしでそのテクスチャを処理します...なぜガンマを補正する必要があるのですか?

sRGB バッファでも、ガンマをすべて同じように修正できますか? それともしない方がいいですか?明るさとコントラスト: ガンマ補正の前または後に適用する必要がありますか?

情報量が多くて、今迷っています。あなたの誰かがこれらすべての概念を私にもっと説明してくれることを願っています! ありがとうございました。

...

別の質問があります。デバイスのガンマが「標準」の 2.2 と異なる場合、異なるガンマ補正を「累積」するにはどうすればよいですか? 明確かどうかわかりません: モニターのガンマ値が 2.2 の画像の RGB 値が既に補正されているが、モニターのガンマ値が 2.8 の場合、ガンマを補正するにはどうすればよいですか?


(1) 以下は、私が言いたいことを強調するための抜粋です。

sRGB カラー スペースは、薄暗いオフィスで想定される一般的な (非線形の) モニター特性に基づいています。これは、国際電気標準会議 (IEC) によって IEC 61966-2-1 として標準化されています。sRGB 色空間は、おおよそ 2.2 ガンマ補正に相当します。


この拡張機能は、何らかの種類の sRGB フレームバッファ形式を提供したり、sRGB テクスチャでレンダリングされた画像が sRGB 色空間をサポートするデバイスに出力したときに「見栄えが良い」ことを保証したりしますか?

   RESOLVED:  No.

  Whether the displayed framebuffer is displayed to a monitor that
    faithfully reproduces the sRGB color space is beyond the scope
    of this extension.  This involves the gamma correction and color
    calibration of the physical display device.

    With this extension, artists can author content in an sRGB color
    space and provide that sRGB content for use as texture imagery
    that can be properly converted to linear RGB and filtered as part
    of texturing in a way that preserves the sRGB distribution of
    precision, but that does NOT mean sRGB pixels are output
    to the framebuffer.  Indeed, this extension provides texture
    formats that convert sRGB to linear RGB as part of filtering.

    With programmable shading, an application could perform a
    linear RGB to sRGB conversion just prior to emitting color
    values from the shader.  Even so, OpenGL blending (other than
    simple modulation) will perform linear math operations on values
    stored in a non-linear space which is technically incorrect for
    sRGB-encoded colors.

    One way to think about these sRGB texture formats is that they
    simply provide color components with a distribution of values
    distributed to favor precision towards 0 rather than evenly
    distributing the precision with conventional non-sRGB formats
    such as GL_RGB8.
4

3 に答える 3

8

残念ながら、OpenGL 自体は色空間を定義していません。OpenGL に渡された RGB 値が線形ベクトル空間を形成することが定義されています。レンダリングされたフレームバッファの値は、そのまま表示デバイスに送信されます。OpenGL は値を渡すだけです。

ガンマ サービス 2 つの目的:

  • 感覚的知覚は非線形です
  • 昔の表示装置は非線形応答でした

ガンマ補正は、両方を補正するために使用されます。

変換は、「線形値 V からガンマ乗」、つまり y(v) = v^gamma です。

色空間の変換には、入力値からディスプレイに送信されるものまでの完全なチェーンが含まれるため、これにはガンマ補正が含まれます。これは、ガンマ ランプを自分で操作してはならないことも意味します。

長い間、典型的なガンマ値は 2.2 でした。ただし、これにより低い値の望ましくない量子化が発生したため、Adobe は sRGB と呼ばれる新しい色空間を導入しました。これは、低い値の線形部分と、高い値の指数 ~2.3 を持つべき乗関数を持ちます。最近のほとんどのディスプレイ デバイスは sRGB を使用しています。また、最近のほとんどの画像ファイルは sRGB です。

したがって、sRGB 画像があり、デバイスで構成された線形ガンマ ランプ (つまり、ビデオ ドライバー ガンマ = 1) を使用して sRGB ディスプレイ デバイスにそのまま表示する場合は、sRGB テクスチャリングとフレーム バッファーを使用するだけで問題ありません。他に何か。

コメントによる編集

要約すると:

システムが sRGB フレームバッファをサポートしていない場合:

  • ディスプレイ デバイスにリニア カラー ランプを設定します。

  • (リニア) フレームバッファ オブジェクトを作成し、フレームバッファ オブジェクトでリニア レンダリングします。FBO の使用は、正確にはブレンディングであり、リニア カラー スペースでのみ機能します。

  • 必要な色 (ガンマなど) の補正を適用するフラグメント シェーダーを使用して、FBO からウィンドウに最終的なレンダリング結果を描画します。

于 2011-06-18T18:09:45.867 に答える
6

待って、この情報は何のために?sRGB フレームバッファを使用して sRGB テクスチャをロードできる場合は、sRGB 変換なしでそのテクスチャを処理します...なぜガンマを補正する必要があるのですか?

一般的に、あなたはしません。sRGB テクスチャリングとフレーム バッファの目的は、手動でガンマ補正を行う必要がないようにすることです。sRGB テクスチャからの読み取りは線形色空間に変換され、sRGB フレームバッファへの書き込みは線形 RGB 値を取得して sRGB 値に変換します。これはすべて自動であり、パフォーマンスに関しては無料です。

ガンマ補正を行う必要があるのは、モニターのガンマが 2.2 ガンマの sRGB ガンマ近似値と一致しない場合のみです。これを行うモニターはまれです。

テクスチャはsRGB 色空間である必要はありませんただし、ほとんどの画像作成アプリケーションは画像を sRGB で保存し、sRGB の色で動作するため、希望するかどうかに関係なく、ほとんどのテクスチャは既にsRGB になっている可能性があります。sRGB テクスチャ機能を使用すると、これまで取得してきたカラー値ではなく、実際に正しいカラー値を取得できます。

明るさとコントラスト: ガンマ補正の前または後に適用する必要がありますか?

明るさとコントラストの意味がわかりません。これは、アプリケーションではなく、モニターによって設定されるべきものです。しかし、画像データに対して実行するほぼすべての数学演算は、線形色空間で実行する必要があります。したがって、sRGB 色空間の画像が与えられた場合は、計算を行う前に画像を線形化する必要があります。sRGB テクスチャ機能により、複雑なシェーダー計算を行う必要がなくなり、これが無料になります。

于 2011-06-18T18:18:44.590 に答える