ゲームエフェクトデザイナーのブログ | A Real-Time VFX Artist's Blog

About Making Materials on UE, Making Tools with C#, etc

UE4 CheapContrastについて

マテリアル関数の CheapContrast の中身についてメモしておきます。
こちらが CylindricalUVs の中で使われていたので何をやっているか調べました。

f:id:moko_03_25:20180618031457j:plain

まず、得られる効果は名前の通り「低い処理コストでコントラストを与えられる」といった感じになるかと思います。

使い方としては「In」ピンに「0~1」の輝度情報を入力します。
Contrast」ピンにコントラストの強さを入力します。0で何も変化無しです。

下図は与える強さごとの結果です(白寄りに見えるのはリニアで表示されているため)。

f:id:moko_03_25:20180618030658j:plain

さて、中身ですが LinearInterpolate (直線補間) ノードを使って、入力したコントラスト値を「0 から引いた値」~「1足した値」の範囲に広げた後に「0~1」で Clamp しています。

ただ、なぜ Subtract の後に 3チャンネルにして計算してるのかが分かりません。
こちらの構成は不要なような。。
どなたかお分かりになる方いらっしゃったら教えてください。。

f:id:moko_03_25:20180618030655j:plain

これだけではイメージが掴みにくいのでさらに補足します。
まず、元の輝度情報がこちらのグラフのような感じだとします。

f:id:moko_03_25:20180618030652j:plain

コントラストの値を「1」にした場合、範囲が 0.5 を中心に「-1~2」になり「0以下と1以上」は Clamp されるので、下図を見て分かる通り 0~1 の範囲が狭まりコントラストが強まったと言えると思います。

ただ、白飛び&黒潰れさせるコントラストの与え方なので注意が必要です。
(処理に余裕があるなら白飛び&黒潰れはさせずにS字カーブでコントラストを与えるような感じにしたいところです)

f:id:moko_03_25:20180618030647j:plain

コントラストの値を「5」にした場合は、こちらのような感じです。
0~1 の範囲は 0.5 を中心にさらに狭くなります。

f:id:moko_03_25:20180618030645j:plain

なるほど、面白い!
0~1の範囲をスライドできるようにしてやると、使い勝手が上がりそうです。

という訳で CheapContrast でした。