このページでは、プロジェクトで影のレンダリングを高速化するのに役立つ最適化技術について説明します。
影のレンダリング時間は、以下のような要因から影響を受けます。
影を作る可視のオブジェクトの数。この数は、Max Distance プロパティによって異なります。
影を受ける可視のオブジェクトの数。
影を作るライトの数。
Cascade Count のプロパティ値とカスケードの分割サイズ。
メインライトと追加ライトの 影の解像度。
Soft Shadows プロパティ。
以下のセクションで、これらの設定とその他の設定を使用して影のレンダリングのパフォーマンスを最適化する方法について説明します。
以下のいずれかの技術を使用して、メインライトによって作られる影を最適化します。
シャドウカスケード 機能を使用すると、シャドウマップの解像度を上げることなく、影の視覚的忠実度を向上させることができます。
Cascade Count の値を選択するときは、シャドウカスケードによるパフォーマンスへの影響 を考慮してください。
Soft Shadows プロパティを使用すると、低い影の解像度で高い視覚的忠実度を実現できます。
Soft Shadows プロパティは、モバイルプラットフォームや非テザリング XR プラットフォームなど、タイルベースのレンダリングを使用するプラットフォームのパフォーマンスに大きな影響を与える場合があります。ターゲットプラットプラットフォームがタイルベースのレンダリングを使用している場合は、アプリケーションをプロファイルして、この設定がパフォーマンスに及ぼす影響を判断します。
芸術的な技法として、低い影の解像度と Soft Shadows オプションを組み合わせて利用することができます。影の解像度が高いと、影がより細かくなるだけでなく、影がシャープに見えるようになりますが、これはすべての芸術的なスタイルに適しているわけではありません。
例えば、以下の図では、左側の画像の影は 4096 ピクセルの解像度、右側の画像の影は Soft Shadows オプションを有効にした 1024 ピクセルの解像度です。

