This is the documentation for Enlighten.

6.5. ランタイム ラジオシティ更新


Enlighten ランタイムは、ラジオシティを解き、リアルタイムの間接光の更新を行います。計算の内、最もコストのかかる部分をプリコンピュートで行うことにより、ランタイムは Enlighten ランタイム データを使用して、素早くライトマップ、プローブ、キューブマップを更新できます。

Enlighten ランタイムの実行には高レベル ランタイムの使用をお勧めします。これは、Enlighten の最も一般的なユースケースを実行する低レベル ランタイムの上にあるレイヤーです。

ラジオシティ入力

ラジオシティを解くには、以下の入力を提供する必要があります。

  • Enlighten ランタイム データ
  • 少なくとも 1 つの光源からの直接照明、または
  • 環境キューブマップに保存されている空のライティング値 (任意)
  • さまざまな色を有するサーフェスのアルベド カラー (任意)
  • 光を発するサーフェスのエミッシブ カラーおよび強度の値 (任意)

ランタイムの実装を簡単にテストするには、白の環境キューブマップのみでライティングされている簡単なシーンを設定します。

直接光源

エンジンが表示する直接光と一致する間接光を得るには、レンダリングしている同一の光源に関する情報を Enlighten に提供します。

ほとんどのエンジンで、ポイント、スポット、指向性という一般的な光源タイプが使用されています。Enlighten では、これらの標準的なライトの種類を柔軟に実装できます。大きく異なる光線の形状やフォールオフの輪郭に対して Enlighten を使用するには、直接光をカスタマイズします。

光源による影がある場合、影がかかったエリアで不要なバウンス光を避けるため、Enlighten にライト可視性データを提供する必要があります。ディレクショナル ライトの場合、デフォルトで PrecomputedVisibilityDataからこの情報を得ています。プリコンピュートされたディレクショナル可視性データにより、ラジオシティ計算に含まれるサーフェスのみ、影がかかります。

他のライトの種類の影を計算した場合、またはサーフェスの影をラジオシティ計算から除外したい場合は、Enlighten にライト可視性データを指定します。

空のライティング

環境の光源により、空からの光の効果が提供されます。カラーと明度を制御するには、低解像度キューブマップとしてライトの強度の値を指定します。強度は、空からの光で照らされるサーフェスに到達するライトの量を定義します。

すぐに使用するには、キューブマップ全体で一様のカラー/強度を使います。最も正確なライティングを実現するには、空をより高解像度のキューブマップにレンダリングし、低解像度キューブマップにダウンサンプリングします。

Enlighten シーン環境解像度パラメーターで、キューブマップの解像度を定義します。正確性とコストの適切なバランスのため、フェースあたり 8 x 8 テクセルをお勧めします。

キューブマップに低い解像度を使用した場合、特に軸に平行なジオメトリで、まれに空のライティングにノイズが見られることがあります。ノイズを除去するには、少なくともフェースあたり 8 x 8 テクセルの解像度を使用します。

マテリアル カラー

ラジオシティ システムに対し、事前に計算された当初のマテリアル カラー データを指定します。

また、ゲーム実行中にマテリアル カラーを変更することもできます。

ラジオシティ出力

各サーフェスまたはプローブに到達するライトを計算するためにラジオシティを解いた後、Enlighten は、ライティングの結果を簡単にテクスチャに保存できるコンパクトな形式にエンコードします。

GPU シェーダーでレンダラーがテクスチャをサンプリングする間、Enlighten が各テクスチャを更新します。

プローブの補間

ラジオシティ出力には、各プローブでの間接光が含まれています。サーフェスのライティングを提供するには、サーフェスに影響を与え、ライティング値を補間する近くのプローブを見つける必要があります。

これを行うため、Enlighten では 2 つの方法を提供しています。

  • メッシュごと:CPU でメッシュごとに 1 度補間を行い、メッシュのすべてのピクセルで同じライティングを使用します。
  • ピクセルごと:プローブを 3D テクスチャにコピーし、GPU でピクセルごとに 1 度補間を行います。

効率的な更新

ラジオシティを解くのは CPU に負荷がかかるため、大きなワールドで効率的な更新を実現するには、ある程度の最適化が必要です。目に見えるラグを避けるには、100 ミリ秒未満のレイテンシーのラジオシティ更新を目指します。これを実現するには、以下を行います。

  • 計算を非同期で実行し、単一のラジオシティ更新のコストをいくつかのレンダリングされたフレームに分散します。 
  • 各ラジオシティ更新で処理するライトマップ ピクセル、プローブ、キューブマップの数を最小化します。
  • インスタンスが過度に大きいまたは小さいラジオシティ システムにグループ化される原因となる問題に対処します。

効率的にスケジューリングするため、ワールドの計算は非同期に実行できる多数の小さなタスクに分解されます。各システム、プローブ セット、キューブマップに対し、別々のタスクがあります。また、ワールドのうち重要度が低い部分についてライティング更新のレートを下げることもできます。