UE4のカラコレ、グレーディング
UE4には標準のポストプロセスである程度カラーコレクション/グレーディングができますが、少し機能が足りない時があります。
映像系で使う方たちはUE4からの出力後、他のソフトで作業をすればいいのであまり問題にはならないかもしれません。
しかしながら、ゲームなどリアルタイムの物は出力をUE4で全てを完結しなければならないものが多いです。
そこで今回、ちょっとひと手間かけて作る事でリアルタイムでのカラコレ/グレーディングをサポートする機能(カスタムノード、マテリアル)をいくつか紹介します。
※基本的にはポストプロセスマテリアルの中の話です。
その1 HSVとパラメータの範囲指定マスク
RGBと色相、彩度、明度を相互変換する機能と、値の範囲を選択する機能を作ります
色相環の特定の範囲だけ色相をシフトする。
色相環の赤に近い部分を選択し、青方向に色相をシフトしています
明度が一定の範囲の部分の彩度を落とす
指定したの色相以外彩度を落とす
青い部分以外は彩度を落としています
範囲指定で検出したマスク
実装 ノード
これらを実装する為にまず、RGBとHSVの相互変換機能が必要になります
偉大なサイトt-potを参考にカスタムノードを作ると簡単です。
上記のように相互変換のための2つのカスタムノードを作りました。
次に範囲を指定してマスクするノードを作ります。標準でSphereMaskなど似たようなものがあるかもですが一応作ってみました。
現在の値Valueと目的の値および適用幅、フェード幅と比較をし、0.0~1.0の値を返します。
このノードがある事により、標準ではShadow、MidtoneHighLightの固定3段階しかない範囲指定をより細かく、トーン以外のパラメータで適用することができます。
実装 マテリアル
実際に色相をずらす例で組んだノードがこちらです
シーンカラーをHSVにして目当ての色相の範囲のマスクを作成し、該当している部分だけシフトし、RGBに戻して出力しています。
実際にはさらに”キャラクターだけ”や”背景だけ”などのマスクをさらに重ねることが多いです。
その2 グレーディングノード
こちらはよく使うグレーディング機能が入った関数をつくりました。標準にある機能と重複していますが、関数化しているので、例えばRGBのチャンネル毎それぞれにこの関数を追加することができます。
標準との違いで大きいのはBlackPoint/WhitePointでしょうか、ヒストグラム上を見ながら、有効なコントラストを確認しながらBlackPointとWhitePointを設定すれば、コントラストを最大限に生かすなどの表現ができます。
BlackPoint0.1、WhitePoint0.9に設定してみた画像
※これらのノード作成の際に注意していること
これらのノードを実装するにあたって、clampなどで1~0に丸めたりしないようにしています。
例えば、図のように一度オフセットで白飛びさせた物にゲインをかけるノードを組んだ場合、中でクランプされていると、階調が失われてしまうからです。
まとめ
以上のように、いくつかのノードを作るだけで、標準機能に比べれば自由度の高い調整ができるようになりました。ポストエフェクトマテリアル上での実装で、シェーダーを書くわけではなく、ノードベースなのでアーティストもとっつきやすいかと思います。
相変わらず記事用に適当に作ったものなので、実戦ではもう少し洗練する必要があるかと思いますが、何かの足しになれば幸いです。