クラスタードライティング
クラスタードライティングは、PlayCanvas Engine v1.56以降にデフォルトで有効になっています。古いライティングシステムは、しばらくの間Engineに残りますが、将来のマイナーリリースで廃止される予定です。
ライトは、アプリケーションにリアリズムを加える良い方法です。しかし、リアルタイムライトは、大量のシャドウを投げるライトが多数存在する場合など、ランタイムパフォーマンスコストを引き起こすことがあります。
パフォーマンスのコストを削減するための解決策の一部は、個々のメッシュに影響を与えるライトの数を制限することです。これは、通常は各オブジェクトに近接したライトを見つけて使用することによって実装されます。しかし、この戦略には複数のデメリットがあります。
- 各オブジェクトが異なるセットのライトを使用するため、カスタムシェーダーをコンパイルする必要があります。
- この戦略が効果的になるには、大きなオブジェクトを小さなオブジェクトに分割する必要があります。
- 大量のシャドウキャストライトは、影マップで使用される可能性のあるテクスチャスロットの使用可能数を超過する可能性があります。
これらの問題に対処するために、PlayCanvasはクラスタードライティングソリューションを使用して、Omni Lights および Spot Lights の高パフォーマンス実装を提供します。ライトに関する情報をテクスチャに格納し、GPUがシェーディングフラグメントに近接するライトのみを簡単に使用できるようにします。クラスタードライティングの複数の利点があります。
- シェーダーは、複数のライトを処理できるため、シーンからライトが追加または削除されたときにシェーダーを再コンパイルする必要はありません。
- (Shadow および Cookiesを含む)多数のライトがシーンで使用できるため、ピクセルごとに近接するライトのみが評価されるため使います。
Directional Lights は、すべてのオブジェクトに影響を及ぼすため、クラスクラスタードライティングソリューションは使用しません。
実装の概要
以下の手順は、クラスタードライティングの実装の基本的な概要を提供します。
-
カメラの錐台によってライトのリストを評価することで、カメラに対して可視なライトのリストを削除します。
-
可視なすべてのライトの軸に沿った境界上に、ワールドスペース3Dグリッドを配置します。
-
3Dグリッドの各セルは、それと交差するライトのインデックスを格納します。CPU上では、この情報は毎フレーム更新され、任意の位置に影響を与えるライトのリストを取得することができます。この情報はテクスチャに格納され、GPUで使用可能になります。
-
すべての可視ライトのプロパティは、別のテクスチャに格納されるため、GPUでアクセス可能になります。
-
シャドウマップとCookieテクスチャは、個々のテクスチャではなくアトラスにレンダリングされるため、同時にすべてのテクスチャをシェーダーで使用できます。
-
フラグメントシェーダーでライティングを評価する際に、フラグメントワールドスペース位置を使用して3Dグリッドのセルにアクセスし、格納されたライトを評価します。
エディタオプション
クラスタードライティングのオプションは、エディタ設定の「レンダリング」の下で見つけることができます。
これにより、以前のライティングシステムを使用する必要がある場合にクラスタードライティングを無効にしたり、以下のtune performance and featuresを調整したりすることができます。