Unity はリアルタイムの影をレンダリングするためにシャドウマッピングと呼ばれる技術を使用しています。
シャドウマッピングにはシャドウマップと呼ばれるテクスチャを使用します。シャドウマップは深度テクスチャに似ています。ライトは、カメラが深度テクスチャを生成するのと同様の方法でシャドウマップを生成します。ライトと同じ場所にあるカメラを想像すると、カメラが見ることができないシーンの領域は、ライトからの光線が届かないシーンの領域と同じです。したがって、それらは影になります。
Unity は、光線がサーフェスをヒットするまでに移動する距離の情報をシャドウマップに入力します。それから、シャドウマップをサンプリングしてライトがヒットするゲームオブジェクトのリアルタイムの影を計算します。
シャドウマッピングの詳細については、シャドウマッピングに関するウィキペディアのページ を参照してください。
シャドウマップの解像度を計算するために、Unity は以下を行います。
ライトが照射できるスクリーンビューの領域を決定します。ディレクショナルライトに関しては、画面全体を照らすことができますが、スポットライトやポイントライトに関しては、その領域はライトの広がりの形状 (ポイントライトの球形やスポットライトの円錐形) が画面上へ投影されたものです。投影された形状は、画面上にピクセル単位の特定の幅と高さを持ちます。この 2 つの値の大きい方が、ライトのピクセルサイズです。
以下の計算を実行し、結果を最大サイズに固定します。
ライトタイプ | 計算式 | 最大解像度 (ピクセル) |
---|---|---|
Directional | NextPowerOfTwo (ピクセルサイズ * 影の品質の乗数 * 3.8) | Shadow Resolution が Very High の場合、または GPU に 512MB 以上の RAM がある場合は4096 x 4096、それ以外の場合は 2048 x 2048。 |
Spot Lights | NextPowerOfTwo (ピクセルサイズ * 影の品質の乗数 * 2.0) | GPU に 512MB 以上の RAM がある場合は 2048 x 2048、それ以外の場合は 1024 x 1024。 |
Point Lights | NextPowerOfTwo (ピクセルサイズ * 影の品質の乗数 * 1.0) | GPU に 512MB 以上の RAM がある場合は 1024 x 1024、それ以外の場合は 512 x 512。 |
ポイントライトは、他のタイプよりもサイズの限界が低く設定されています。なぜなら、キューブマップを影に使用するからです。つまり、この解像度でキューブマップの 6 面がいっぺんにビデオメモリに保持されなければならないからです。描画するのにも非常に負荷がかかります。影を投影する可能性のあるものを、キューブマップ 6 面全てに描画する場合があるからです。
ビルトインレンダーパイプラインでは、Light.shadowCustomResolution プロパティを 0 より大きい値に設定することで、ライトのシャドウマップの解像度を設定できます。この値が 0 より大きい場合、Unity はすべてのライトタイプに対して以下の計算を行います。
NextPowerOfTwo (shadowCustomResolution)
次に、上の表が示すライトのタイプとハードウェアに基づいて、最大の解像度を固定します。
レンダーパイプライン間のシャドウマッピングのサポートについて詳しくは、レンダーパイプライン機能の比較 を参照してください。