Unity では,shadow map サイズは以下のように計算されます。
画面上の最初のライトの 収束ボックス が計算されます。 これは,ライトが示す画面上の長方形になります。
pixel size
を呼び出します。シャドウ解像度が High の場合,シャドウ マップのサイズは次のようになります。
NextPowerOfTwo( pixel size * 1.9 )
,ですが,2048
ほどです。NextPowerOfTwo( pixel size )
,ですが,1024
ほどです。NextPowerOfTwo( pixel size * 0.5 )
,ですが,512
ほどです。512MB 以上のビデオ メモリーのあるグラフィック カードの場合,シャドウ マップの上限は増えます (ディレクショナル ライトの場合,4096,スポット ライトの場合,2048,ポイント ライトの場合,1024)
シャドウ解像度が Middle の場合,シャドウ マップのサイズは_High_よりも 2 倍小さくなります。 シャドウ解像度が Low の場合,シャドウ マップのサイズは High よりも 4 倍小さくなります。
ポイント ライトでは,シャドウにキューブマップを使用するため,明らかに制限が低くなります。 つまり,この解像度での,6 つのキューブマップの面をビデオ メモリに入れる必要があります。 これらはまた,潜在的なシャドウ キャスタを最大 6 つのキューブマップ面にレンダリングする必要があるため,レンダリングにかなりのコストがかかります。
ビデオ メモリーの制限に近づくと,Unity は自動的に上記で計算されたシャドウ マップの解像度を落とします。
一般に画面のメモリー (バックバッファ,フロントバッファ,深さバッファ) およびレンダーテクスチャのメモリーは,ビデオ メモリーにある必要があり,Unity はこの両方を使用して,シャドウ マップにより許可されるメモリー使用量を決定します。 上記で計算されたサイズに応じて,シャドウ マップを配置する際,(TotalVideoMemory - ScreenMemory - RenderTextureMemory) / 3
に合うまで,そのサイズが減ります。
すべての通常のテクスチャ,頂点データおよびグラフィック オブジェクトがビデオ メモリーからスワップされると仮定すると,シャドウ マップが使用できる最大 VRAM は,(TotalVideoMemory-ScreenMemory-RenderTextureMemory)
となります。 しかし,画面やレンダー テクスチャが使用する正確なメモリー量はわからないため,また一部のオブジェクトはスワップアウトできないため,すべてのテクスチャが常にスワップインおよびアウトする場合,パフォーマンスはひどいものになります。 そのため,Unity では,シャドウ マップが_一般的に使用できる_ビデオ メモリーの 1/3 (非常に効果のある) を超えないようにしています。