GI キャッシュ
関連トピック

ライトのトラブルシューティングとパフォーマンス

ライトは 2 つの方法のいずれかでレンダリングすることができます。

  • 頂点ライティング は、メッシュの頂点だけで照明を計算し、頂点間のサーフェス上では、頂点の値を補間します。ライティングエフェクトの中には、頂点ライティングにサポートされないものもありますが、処理のオーバーヘッドの面では、2 つを比べるとこちらの方が間違いなく有利です。また、古いグラフィックカードでは、頂点ライティングが、唯一利用可能な方法である場合があります。

  • ピクセルライティング は、すべてのスクリーンピクセルを個別に計算します。レンダリングに時間がかかりますが、頂点ライティングで不可能なエフェクトのいくつかを行うことができます。法線マッピング、ライトのクッキー、リアルタイムのシャドウはピクセルライト用だけにレンダリングされます。さらに、スポットライトの形状やポイントライトのハイライトは、ピクセルモードでレンダリングした方がずっと見栄えが良くなります。

ピクセルライティングと頂点ライティングでレンダリングしたスポットライトの比較
ピクセルライティングと頂点ライティングでレンダリングしたスポットライトの比較

Lights have a big impact on rendering speed, so lighting quality must be traded off against frame rate. Since pixel lights have a much higher rendering overhead than vertex lights, Unity will only render the brightest lights at per-pixel quality and render the rest as vertex lights. The maximum number of pixel lights can be set in the Quality window for standalone build targets.

Render Mode プロパティーを使って、あるライトを優先的にピクセルライトとしてレンダリングすることができます。ライトをピクセルライトとしてレンダリングするかどうかを決定するときに、Important と設定されたモードのライトには、より高い優先順位になります。 Auto (デフォルト) に設定したモードでは、指定されたオブジェクトがどれだけそのライトの影響を受けるかに基づいて Unity が自動的にライトを分類します。ピクセルライトとしてレンダリングするライトは、個々のオブジェクトベースで決定されます。

詳細については、グラフィックスパフォーマンスの最適化 のページを参照してください。

Lighting ウィンドウの統計表示

Lighting ウィンドウの一番下には統計データが表示され、ランタイムのパフォーマンスに関する重要なマトリクスを示しています。詳細は Lighting ウィンドウ を参照してください。

シャドウのパフォーマンス

リアルタイムのシャドウはレンダリングのオーバーヘッドが非常に高いので、使用する際には注意が必要です。最初に、投影する可能性のあるオブジェクトをシャドウマップへレンダリングしておきます。その後、シャドウを受ける可能性のあるオブジェクトがレンダリングされる時に、このシャドウマップが使われます。シャドウを有効にすると、上述のピクセル/頂点ライトよりも、さらに大きな影響をパフォーマンスに与えます。

ソフトシャドウは、ハードシャドウよりも大きなレンダリングのオーバーヘッドを持っていますが、これは GPU に影響を与えるだけで、CPUに多くの余分な作業は発生しません。

The Quality window includes a Shadow Distance value. Objects that are beyond this distance from the camera will be rendered with no shadows at all. Since the shadows on distant objects will not usually be noticed anyway, this can be a useful optimisation to reduce the number of shadows that must be rendered.

ディレクショナルライト特有の問題は、1 つのライトがシーン全体を照らすことができてしまうことです。つまり、シャドウマップがしばしば、シーンの大部分をいっぺんにカバーし、パースペクティブエイリアシングとして知られている問題が発生するシャドウができやすいことです。簡単に言えば、 パースペクティブエイリアシングでは、カメラの近くに表示されるシャドウマップのピクセルは遠くのものに比べて、拡大されて「分厚く」見えます。この影響を低減するために、単にシャドウマップの解像度を上げることもできますが、その結果、解像度の低いシャドウマップで十分よく見えてた距離の離れた領域で、レンダリングのリソースが無駄に消費されてしまいます。

A good solution to the problem is therefore to use separate shadow maps that decrease in resolution as the distance from camera increases. These separate maps are known as cascades. From the Quality window, you can choose zero, two or four cascades; Unity will calculate the positioning of the cascades within the camera’s frustum. Note that cascades are only enabled for directional lights. See directional light shadows page for details.

シャドウマップのサイズを計算する方法

