ユニバーサルレンダーパイプラインのシャドウ
Universal Render Pipeline (ユニバーサルレンダーパイプライン、URP) の ライト を使用すると、あるゲームオブジェクトから別のゲームオブジェクトに影を投影できます。これによりゲームオブジェクトの位置と大きさを強調でき、影がなければ平らに見えるシーンに奥行きとリアリティを与えられます。
シャドウマップの解像度
ライトのシャドウマップの解像度によってシャドウマップのサイズが決まります。シャドウマップが大きいほどシャドウが正確になり、URP は影をキャストするジオメトリの細かいディテールを取得しやすくなります。シャドウマップを高解像度でレンダリングすると、見た目がよりシャープになります。
URP がライトごとにレンダリングするシャドウマップの数は、ライトの タイプ によって異なります。
- スポットライトは 1 つのシャドウマップをレンダリングします。
- ポイントライトは 6 つのシャドウマップ (キューブマップの面の数) をレンダリングします。
- ディレクショナルライトはカスケードごとに 1 つのシャドウマップをレンダリングします。ディレクショナルライトのカスケードカウントは、プロジェクトの URP アセット で設定します。
URP はシーンで必要なシャドウマップの数と、シャドウアトラスのサイズに従って最適な解像度を使用しようとします。
シャドウアトラス
URP は、すべての Punctual Light シャドウ (スポットライトおよびポイントライトのシャドウ) には共通の 1 つのシャドウマップアトラスを使用し、ディレクショナルライトシャドウには他のシャドウマップを使用して、フレームのすべてのリアルタイムシャドウをレンダリングします。
これらのアトラスのサイズは、Unity プロジェクトの URP アセット で設定します。アトラスのサイズによって、シーンのシャドウの最大解像度が決まります。
例えばサイズが 1024 x 1024 のアトラスには以下が収まります。
- 512 x 512 ピクセルのシャドウマップ 4 個
- 256 x 256 ピクセルのシャドウマップ 16 個
シャドウアトラスの解像度とビルトインレンダーパイプラインの設定とのマッチング
ビルトインレンダーパイプライン を使用するプロジェクトでは、プロジェクトの品質設定でシャドウ解像度レベル ("Low"、"Medium"、"High"、"Very High") を選択することでシャドウマップの解像度を制御します。 次に、ビルトイン RP マニュアルのシャドウマッピングに関するページ で解説されているアルゴリズムに基づいて、Unity が各シャドウマップに実際にどの解像度を使用するかを決定します。 特定のシャドウマップに実際に使用された解像度は フレームデバッガー で調査できます。
URP では、シャドウアトラスの解像度を指定します。そのため、アプリケーションによってシャドウに割り当てられるビデオメモリの量を制御できます。
プロジェクトで URP が特定の Punctual Light シャドウに使用する解像度が特定の値を下回らないようにするには、シーンで必要なシャドウマップの数を考慮して十分に高いシャドウアトラスの解像度を選択します。
例えば、シーンの中に 4 つのスポットライトと 1 つのポイントライトがあり、各シャドウマップ解像度を少なくとも 256 x 256 に設定するとします。 シーンでは 10 個のシャドウマップ (各スポットライトに 1 つ、ポイントライトに 6 つ) をそれぞれ 256 x 256 の解像度でレンダリングする必要があります。 この場合、512 x 512 サイズのシャドウアトラスを使用すると、256 x 256 サイズのマップを 4 つしか含めることができないので不十分となります。そのため、256 x 256 サイズのマップを 16 個含めることができる、1024 x 1024 サイズのシャドウアトラスを使用する必要があります。
シャドウバイアス
シャドウマップとは、実質的にはライトの観点から投影されたテクスチャです。URP は投影方法でバイアスを使用して、シャドウを投影するジオメトリがセルフシャドウイングされないようにします。
URP では、個々の Light コンポーネントが以下のパラメーターを使用してそれぞれのシャドウバイアスを制御します。
- Depth Bias
- Normal Bias
- Near Plane
これらの設定は Shadows セクションにあります。プロパティが表示されない場合は、バイアス設定を "Use Pipeline Settings" から "Custom" に変更すると表示されます。
シャドウバイアスの値を大きくすると、ライトがメッシュを通じて "漏れる" 場合があります。そうなると、シャドウとキャスターの間に視覚的なギャップが生じ、シャドウの形状がキャスターを正確に表さなくなります。
パフォーマンス
いくつかのフレーム時間の例を以下に示します (SRP パッケージリビジョン 78d514f756c および Unity 2020.2.0b で確認)。
- Galaxy S20+ の URP プロジェクトテンプレート のシーンにハードシャドウ付きのポイントライトをポジション (2, 1, 1) に追加した場合の影響: +1.9 ミリ秒 (合計フレーム時間 22.2 ミリ秒)
- GeForce RTX 2080 Ti (Full HD) の PC の URP プロジェクトテンプレート のシーンにハードシャドウ付きのポイントライトをポジション (2, 1, 1) に追加した場合の影響: +0.1 ミリ秒 (合計フレーム時間 16.6 ミリ秒)