色を使って色々したいなぁと思った際、HDRのintensityの制御が分からなかったので調べてみました。
割と資料に落ちてなかったのでここに書き残しておきます。
そもそもHDRとは?
この辺りはHDR
で検索かければ結構出てきます。
High Dynamic Rangeの略称で、明るさの表現範囲を広げれるものです。
画像補正などでよく使用されるそうですね。
Unityではカラーピッカーなどで使用されます。
ポストエフェクトを有効にしておくと表示されるようになります。
ここの強さ(intensity)
の処理についてが今回の議題です。
intensity
さて、このintensity、果たして何者なのでしょうか。
先ほど「明るさの表現範囲を広げれるもの」と言いましたが、具体的にどのように調整しているのでしょう。
その答えはタブのRGB 0-255
をRGB 0-1
にすることで確認できます。
RGB 0-255のままだと、intensityをいじってもシーン表示が変わるだけで何が起こってるのかさっぱりですが、
RBG 0-1にすることで、なんと値の変化を見れるようになります。
なるほど。元は1だったのが2倍、4倍、8倍...つまり各色を2n倍に補正しているようですね。
ちなみに負の値を設定すると1/2倍、1/4倍、1/8倍...となるので、やはり2n倍に補正してそうです。
ここまで分かれば処理が作れそうです。
private float _level = 0f; private float Intensity => (float)Math.Pow(2, _level); private Material _material; private Color _color; public void SetIntensity(float level) { _level = level; SetColor(_color); } public void SetColor(Color color) { _color = color; _material.SetColor("_Color", _color * Intensity); }
単純に色に対して2のn乗倍の補正値を掛けてあげるだけです。
これでHDRの再現ができました。
スクリプトからHDRのintensityをいじりたいよ~!って人は是非参考にしてみてください!
以上です!
(ここ違うよ!って所ありましたらコメントでご指摘お願いします。)