HDRとは?シェーダにおける考え方とトーンマッピング

UnityのCameraの設定項目にもあるHDRについて調べてみました。

LDRとは?

まずは、シェーダでRGB値を0〜1の値で表すことから考えます。

RGB値が全て0であれば黒が表示され、RGB値が1であれば、そのディスプレイで表示できるもっとも明るい色が表示されます。

このような、ディスプレイが表示できる色の範囲をLDR(Low Dynamic Range)といいます。

HDRとは?

次に、現実の世界の色について考えます。
現実の世界では、太陽のように目がくらむほど明るい色が存在します。

しかし、いくらディスプレイを明るくしても太陽のように目がくらむことはないことからわかるように、
このような色はLDRで表現することができません。

シェーダで実際の太陽を表現したとしても、「白飛び」してしまうだけです。
しかしこれでは表現力が弱くなってしまうため、より現実に近い色の範囲まで扱おうといというのが HDR(High Dynamic Range)です。
シェーダでいうと、単純に1以上の値まで取り扱うということになります。

トーンマッピング

しかし当然ながら、計算結果として1以上の値を返したからといって、ディスプレイがLDR以上の範囲の色を出せるようになるわけではありません。 結局1以上の値は白飛びしてしまいます。

そこで、トーンマッピングを使います。 トーンマッピングとは、HDRで表現されたRGB値をLDRの範囲に落とし込む手法です。

この変換は非線形ですが、結果は全体としては暗くなり、HDRの範囲も白飛びせずに出力できるようになります。