マップのサイズを計算する際の最初のステップは、ライトが照射できるスクリーンビューの領域を決定することです。 ディレクショナルライトに関しては、スクリーン全体を照らすことができますが、スポットライトやポイントライトに関しては、その領域はライトの広がりの形状 (ポイントライトの球形、やスポットライトの円錐形) がスクリーン上へ投影したものです。投影された形状は、スクリーン上にピクセル単位の特定の幅と高さを持ちます。この2つの値の大きい方が、光の「ピクセルサイズ」です。

When the shadow map resolution is set to High (from the Quality window) the shadow map’s size is calculated as follows:

  • ディレクショナルライト NextPowerOfTwo (ピクセルサイズ * 1.9)、最大 2048 まで。
  • スポットライト NextPowerOfTwo (ピクセルサイズ)、最大 1024 まで。
  • ポイントライト NextPowerOfTwo (ピクセルサイズ * 0.5)、最大 512 まで。

グラフィックスカードが、512MB 以上のビデオメモリを有する場合、上のシャドウマップの限度は、ディレクショナルライトでは 4096、スポットライトでは 2048、ポイントライトでは 1024 まで増加されます。

Medium のシャドウの解像度では、シャドウマップのサイズは High の半分の値であり、Low では、High の 4分の 1 のサイズになります。

ポイントライトは、他のタイプよりもサイズの限界が低く設定されています。なぜなら、キューブマップをシャドウに使用するからです。つまり、この解像度でキューブマップの 6 面がいっぺんにビデオメモリに保持されなければならないからです。描画するのにも非常に負荷がかかります。シャドウを投影する可能性のあるものを、キューブマップ 6 面全てに描画する場合があるからです。

シャドウのトラブルシューティング

1 つ以上のオブジェクトがシャドウを落としていない場合、次の点をチェックする必要があります。

  • 古いビデオグラフィックスハードウェアはシャドウをサポートしていない場合があります。シャドウを扱うことができる最低限のハードウェア仕様のリストについては、後の説明を参照してください。

  • Shadows can be disabled in the Quality window. Make sure that you have the correct quality level enabled and that shadows are switched on for that setting.

  • シーンのすべての メッシュレンダラー は、 Receive ShadowsCast Shadows とともに正しく設定する必要があります。どちらも、デフォルトで有効になってますが、気づかないうちに無効になっていないかを確認して下さい。

  • 不透明なオブジェクトのみ、シャドウを投影したり受けたりします。ですから、ビルトインの 透明 シェーダーやパーティクルシェーダーを使用したオブジェクトは、シャドウを投影したり受けたりしません。一般的に、フェンス、植生などののようなすき間のあるオブジェクトには、代わりに 透明カットアウト シェーダを使うことができます。カスタム シェーダー はピクセルライライティングと Geometry レンダーキュー を使用しなければなりません。

  • VertexLit シェーダーを用いたオブジェクトはシャドウを受けることができませんが、投影はできます。

  • フォワードレンダリングパス では、もっとも明るいディレクショナルライトだけしかシャドウを投影しないシェーダーもあります (特に、これはUnity のバージョン 4.x 以前の古いビルトインシェーダで発生します)。複数のシャドウを落とすライトを設定したい場合は、代わりに ディファードシェーディング レンダリングパスを使用する必要があります。fullforwardshadows サーフェスシェーダー ディレクティブを使用してすべてのシャドウをサポートする独自のシェーダを有効にすることができます。

シャドウをサポートするハードウエア

ビルトインのシャドウは、Unity でサポートされているほとんどすべてのデバイス上で使用できます。以下のカードが各プラットフォームでサポートされています。

PC (Windows/Mac/Linux)

  • 一般に、すべての GPU がシャドウをサポートします。とても古い GPU で例外が起こる場合があります。(例えば、2005 年に作られた Intel GPUなど)

モバイル

  • iPhone 4 はシャドウをサポートしません。iPhone 4S と iPad 2 以降のモデルはすべて、シャドウをサポートします。
  • Android: Android 4.0 以降で、GL_OES_depth_texture をサポートしていることが必要です。特に、Android Tegra 2/3 ベースの Android デバイスは、サポートしていません。そのため、Android Tegra 2/3 ベースの Android デバイスはシャドウをサポートしません。
  • Windows Phone: シャドウは DX11 クラスの GPU (Adreno 4xx/5xx) のみでサポートされます。

コンソールゲーム機

  • すべてのコンソールはシャドウをサポートします。

  • 2017–06–08 限られた 編集レビュー でパブリッシュされたページ

  • Lighting window statistics、 5.6に追加

GI キャッシュ
関連トピック