【Unity】【URP】ポイントライトの影を落とす方法とパフォーマンスのお話 (Unity2021.1から)

Unity2021.1からURPでポイントライトの影が落とせるようになったのでその方法と処理負荷の話です。

Unity2021.2.3f1

はじめに

UnityのURPでは、unity2020以前ではポイントライトから影を落とすことができませんでした。
Inspectorの項目には存在するものの、有効にすると以下のような警告が表示されます。

非対応

unity2021.1からはURPでポイントライトの影が落とせるようになりました。
本記事ではこの使い方についてまとめます。

なおURPの基礎知識については以下の記事にまとめていますので必要に応じて参照してください。

light11.hatenadiary.com

基本的な使い方

ポイントライトシャドウは以下の手順で使えます。

  1. Universal Render Pipeline AssetLighting > Additional LightsPer Pixelにチェック
  2. Lighting > Additional Lights > Cast Shadowsにチェックを入れる
  3. シーンにポイントライトを配置する
  4. ポイントライトのInspectorのShadows > Shadow TypeをHard ShadowsやSoft Shadowsに切り替える

適用された

シャドウマップのサイズ設定とメモリ

さてUniversal Render Pipeline Assetを見ると、シャドウマップのサイズを設定できる項目があることがわかります。

シャドウマップのサイズ設定

URPではAdditional Lightによるシャドウを一つのシャドウマップに描き込みます。
1個目のShadow Atlas Resolutionはこのシャドウマップの大きさを表しています。

また、ポイントライトのシャドウは6枚分のテクスチャを使ったキューブマップを使用します。
この一枚あたりのサイズを指定するのが2個目のShadow Resolution Tiersのようです(マニュアルにちゃんと書いてなさげ)。

このうちどのTierを使うかはポイントライトのInspectorから選択できます。

Tierを選択

上記ではLowを選択しているので128x128のテクスチャが6枚分使用されます。

なお使うべきテクスチャのサイズがShadow Atlas Resolutionを超えてしまった場合、
実際に使われるサイズがShadow Atlas Resolutionに収まるように調整されて以下のログが出力されます。

ログ

パフォーマンス

ポイントライトのシャドウはメモリに加えて処理負荷もそれなりに大きいので注意が必要です。
マニュアルを見ると、URPのテンプレートプロジェクトにハードシャドウのポイントライトを一つ追加した時の処理時間の比較が載っています。

Here are some example of frame times (observed with SRP package revision 78d514f756c and Unity 2020.2.0b):

  • Galaxy S20+ : 1.9ms増加
  • PC - Geforce RTX 2080 Ti (Full HD) : 0.1ms増加

参考

docs.unity3d.com