色空間。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.