🖼️

スタイライズドな板ポリ影とシャドウマップ影を馴染ませたトゥーン表現。プロジェクト配布有。

2024/02/21に公開

モチベーション

トゥーン表現系のプロジェクトにて、背景は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でブレンドすると…

イケた影の完成!!!


シャドウマップ部分と重なった部分も問題なく馴染んでいますね。

プロジェクト配布

サンプルデータはこちらです。
https://github.com/mori-studio/StylizedShadowSample

あとがき

お疲れ様でした。ご覧いただきありがとうございます。
京都で3Dやっています、mori studioと申します。
仲良くしていただけますと幸いです。
Bluesky : https://bsky.app/profile/moristudio.bsky.social
X : https://twitter.com/mori__studio

ご不明な点やお気づきの点、改善案などございましたらお気軽にお報せください。

Discussion