影の解像度が低いと影の見た目がソフトになり、シーンによっては有効なこともあります。左: 解像度 4096 ピクセル、右: 解像度 1024 ピクセル
メインライトからの影の解像度と最大距離の最適化の詳細については、URP での影の解像度の設定 を参照してください。
以下のいずれかの技術を使用して、追加ライトによって作られる影を最適化します。
ポイントライトのシャドウマップを作成するために、Unity はシーンを 6 つの方向からキャプチャします。この操作がパフォーマンスに及ぼす影響は、6 つのスポットライトからの影の描画と同程度です。モバイルプラットフォームでは、この処理は各フレームで使用可能なリソースを大量に使用します。
モバイルプラットフォームでは影を作るポイントライト数を減らすか、一切なくしてください。
詳細については、以下のページを参照してください。
パフォーマンスを向上させるには、スクリプトを使用して、カメラからの距離やその他の条件に応じて影を作るリアルタイムライトをオフにします。これを行うには、Light.enabled プロパティを使用します。
ライトのポップアップを回避するには、ライトの intensity プロパティをフェードインおよびフェードアウトします。
この手法の例については、Universal 3D サンプル プロジェクトで Garden シーンの屋外ランタンのポイントライトに添付されている DynamicLightController.cs スクリプトを参照してください。
オブジェクトがほぼ静的であるエリアでは、ライトクッキーを設定したポイントライトまたはスポットライトが、リアルタイムの影を作るライトの代用となります。
ライトクッキーを設定するには、ライトコンポーネントのクッキーのプロパティ を使用します。
詳細については、クッキーの概要 を参照してください。
Light Explorer ウィンドウは、シーン内にあるすべてのライト、リフレクションとライトプローブ、およびエミッシブマテリアルを持つオブジェクトに関する役立つ概要を示します。このツールを使用すれば、シーン内で特定のプロパティを持つライトをすばやく見つけることができます。
このセクションでは、メインライトまたは追加ライトに固有ではない一般的な最適化技術について説明します。
リアルタイムの影を作るオブジェクトの数は、影のレンダリングのパフォーマンスに大きな影響を与えます。
オブジェクトが影 (ベイクした影とリアルタイムの影の両方) を全く付けないようにするには、以下の方法に従います。
ゲームオブジェクトで、Mesh Renderer > Lighting の順に選択します。
Cast Shadows プロパティを Off に設定します。
ベイクした影のみを付けるようにゲームオブジェクトを設定するには、Shadowmask ライティングモード を使用します。
Shadowmask ライティングモードでは、ベイクした影とリアルタイムの影をランタイム時に組み合わせることで、影のレンダリングのパフォーマンスを向上させることができます。
Shadowmask ライティングモードに関する一般的な情報は、ライティングモード: Shadowmask のページを参照してください。
Unity は以下の条件に基づいて、ライトまたはゲームオブジェクトが Shadowmask に影響するかどうかを判断します。
ライトのライトモードが Mixed になっていること。
ライトが影を作るように設定されていること (ライトの Shadow Type プロパティが No Shadows に設定されていないこと)。
ゲームオブジェクトが静的であること。
シーンビューで既存の Shadowmask を表示するには、以下の手順に従います。
Shadowmask では、4 つのチャンネル (r、g、b、a) を使用するため、最大 4 つのライトが重なることがあります。1 つのエリアに 5 つ以上の混合ライトが重なっている場合、Unity は追加のライトを混合モードからベイクモードに切り替えます。
特定のエリアに影響を与えるライトの数を確認するには、レンダリングデバッガー の Lighting Complexity ビューを使用します。
視覚的忠実度とパフォーマンスの最適な組み合わせを実現するには、Shadowmask モードとライトプローブを組み合わせて使用します。
ミドルクラスおよびローエンドのモバイルプラットフォームでは、パフォーマンスの点から見て Shadowmask モードが適している可能性があります。
ハイエンドのモバイルプラットフォームや PC およびコンソールプラットフォームでは、視覚的忠実度を高めるために Distance Shadowmask モードを使用することを検討してください。
詳細については、ライティングモード: Shadowmask のページを参照してください。
Shadowmask ライティングモード を使用すると、特定のゲームオブジェクトがリアルタイムの影を落とすことなく、ベイクした影に影響を与えるように設定できます。以下の手順に従ってください。
Project Settings > Quality を選択し、Shadowmask Mode プロパティを Shadowmask に設定します。
このモードでは、Unity は、Contribute Global Illumination プロパティが有効になっているすべてのゲームオブジェクトに、ベイクした影を使用します。
ゲームオブジェクトの Mesh Renderer コンポーネントで、Cast Shadows プロパティを On に設定します。
Mesh Renderer コンポーネントで、Contribute Global Illumination を有効にします。
変更が有効になるようにライティングを生成します。
これで Unity は、カメラからの距離に関係なく、ランタイム時にベイクした影でゲームオブジェクトを描画するようになります。
複雑なメッシュを持つオブジェクトから単純な影を落とすには、次の手順に従います。
ポリゴン数の少ない簡略版のメッシュを作成します。
簡略化されたメッシュに任意のマテリアルを割り当てます。Unity は簡略化されたメッシュを描画しないため、マテリアルはどれでもかまいません。
元のメッシュで、Cast Shadows プロパティを Off に設定します。
元のメッシュと同じ位置に、簡略化されたメッシュを配置します。
簡略化されたメッシュで、Cast Shadows プロパティを Shadows Only に設定します。
この設定では、Unity は元のメッシュを描画しますが、影のレンダリングには簡略化されたメッシュを使用します。
以下の Unity ツールを使用して、ライティングと影のレンダリングをプロファイルします。
詳細が必要な場合は、ターゲットプラットフォームで使用可能なプラットフォーム固有のプロファイラーとデバッグツールを使用してください。詳細については、プロファイリングツール を参照してください。