URPでPostProcessingの効果をゲーム画面だけに適用する

Unity の URP 環境で Post Processing の効果をゲーム画面だけに適用して UI には効果を適用しない設定の紹介です。

通常、Main Camera に ゲーム画面と UI を映した状態で Vignette(画面の端が暗くなる効果)を適用すると UI の端が暗くなって見づらくなってしまうので Post Processing の効果をゲーム画面だけに適用して UI を除外する設定方法を紹介したいと思います。*1

確認環境

  • Unity 2020.3.16f1
  • URP がプロジェクトに設定済み
  • Prost Processing の設定がされてること

ちなみに、以下構成で確認しています。

  • Camera の Projection は Orthographic
  • Canvas は Screen Space - Camera

パースペクティブとか Overlay は設定考慮していません。*2

参考画像

設定すると以下のような見た目になります。

適用前

適用後

UIには Vignette 効果がかからず明るさが変化していないことが分かると思います。

設定方法

まずカメラを以下画像のように「メインゲーム用表示用 (Main Camera)」と「UI表示用 (UI Camera (Overlay))」の 2つに分けます。

作業後のイメージは以下のような形になります。

UI 表示用カメラの設定

まず最初に UI 用のカメラを新規に作成します。

ヒエラルキー上で Camera を追加して オブジェクト内の Camera コンポーネントに以下を設定します。

  • Layer を UI に変更する(視認性の
  • Render Type = Overlay
  • Projection, Size = MainCamera と同じにしておく
  • Post Processing = チェック外す
  • Renderging > Culling Mask = 「UI」のみにチェックを入れてそれ以外をすべて外す
  • Audio Listner コンポーネントは削除する
  • Environment > Volume Mask から「Defualt」を外しておく
    • UI のみか Nothing で良い

余談ですが、Overlay に設定すると Transform の位置に関わらずどこに配置してもメインカメラ上に表示されますが、常に同じ位置に合わせておいた方が無難です(メインカメラの位置が変更されたら UI カメラ位置が追従するスクリプトを書いて常に合わせておくとかで)

メインゲーム用表示用カメラの設定

最初からある「Main Camera」の設定を変更します。こちらにゲーム画面を映して Post Processing の効果を適用します。

ヒエラルキーから MainCamera を選択して Camera コンポーネントに以下を設定します。

  • カメラコンポーネント > Rendergin > Post Processing = ON
  • Curring Mask から「UI」のチェックを外す
  • Stask を「+」して先ほど追加した UI 用のカメラを設定します。
  • Layer は Default のままにしておく

Canvas の設定

Screen Space - Camera なので Renderer Camera に UI 用のカメラを設定する。(Screen Space - Overlay でも、ここまで設定していれば効果が除外されると思うけど細かい設定は未確認です)

ほかの適用例

以下のような Lens Distortion を設定した場合でも

UI には効果が適用されていません。

最後に

余談ですがローエンド端末でカメラをスタックするとFPSが低下するので注意が必要です。

URP固有の問題なのか、ビルトインレンダリングパイプラインでも同様なのかまでは確認していませんが、Zenfone 4 (Zenfone 4@Snapdragon 660で Antutu のスコアが 3万6000 程度の端末だと)ライトを設定して Bloom をかけた状態では 60fps が出ますが、UI用のカメラを追加でスタックすると 42fps 程度にフレームレートが低下します。

回避が難しい問題のようなので UI にPostProcess をかけないようにしたいだけであれば WorldSpace を選択するのがパフォーマンス的にはよさそうです。

参考

カメラの使い方を工夫してゲームのパフォーマンスを最適化する方法:パート 1

https://blog.unity.com/ja/games/optimize-game-performance-with-camera-usage

カメラの使い方を工夫してゲームのパフォーマンスを最適化する方法:パート 2

https://blog.unity.com/ja/games/part-2-optimize-game-performance-with-camera-usage

Unityフォーラム

https://forum.unity.com/threads/post-processing-with-multiple-cameras-is-currently-very-problematic.1028533/

ちなみに公式ブログの記事の通り、カメラを2台以上にすると結構大きくパフォーマンスが低下するようです。UIに Post Processing を適用しないかつ UI より前に何か表示する必要が無い場合は Overlay にしておいた方が良さそうです。なるべく1カメラで済ませたいのですが現状難しそうです。

フォーラムが少し盛り上がってるみたいですが同じカメラ内で特定のレイヤーにだけ PostProcessing を適用する手段は(フォーラムでかなり揉めてるようですが)Oberlay 以外だと現状では存在しません。Bloomがちょっとおかしくなるのも今のところ使用?っぽいですし、、、ちょっと困ります。

以上です。

*1:最初に設定してあとは数か月単位で触らないみたいなケースが多くてその都度忘れるので個人的な備忘録的な意味もあったり…

*2:どうせOverlayにしててもUIの前にエフェクト入れたくなったらこの設定にしちゃうし…