範囲は同じです。 The values are not。
保存前の線形値は浮動小数点です。したがって、これらは8ビット/チャネル形式よりも高い精度を備えています。
linearRGBイメージに格納する場合は、入力範囲[0、1]をとり[0、255]に均等にマッピングします。
しかし、sRGB変換を行うと、[0、1]の範囲をとり、約2.2の非線形ガンママッピングで[0、255]にマッピングしています。この非線形マッピングは、魔法のように値を増やすわけではありませんが、下の部分よりも範囲の高い部分で効果的に精度を高めることができます。
sRGB変換では、入力範囲[0.5,1]の値は[56,255]にマップされます。これは、入力範囲の50%がカバーする出力範囲の75%を超えています。これにより、入力値の大きな値をより適切に表現できます。
線形マッピングは精度を均等に失います。 sRGBマッピングは、より明るい領域よりも暗い領域で精度が低下します。別の言い方をすれば、は、線形マッピングよりも明るい領域で精度をより多く保持します。
メモリ対ビジュアル品質のトレードオフについて、sRGBは、チャネルあたり8ビットのlinearRGBより全体的に優れています。
0〜255の範囲は、リニアRGBテクスチャと同じであるので、これは値が変わらないと、単純な「フラグ」がOpenGLを伝えるカラーをsRGBのために、チャネルのテクスチャごとにリニア8ビットに変換することを意味しています:0〜255の範囲は線形ではないので、曲線として解釈しますか?
それはあなたが話している操作によって異なります。
sRGBテクスチャは、RGB情報をsRGBカラースペースに格納するテクスチャです。ただし、シェーダ操作では、sRGBではなく、linearRGBカラースペース内のデータが必要であると想定されています。だからusing an sRGB format means that texture fetches will convert the pixels they read from sRGB to linearRGB。
sRGBフォーマットを使用してフラグメントシェーダからFBO付きイメージに書き込むと、変換が実行される場合と実行されない場合があります。ここでは、変換は明示的にGL_FRAMEBUFFER_SRGB
で有効にする必要があります。いくつかの操作では、sRGBカラースペース(たとえばGUIなど)で値が生成され、他の操作ではlinearRGB(通常のレンダリング)で値が生成されます。したがって、コンバージョンをオンまたはオフにするオプションがあります。
この変換でも、read sRGB destination pixels, convert them to linear, blend with the incoming linearRGB values, and then convert them back to sRGB for writingにブレンドすることができます。
sRGBイメージにアップロードしてダウンロードすると、sRGB色空間のピクセル値が直接読み書きされます。
チャンネルイメージ(16ビットPNGなど)あたりのsRGB 16ビットはどうですか?
についてはどうなりますか? OpenGLには、16ビット/チャンネルのsRGBフォーマットはありません。
sRGB変換は、通常、256エントリテーブルルックアップを使用して行われます。すべてのsRGB値には、あらかじめ計算された線形値があります。
イメージフォーマットがOpenGLと一致しない場合と同じように、手動で変換する必要があります。