2017-11-03 1 views
2

OpenGLでsRGBの色空間と1チャ​​ンネルあたりの8ビット表示について明確にしたいと思います。被写体を掘り下げた後、sRGBに画像を保存することは、互換性の理由から古いCTRが自然に行ったことを「模倣する」モニターによって行われた反対のガンマ操作を補うためだけに行われることが分かりました。人間の目には同様の非線形応答があるという事実は、偶然の一致であり、出力はlinear again anywayとなるので、ガンマ補正とは何の関係もありません。8bit sRGBとOpenGLの混乱

この理解が正しいと仮定すると、OpenGLではテクスチャ用のGL_SRGB8_ALPHA8フォーマットがあり、これはチャネルごとに8ビットを持ちます。しかし、0〜255の範囲は線形RGBテクスチャと同じであるため、チャンネルごとの線形8ビットテクスチャをsRGBに変換するという意味で、色の値は変更されず、単純な "フラグ"はOpenGLに指示します。範囲は線形ではないので、曲線として解釈しますか? チャンネルイメージ(16ビットPNGなど)あたりのsRGB 16ビットはどうですか?

答えて

3

範囲は同じです。 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と一致しない場合と同じように、手動で変換する必要があります。