ガンマ補正

前提:通常モニタのガンマ値は2.2でsRGB環境なので、その環境でテクスチャを作成してる場合、そのデータはガンマ値2.2用の環境向けに補正されたものと考える事が出来る。

http://doc.51windows.net/Directx9_SDK/?url=/Directx9_SDK/graphics/programmingguide/advancedtopics/gamma/gamma.htm

http://higeneko.com/diary.php?Date=2007-08-18#Date2007-08-18
http://higeneko.com/diary.php?Date=2007-08-19#Date2007-08-19
http://higeneko.com/diary.php?Date=2007-08-27#Date2007-08-27

1. 非線形、ガンマ2.2に近いが、低輝度部分では線形になる
5. 低輝度部分(0-64)でsRGBはRGBの5倍程の解像度を持つ

と書かれているけれどよくわからない。(まだ理解していない…)

http://www.geocities.jp/oredisc/memo/gamma/gamma.html

リニアなグラデーション
http://www.geocities.jp/beruponu/pictures/gradation1.png
Photoshop 色調補正 露光量 ガンマ0.45
http://www.geocities.jp/beruponu/pictures/gradation2.png
Photoshop 色調補正 露光量 ガンマ2.2
http://www.geocities.jp/beruponu/pictures/gradation3.png

gradation3がリニアなデータの値が通常のモニタで見た時の明るさに相当するように変換したものとなる感じだろうか。gradation1と見比べて逆算すると確かに暗い諧調用のパレットは比較的広い。でも暗いところの殆どは大体が潰れてるというか目立たない気がする。

リニアでデータを持つと逆に暗部の諧調表現力が失われる事になるんだろうか…。

      • -

http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=242491

計算はリニア空間で行われるのでうんぬん

      • -

http://forum.quest3d.com/index.php?topic=64434.0

理解しやすい説明があったので引用。

0.0のピクセルと1.0のピクセルを混ぜた時に、期待値は
(0.0+1.0)/2 = 0.5
でガンマ補正をすると、
pow(0.5, (1.0/2.2)) = 0.72974005284072309792068324784925
になる。

ガンマ補正がテクスチャには適用されていて、既にガンマ補正済みの絵を利用するので
絵を最終出力する際にはガンマ補正しない場合、計算結果は、
(0.0+1.0)/2 = 0.5
になるけどこれは間違っていて、実際に表示するべき値は 0.72974005284072309792068324784925 の筈。
実際の絵は白黒だけじゃないので、最終の段階でガンマ補正をしても間違いは解決出来ない。

      • -

これを見て思ったんだけど、2D画像のフェードインフェードアウトでさえ、既にガンマ補正済みの絵の値をリニアに戻さないでそのまま処理をするとおかしい事になる。(背景が真っ黒で絵を1枚だけ合成する場合は、最終段階のガンマ補正すれば違いは出ないけどそんなケースは稀だろうなぁ…)

ただ、8bitのガンマ補正済みの絵をリニア変換する場合に8bitの画像に格納するのでは数値の変換誤差が発生してしまうので、好ましくないだろう。なのでその場合はリニアへの変換先をHDRにして精度を保った方が良い。でも精度が高い分負荷が高くなる。

素材自体をリニアで用意しておけば、sRGB->Linearの変換を省けるので計算負荷も減るしブレンド処理をする際に使う作業用テクスチャの精度もそのままに出来るのでメモリ節約になって好ましいかもしれない。まぁどちらにしろ合成先バッファの色深度がHDRじゃないと変換誤差が出てしまうか。