【UE5で気分転換!セルルック×ライティングでキャラを魅せたい】第1回:キャラに適用されるトーンマッパの影響を打ち消して、トーンマッピング前のカラーを出力させてみた – Unreal Engine 5.6

Unreal Engine

水ノ茉の宣伝

準備中...
ゲームを作る予定なの
水ノ茉こおり

シリーズ説明

本シリーズで最終的に検証したい内容は、DMXで制御されたバカみたいな量のライト、それらすべてをキャラクターに当てても破綻しないレンダリングパイプラインの構築です。

実装の手段は選ばないため、普段展開している【UE5】◯◯◯ – Unreal Engine ◯.◯と比べると多少敷居が高く、また、実装の再現性を提供しないこともあるため、いつも以上に趣味嗜好が全開となります。

始まり

さっそくディファードライティング環境の魔改造を…という予定でしたが、その前に寄り道をします。

セルルックと戯れるうえで把握しておいた方がいい要素のひとつ。
トーンマッパについて触れていきます。

トーンマッパやトーンマッパー、トーンマッピングと幾つか表記揺れが起きるかもしれませんが、大枠の意味は同じなのであんまり気にし過ぎないで下さい。

環境

  • Windows 10
  • Unreal Engine 5.6 Preview (0ae48a9)
  • Visual Studio 2022
  • Visual Studio Code
  • RenderDoc
  • Blender 4.3

モデルの準備

買ってきました。

オリジナル3Dモデル『ミルティナ』 - DOLOS art - BOOTH
【ミルティナ試着ワールド】 ----------------------------------------------------- オリジナル3Dモデル【Milltina】 製作者:DOLOS VRChatと動画配信等でのご利用をお勧め...

愚直にインポートするとボーン構成とスケールが狂うので適当に直します。
手順は過去の私が確立しているのでラクラクなのです。

同様に衣装も買ってきて設定します。
トーンマッパをネタにするのでカラフルな衣装です。

【13アバター対応】Gear Lapin【セール中】 - PLUMARIUM - BOOTH
こちらの商品は全13アバターに対応した衣装です。 6/1まで期間限定販売記念セール中です! フルセット5000円→4500円 単品2000円→1700円

めっちゃ おっぱい おっきい 笑

衣装に合わせてBreasts_Small=1.0に変更です。

Smallと命名されていますが、これは果たして小さいのでしょうか。

これで小さいとか言い出したら三司さんがキレそう。

IKとRTGで待機アニメーションを召喚して、ABPでMorphを適用、BPでSetLeaderPoseComponentを叩いて衣装に素体と同様のアニメーションを伝播させて、Level上でUpdate Animation in Editorにチェックを入れて非プレイ時にもABPを回してもらって準備完了です。

トーンマッパのメリット

公式のドキュメントが解りやすいので読んで下さい。

Just a moment...

トーンマッパの役割をすごく要約すると。

ライトを大量に配置した場合やブルームを強くした場合には、全体的に発光した状態になるため、各色成分が1.0超過することが多々あります。その状態で出力すると所謂白飛びや特定成分の色味のみが強く出て、見た目が極端になります。先の公式ドキュメントの『物理的に正確なエミッシブとブルーム』がその状態を表した分かりやすい画像ですね。

これを解消してくれるのがトーンマッパなのです。

ローカル環境で自分の目で見てもらうのが一番理解早いと思いますので、ポストプロセスの設定からTone Curve Amount0.0に変更して、トーンマッパの影響を弱めてください。

ライト強度を極端に上げた状態でTone Curve Amountをパカパカ切り替えると分かりやすいです。

ちなみに、UE4系まではトーンマッパの影響を完全に切ることが出来たのですが、5系からは先の通り弱めることしか出来なくなりました。UEは現実的なライティングが大得意なので、トーンマッパを切るという行為自体がエンジンの趣向と相反しているため妥当な変更ですね。

とはいえ、Unityのシェーダーを移植する際に不便なこともあったので、トーンマッパを切ってUnityと同等にする方法も用意しています。

こっちはNeutralとACESの移植です。
ACESはUEの純正実装の方が洗礼されているためぶっちゃけ不要でした。

トーンマッパのデメリット

トーンマッパのメリットを理解できればデメリットは容易に想像つくと思います。
白飛び防止や色成分が極端にならないようにしている、つまりは出力カラーを変えていると同義です。

そしてこのトーンマッパはUnlitシェーダーに対しても例外なく適用されるため、UnlitだというのにEmissiveに繋いだカラーがそのまま出力されなくなるという、Unity畑な方からしたら『なんやこれ』となる設計仕様なのです。

見た目的には色が薄くなります。まぁこれもトーンマッパ挙動的に想像に容易いですよね。

トーンマッパの打ち消し

