🌘

カラーカーブで諧調の単純化を行う

2023/12/05に公開

UE Advent Calendar 2023 用の記事になります。
https://qiita.com/advent-calendar/2023/ue

やりたいこと

もう1ヵ月前になりますが、X で 増山修 さんの「階調数と遠近感の関係」の投稿を興味深く拝見していたところ、VFXVelocity さんが UE で再現されていて‥
https://twitter.com/vfxvelocity/status/1718258218072215649

カラーカーブを使えば完全再現ができるのではと考えたのがきっかけになります。
https://twitter.com/pokopen_cg/status/1719078160560689467

結果

距離による切り替え部分はかなり雑な実装になっていますが、カラーカーブを利用して元のイメージに近いものになったかと思います。
https://twitter.com/pokopen_cg/status/1721388448102375500?conversation=none

解説

新規レベルで「Basic」のテンプレートで選択し、地面と球体4つを配置したシンプルなレベルを用意します。空やライティング環境はデフォルトから何も触っていません。

地面のマテリアル

カメラを決めておき、カラーカーブを新規作成して元のイメージと同じ色を設定し、カーブは Constant Interporation を選択してグラデーションが入らないようにします。

新規マテリアルを作成し、キャストシャドウを受けるために Shading ModelDefault Lit にします。

PixelDepth』ノードでシーンの深度情報を取得し、ここではカメラに対して元のイメージに無理矢理合わせるため 15m の距離で 0.0 ~ 1.0 の値になるよう 1500 で『Divide』してから 0-1 Clamp するために『Saturate』を入れ、反転させた上で先ほど作成したカラーカーブを繋いでいます。

これで Photoshop のグラデーションランプのように深度に応じて決まった色が付きます。

球体のマテリアル

地面と同じように、白黒のグラデーションに応じて着色するためのカラーカーブを、カメラからの距離に応じて諧調を単純化した4パターン分用意します。

Description Curve
4諧調(最も近い球体)
3諧調(2番目に近い球体)
2諧調(3番目に近い球体)
1諧調(最も遠い球体)

マテリアルでは4つのカラーカーブを距離に応じてブレンドするようにします。全体図はこちらですが、以下に順に解説します。

まず、フェイクでライティングするため Shading ModelUnlit にしています。

そして、Lambert 方式で単純なフェイクライティングを行うために、シーンの代表となるディレクショナルライトのベクトルを『Atmosphere Sun Light Vector』で取得して、モデルの法線ベクトルを『PixelNormalWS』で取得、『Dot』で内積します。

するとこちらのようにライト方向に応じてグラデーションが付きます。

その後に内積の計算結果の 1.0 ~ -1.0 の値を『Multiply』『Add』で 1.0 ~ 0.0 の範囲になるように補正しています。カラーカーブで着色するためです。

するとこちらのようになります。

地面と同じようにカメラから 15m の距離で 0.0 ~ 1.0 のグラデーションになるような情報を作成しています。

あとは4つのカラーカーブを距離に応じて切り替えています。

また、露出の影響を受けないよう最後に『EyeAdaptationInverse』を挟んでいます。

するとこちらのような結果になりました。

カラーカーブはかなり有用な機能で、実際のタイトル事例でも使用例が出てき始めましたが、具体的に利用した事例のネット記事はまだ珍しいと思ったため取り上げてみました。

宣伝

Zenn でこちらのような本を販売しています。
https://zenn.dev/pokotaro/books/43d02dab5b8000

無料で読めるページも多いのでまずはぜひご覧になってみてください。
また、購入いただいた方向けに 100 を超えるサンプル + 特典ツール を同梱しています。

Discussion