スタイライズドな板ポリ影とシャドウマップ影を馴染ませたトゥーン表現。プロジェクト配布有。
モチベーション
トゥーン表現系のプロジェクトにて、背景はDirectionalLightなどから得られるシャドウマップ準拠な影を落としつつ、キャラクターから落ちる影はStylizedなものにしたい、という要件。
往々にして背景に対しキャラクターメッシュのディティールは多くなりがちなため、あえて精細な影は使いたくない、というニーズは割とあるように感じている。
結果だけ先に展開するとこういう感じ。
完成図
環境
- UE5.3.2
- ブループリントプロジェクト
- ThirdPersonTemplate
実装
ポストプロセスマテリアル - 1
まずはシャドウマップ準拠のを作ります。
DeffuseColorとPostProcessInput0との差分から二値化された影を取得します。
(※参考:https://www.kodeco.com/146-unreal-engine-4-cel-shading-tutorial )
BeforeToneMappingを忘れずに。
この際、なるべく陰にはGIの影響を受けさせたくないため、LumenやAutoExposureなどを切っておくとよいでしょう。
ポスプロによる二値影実装。最終結果ではDiffuseColorさえ得られれば良いので、Quinnのマテリアルは簡易なものに変更しています。
この影をオールドスクールな板ポリ影にしたいわけです。
板ポリ影の作成
板ポリ用マテリアルはきわめてシンプルです。
/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter
を編集し、足元にPlaneを追加。そのマテリアルとして上記影用マテリアルをアサインします。
PlaneのStaticMeshComponentと、もともと入っているQuinnのSkeletalMeshComponentの"CastShadow"をfalseにしましょう。
古き良き、板ポリ影の完成です。
しかしこれでは、既存の影に対して浮いているんですよね。色を合わせたところで、床のディティールに対応しきれず、どうしても違和感は出てしまうことでしょう。
そこでひと工夫を加えます。
板ポリ影の設定
PlaneのStaticMeshComponentの詳細設定にて、
- RenderinMainPass = False
- RenderinDepthPass = False
- RenderCustomDepthPass = True
と設定します。
これでこのPlaneが、「DiffuseColorでは表示されず、CustomDepthPassでのみ描画される板ポリ影」になりました。
ポストプロセスマテリアル - 2
CustomDepthPassをそのまま利用するとキャラクターよりも手前に描画されてしまうため、前後関係を保ったままマスク化したいです。その場合はSceneDepthとの比較を行えばよいでしょう。
ポスプロマテリアル上での実装
プレイインして確認。きちんとマスクが取得できています。
あとは先に作成した二値影のマスクにMinでブレンドすると…
イケた影の完成!!!
シャドウマップ部分と重なった部分も問題なく馴染んでいますね。
プロジェクト配布
サンプルデータはこちらです。
あとがき
お疲れ様でした。ご覧いただきありがとうございます。
京都で3Dやっています、mori studioと申します。
仲良くしていただけますと幸いです。
Bluesky : https://bsky.app/profile/moristudio.bsky.social
X : https://twitter.com/mori__studio
ご不明な点やお気づきの点、改善案などございましたらお気軽にお報せください。
Discussion