UnlitでEmissiveをそのまま出力したい場合は、Tone Curve Amountを切るか、Unlitシェーダーで打ち消し計算を行うかの2択です。

前者は簡単ですが、Unlitシェーダー以外にも適用されてしまうため、レベルが白飛び祭りになります。あと、Fabで販売されているアセットたちはトーンマッパを加味して調整されているため、大体がまともに使えなくなり、マテリアルの再調整が発生してしまいます。

そういう問題を考えると後者のUnlitシェーダーで打ち消し計算を行うのが現実的ですね。

FilmToneMapInverse

打ち消し方法は意外と簡単です。

CustomノードTonemapCommon.ushをインクルードしてFilmToneMapInverse関数から帰ってきた値をEmissiveに突っ込むだけです。

ね?簡単でしょ。

あとは必要に応じてCustomノードの前にpow2.2pow0.4545をしてください。

唯一の注意点としては、5.5まではTonemapCommon.ushにインクルードガードが付与されていなかったので、複数のCustomノードでInclude File Pathsを指定すると多重インクルードによる定義の重複エラーが起きます。

エンジンシェーダーを編集できる方は、インクルードガードの付与をして解消してください。

エンジンシェーダーを編集できない方は、最初に展開されるCustomノードにのみInclude File Pathsを指定して、その後に展開されるCustomノードには未指定するなど、工夫してください。

ポストプロセスの設定

Unlitシェーダーでの打ち消しは以上で終わりですが、これだけだとまだテクスチャカラーと差分が残っています。

残りの差分は各種ポストプロセスエフェクトによるものです。

抑制自体は出来るのですが、当然ポストエフェクトなのでUnlit以外にも影響が発生します。どれを採用するかは各々で判断してください。あくまで差分を限りなく抑える際の設定プリセット程度です。

  • Bloom > Intensity=0.0
  • Exposure > Metering Mode=Manual
  • Exposure > Exposure Compensation=0.0
  • Exposure > Apply Physical Camera Exposure=False
  • Local Exposure > Highlight Contrast=1.0
  • Local Exposure > Shadow Contrast=1.0
  • Image Effects > Vignette Intensity=0.0

重要度でいうとExposureLocal Exposureは必須級、それ以外は任意です。

ブルームを使ったら発光して白っぽくなること自体は自明ですし、ビネットは余程強くしない限り画面中央にまで影響を及ぼすこともないですし。

テクスチャカラーを見比べて見ると、かなり近づきましたね。

他のカラバリでも同程度に打ち消しが出来ていますね。

おわり!!!

地味にFilmToneMapInverseのアーカイブを作っていなかったので、新シリーズに託けて記しておきました。

次回からは問答無用で気の向くままに魔改造していきます。
最近ルックデヴしてなくて鬱憤が溜まっているのです。

セルルック関連

興が乗ったきっかけ

プロセカのなんかの記事を探していたら別の記事に辿り着きました。

このルックいいなーと、欲しいなーと思いました。

そしていつもの気分屋さんが発動した結果、このシリーズが生まれました。

稀に行動してから後のことを考えるアホなことしちゃう。

雑談

シリーズ説明にある通り最終的に検証したい内容は、DMXでバカみたいなライトの量を制御しつつ、その環境に耐えうるルック制作なのですが、ライト制御自体は筆者やりたくないのです。

ということで水ノ茉(こおり)のシナリオ担当にDMXでライト制御をよろしく♪とぶん投げました。
そしてぶん投げたはいいものの、今までとは異なり私以外もレベルを触る必要があります。
つまりは魔改造したエンジンを提供する必要があるのです。

これがねぇ。結構地味に大変で疲れたの。
バカみたいなデータサイズだから不要なデータをピックアップして削除して、起動してを永遠と繰り返し。

最終的に250GBから28GBに大削減できました。
まだ削減の余地はありますが、流石に疲れたので第1弾として区切りなのです。

珈琲タイムならぬ珈琲ライブなのです。
我ながらいい捻りです。
茉優先輩の珈琲も絡めています。むふふ。

あと自前のサーバーが欲しい。
バイナリ管理はサイズ的にやっぱり無理があった。

制作を本格的に進める前に気付けたので良かったです。
最近クエストシステムを組み終わりました。
徐々にインゲーム層にも慣れてきてイテレーションが早くなってきたのは喜ばしいのですが…
飽きました。

マジで本当に飽きました。

インゲームの実装ばっかりしてるから描画まわりを触れていないのです。
良くも悪くも余裕で出来る領域なので工数確保を後ろに回しています。

結果、すんごい欲求不満なのです。

んで欲が爆発した結果がコレよ。

とりあえずこれで一通り発散し終えてからゲーム制作に戻ります。

マジで一旦消化しないと無理。