シャドウ トラブルシューティング
統合グラフィック カードの最適化

シャドウ サイズの計算

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 (非常に効果のある) を超えないようにしています。

シャドウ トラブルシューティング
統合グラフィック カードの最適化