ライトは 2 つの方法のいずれかでレンダリングすることができます。
ピクセルライティング は、すべてのスクリーンピクセルを個別に計算します。レンダリングに時間がかかりますが、頂点ライティングで不可能なエフェクトのいくつかを行うことができます。法線マッピング、ライトのクッキー、リアルタイムの影はピクセルライト用だけにレンダリングされます。さらに、スポットライトの形状やポイントライトのハイライトは、ピクセルモードでレンダリングした方がずっと見栄えが良くなります。
頂点ライティング は、メッシュの頂点だけで照明を計算し、頂点間のサーフェス上では、頂点の値を補間します。ライティングエフェクトの中には、頂点ライティングにサポートされないものもありますが、処理のオーバーヘッドの面では、2 つを比べるとこちらの方が間違いなく有利です。また、古いグラフィックカードでは、頂点ライティングが、唯一利用可能な方法である場合があります。
ライトは、レンダリング速度に大きな影響を与えます。ライティングの品質はフレームレートと反比例します。ピクセルライトは頂点ライトよりもレンダリングのオーバーヘッドがはるかに高いので、Unity は最も明るいライトだけをピクセル単位でレンダリングし、残りを頂点ライトとしてレンダリングします。ピクセルライトの最大数は、スタンドアロンビルドターゲットに対し Quality ウィンドウで設定することができます。
Render Mode プロパティーを使って、あるライトを優先的にピクセルライトとしてレンダリングすることができます。ライトをピクセルライトとしてレンダリングするかどうかを決定するときに、Important モードに設定されたライトは、より高い優先順位でピクセルライトになります。 Auto (デフォルト) に設定した場合は、指定されたオブジェクトがどれだけそのライトの影響を受けるかに基づいて自動的にライトは分類されます。ピクセルライトとしてレンダリングするライトは、個々のオブジェクトベースで決定されます。
詳細については、グラフィックスパフォーマンスの最適化 のページを参照してください。
Lighting ウィンドウの一番下には統計データが表示され、ランタイムのパフォーマンスに関する重要なマトリクスを示しています。詳細は Lighting ウィンドウ を参照してください。
リアルタイムの影はレンダリングのオーバーヘッドが非常に高いので、使用する際には注意が必要です。最初に、投影する可能性のあるオブジェクトをシャドウマップへレンダリングしておきます。その後、影を受ける可能性のあるオブジェクトがレンダリングされる時に、このシャドウマップが使われます。影を有効にすると、上述のピクセル/頂点ライトよりも、さらに大きな影響をパフォーマンスに与えます。
ソフトシャドウは、ハードシャドウよりも大きなレンダリングのオーバーヘッドを持っていますが、これは GPU に影響を与えるだけで、CPUに多くの余分な作業は発生しません。
Quality ウィンドウには Shadow Distance 値が含まれています。カメラからこの距離よりも離れているオブジェクトは、影を全く描画しないでレンダリングされます。遠くのオブジェクトの影は、通常は気づかれることはありません。そのため、これはレンダリングする影の数を減らすために有用な最適化です。
ディレクショナルライト特有の問題は、1 つのライトがシーン全体を照らすことができてしまうことです。つまり、シャドウマップがしばしば、シーンの大部分をいっぺんにカバーし、パースペクティブエイリアシングとして知られている問題が発生する影ができやすいことです。簡単に言えば、 パースペクティブエイリアシングでは、カメラの近くに表示されるシャドウマップのピクセルは遠くのものに比べて、拡大されて「分厚く」見えます。この影響を低減するために、単にシャドウマップの解像度を上げることもできますが、その結果、解像度の低いシャドウマップで十分よく見えてた距離の離れた領域で、レンダリングのリソースが無駄に消費されてしまいます。
したがって、問題をうまく解決するには、カメラからの距離が離れて解像度が低下したら、別のシャドウマップを使います。これらの別のマップは カスケード として知られています。Quality ウィンドウから、0、2、4 つのカスケード (Cascades) を選択することができます。Unity は、カメラの錐台内のカスケードの位置を計算します。カスケードは、ディレクショナルライトに対してのみ有効になっていることに注意してください。詳細は、ディレクショナルライトのシャドウ を参照してください。
マップのサイズを計算する際の最初のステップは、ライトが照射できるスクリーンビューの領域を決定することです。 ディレクショナルライトに関しては、スクリーン全体を照らすことができますが、スポットライトやポイントライトに関しては、その領域はライトの広がりの形状 (ポイントライトの球形、やスポットライトの円錐形) がスクリーン上へ投影したものです。投影された形状は、スクリーン上にピクセル単位の特定の幅と高さを持ちます。この2つの値の大きい方が、ライトの “ピクセルサイズ” です。
シャドウマップの解像度が High に設定されている場合 (Quality ウィンドウで設定)、シャドウマップのサイズは以下のように計算されます。
グラフィックスカードが、512MB 以上のビデオメモリを有する場合、上のシャドウマップの限度は、ディレクショナルライトでは 4096、スポットライトでは 2048、ポイントライトでは 1024 まで増加されます。
Medium の影の解像度では、シャドウマップのサイズは High の半分の値であり、Low では、High の 4分の 1 のサイズになります。
ポイントライトは、他のタイプよりもサイズの限界が低く設定されています。なぜなら、キューブマップを影に使用するからです。つまり、この解像度でキューブマップの 6 面がいっぺんにビデオメモリに保持されなければならないからです。描画するのにも非常に負荷がかかります。影を投影する可能性のあるものを、キューブマップ 6 面全てに描画する場合があるからです。
1 つ以上のオブジェクトが影を落としていない場合、次の点をチェックする必要があります。
古いビデオグラフィックスハードウェアは影をサポートしていない場合があります。影を扱うことができる最低限のハードウェア仕様のリストについては、後の説明を参照してください。
影は Quality ウィンドウで無効にすることができます。Quality ウィンドウで正しい品質レベルが有効になっていること、影が有効になっていることを確認してください。
シーンのすべての メッシュレンダラー は、 Receive Shadows と Cast Shadows とともに正しく設定する必要があります。どちらも、デフォルトで有効になってますが、気づかないうちに無効になっていないかを確認して下さい。
不透明なオブジェクトのみ、影を投影したり受けたりします。ですから、ビルトインの 透明 シェーダーやパーティクルシェーダーを使用したオブジェクトは、影を投影したり受けたりしません。一般的に、フェンス、植生などののようなすき間のあるオブジェクトには、代わりに 透明カットアウト シェーダーを使うことができます。カスタム シェーダー はピクセルライライティングと Geometry レンダーキュー を使用しなければなりません。
VertexLit シェーダーを用いたオブジェクトは影を受けることができませんが、投影はできます。
フォワードレンダリングパス では、もっとも明るいディレクショナルライトだけしか影を投影しないシェーダーもあります (特に、これはUnity のバージョン 4.x 以前の古いビルトインシェーダで発生します)。複数の影を落とすライトを設定したい場合は、代わりに ディファードシェーディング レンダリングパスを使用する必要があります。fullforwardshadows
サーフェスシェーダー ディレクティブを使用してすべての影をサポートする独自のシェーダを有効にすることができます。
ビルトインの影は、Unity でサポートされているほとんどすべてのデバイス上で使用できます。以下のカードが各プラットフォームでサポートされています。
GL_OES_depth_texture
をサポートしていることが必要です。特に、Android Tegra 2/3 ベースの Android デバイスは、サポートしていません。そのため、Android Tegra 2/3 ベースの Android デバイスは影をサポートしません。2017–06–08 Page published
Lighting window statistics、 5.6に追加