Version: 2020.1
言語: 日本語
シャドウディスタンス
影のトラブルシューティング

シャドウカスケード

シャドウカスケードは、透視エイリアシングと呼ばれる問題を解決するのに役立ちます。透視エイリアシングとは、ディレクショナルライト からのリアルタイムの影がカメラの近くにあるとき、ピクセル化されて表示される現象です。

シャドウカスケードはディレクショナルライトでのみ機能します。

透視エイリアシング

ディレクショナルライトは一般に太陽光を模倣しており、1 つのライトはシーン全体を照らすことができます。つまり、そのシャドウマップはシーンの大部分を対象にします。このことが、透視エイリアシングという問題の原因となります。透視エイリアシングとは、カメラに近いシャドウマップのピクセルが、遠くにあるものよりも拡大されて粗く見える現象です。

カメラから距離のある影 (A) は適切な解像度で表示され、カメラに近い影 (B) には透視エイリアシングが発生する
カメラから距離のある影 (A) は適切な解像度で表示され、カメラに近い影 (B) には透視エイリアシングが発生する

透視エイリアシングが起こるのは、シャドウマップの各領域が、カメラの透視によって想定以上に拡大されてしまうためです。ライトによるシャドウマップは、カメラに映っている範囲だけを対象にすれば良く、その範囲はカメラの 視錐台 によって決まります。ディレクショナルライトが真上から当たるシンプルな状態を想像すると、錐台とシャドウマップの関係が分かりやすいでしょう。

この簡単な例では、錐台の遠い方の端が 20 ピクセルのシャドウマップで対応しています。一方、近い方の端は 4 ピクセルだけで対応しています。ただし、 画面上では両端が同じサイズで表示されます。その結果、カメラに近い影のエリアでは、マップの解像度が実質的にかなり低くなります。

シャドウカスケードの仕組み

ソフトシャドウを使用する場合や、シャドウマップに高い解像度を使用する場合は、透視エイリアシングは目立ちません。ただし、これらのソリューションでは、レンダリング中により多くのメモリと帯域幅を使用します。

シャドウカスケードを使用する場合、Unity はカメラからの距離に基づいて錐台領域を 2 つのゾーンに分割します。近端のゾーンは、サイズを小さくした別のシャドウマップを使用します (解像度は同じ)。シャドウマップサイズのこれらの段階的な削減は、カスケードシャドウマップ (別名 Parallel Split Shadow Map) と呼ばれます。

シャドウカスケードの使用

プロジェクトで Shadow Cascade を設定するとき、カスケードの数を 0、2、5 から選択できます。Unity は、カメラの錐台内のカスケードの位置を計算します。

カスケードを多く使えは使う程、透視エイリアシングが影に与える影響は小さくなりますが、カスケード数を多くするとレンダリングのオーバーヘッドが発生します。ただし、このオーバーヘッドは、すべての影に高解像度のマップを使用する場合よりは少なくなります。

前述の、4 つのカスケードのある影の例
前述の、4 つのカスケードのある影の例

ビルトインレンダリングパイプラインで、プロジェクトの Quality Settings でQuality Level (品質レベル) プロパティごとの Shadow Cascades を設定してください。

ユニバーサルレンダーパイプライン (URP) では、ユニバーサルレンダーパイプラインアセット でシャドウカスケードを設定します。

HD レンダーパイプライン (HDRP) では、各 ボリューム のシャドウカスケードを設定します。

シャドウディスタンス
影のトラブルシューティング