Unity はリアルタイムの影をレンダリングするためにシャドウマッピングと呼ばれる技術を使用しています。
シャドウマッピングにはシャドウマップと呼ばれるテクスチャを使用します。シャドウマップは深度テクスチャに似ています。ライトは、カメラが深度テクスチャを生成するのと同様の方法でシャドウマップを生成します。ライトと同じ場所にあるカメラを想像すると、カメラが見ることができないシーンの領域は、ライトからの光線が届かないシーンの領域と同じです。したがって、それらは影になります。
Unity は、光線がサーフェスをヒットするまでに移動する距離の情報をシャドウマップに入力します。それから、シャドウマップをサンプリングしてライトがヒットするゲームオブジェクトのリアルタイムの影を計算します。
シャドウマッピングの詳細については、シャドウマッピングに関するウィキペディアのページ を参照してください。
シャドウマップの解像度を計算するために、Unity は以下を行います。
Determines the area of the screen view that the Light can illuminate. For directional lights, the whole screen can be illuminated. For Spot Lights and Point Lights, the area is the onscreen projection of the shape of the light’s extent: a sphere for point lights, or a cone for Spot Lights. The projected shape has a width and height in pixels on the screen; the larger of those two values is then taken. This value is called the Light’s pixel size.
以下の計算を実行し、結果を最大サイズに固定します。
ライトタイプ | 計算式 | Maximum resolution, in pixels: |
---|---|---|
Directional | NextPowerOfTwo (pixel size * shadow quality multiplier * 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)
次に、上の表が示すライトのタイプとハードウェアに基づいて、最大の解像度を固定します。
See render pipeline feature comparison for more information about support for shadow mapping across render pipelines.