Shinpy’s blog

Unityで映像とか作ってます。

Unity Color HDRの制御方法

色を使って色々したいなぁと思った際、HDRのintensityの制御が分からなかったので調べてみました。
割と資料に落ちてなかったのでここに書き残しておきます。

そもそもHDRとは?

この辺りはHDRで検索かければ結構出てきます。
High Dynamic Rangeの略称で、明るさの表現範囲を広げれるものです。

画像補正などでよく使用されるそうですね。
Unityではカラーピッカーなどで使用されます。
ポストエフェクトを有効にしておくと表示されるようになります。

ここの強さ(intensity)の処理についてが今回の議題です。

intensity

さて、このintensity、果たして何者なのでしょうか。
先ほど「明るさの表現範囲を広げれるもの」と言いましたが、具体的にどのように調整しているのでしょう。

その答えはタブのRGB 0-255RGB 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をいじりたいよ~!って人は是非参考にしてみてください!
以上です!

(ここ違うよ!って所ありましたらコメントでご指摘お願いします。)