This is the documentation for Enlighten.

6.4. Enlighten ランタイム データ


プリコンピュートは、システムプローブキューブマップのラジオシティ データを出力します。また、プリコンピュートは各メッシュのライトマップ UVのセットも作成します。 

ゲーム ランタイム、または編集ツールのリアルタイム プレビューで間接光を表示するには、永続ランタイム データが必要です。データはコンパクトで、通常はベイクされたライトマップよりも大幅に少ないディスク容量しか使いません。

ランタイム データはワールド ジオメトリから算出され、いつでも自動で再生成できます。大きなプロジェクトでは、すべてのランタイム データを再生成するのには非常に時間がかかるため、ディスクに永続ランタイム データを保存し、シーンがロードされるたびにプリコンピュートを実行しなくても済むようにすることが必要不可欠です。

永続ランタイム データが生成された後にワールド ジオメトリに変更があった場合、古いデータを使用し続けることはできますが、間接光が不適切になる可能性があります。

データ フロー

以下の図は、Enlighten シーンから永続ランタイム データへのデータ フローを表示しています。

プリコンピュートのプロセスにより、プリコンピュートの結果がシーン ルートの __Build<scene>___ ディレクトリにある precompradiosity サブディレクトリに保存されます。プリコンピュートのプロセスが問題なく完了すると、これらの場所から永続ランタイム データを抽出し、ゲーム ランタイムと編集ツールにロードできるような形式で保存します。

プリコンピュートでは __Build<scene>___ ディレクトリに多くの追加中間データ生成されます。保存する永続ランタイム データのサイズを小さく抑えるため、結果のうち必要な部分だけを抽出します。

__Build<scene>___ にエクスポートされた Enlighten シーンと中間データが使用されるのは、プリコンピュートデバッグ ツールのみであり、ランタイム ラジオシティ更新では必要とされません。

プロトタイプの実装では、___Build<scene>___ ディレクトリから直接ゲーム ランタイムにファイルをロードする可能性もありますが、本番の実装では現実的ではありません。

データ レイアウト

Enlighten ランタイム データは、各システム、プローブ セット、キューブマップについて個別のオブジェクトにグループ化されます。

ゾーンの自動生成されたシステムを見つけるには、IPrecompGeneratedSystems オブジェクトをロードします。

// path: "precomp/[zone name].gs"
const Enlighten::IPrecompGeneratedSystems* generatedSystems
    = Geo::LoadInterfaceCompressed<Enlighten::IPrecompGeneratedSystems>(path);
 
for (Geo::s32 systemIndex = 0; systemIndex != generatedSystems->GetNumSystems(); ++systemIndex)
{
    const Enlighten::IPrecompInputSystem* inputSystem = generatedSystems->GetSystem(systemIndex);
    Geo::GeoFileString systemName(inputSystem->GetName());
 
    // このシステムに関連するラジオシティ データを抽出します
}

ゾーンの自動生成されたプローブ セットを見つけるには、IPrecompOutputProbeOctree オブジェクトをロードします。

// path: "precomp/[zone name].opo"
const Enlighten::IPrecompOutputProbeOctree* probeOctree
    = Geo::LoadInterfaceCompressed<Enlighten::IPrecompOutputProbeOctree>(path);
 
for (Geo::s32 probeSetIndex = 0; probeSetIndex != probeOctree->GetNumProbeSets(); ++probeSetIndex)
{
    Geo::GeoFileString probeSetName = Geo::GeoFileString::Printf("%s_%d", probeOctree->GetName(), probeSetIndex);
 
    // このプローブ セットに関連するラジオシティ データを抽出します
}

Enlighten シーンキューブマップを追加する際、プリコンピュートの後にランタイム データを抽出できるよう、名前を記憶しておきます。

明示的システム グループまたは手動で配置されたプローブを使用する場合、同じようにシステムとプローブ セットの名前を記憶しておきます。

単一のゾーンのすべてのシステム、プローブ セット、キューブマップを 1 つのまとまりに組み合わせ、ランタイム ファイル システムを効率的にロードすることをお勧めします。 

以下は、1 つのまとまりのデータ レイアウトの実践的な例です。

  • 各ライトマップ UV セット
  • ライトマップによりライティングされた各システム
  • プローブによりライティングされた各システム
  • ライトマップによりライティングされた各インスタンス
    • インスタンス GUID
    • ライトマップ UV セットのポインター
    • ライトマップ UV トランスフォーム
    • ライトマップによりライティングされたシステムのインデックス
  • 各プローブセット
  • 各キューブマップで

ディスク上の永続ランタイム データの各まとまりを圧縮し、容量を節約してロード時間を短縮することをお勧めします。

大規模なチーム

大規模なチームで Enlighten を本番運用する場合、ランタイム データ生成について 2 つのワークフローを考慮することをお勧めしています。どちらもプリコンピュートの実行が必要ですが、要件は各々大きく異なります。

1.アーティストが編集ツールでワールド (の一部) の Enlighten 構成をイテレーションできるようにします。 

  • アーティストは、ワールドのうち自分に関係する部分のみをプリコンピュートすることを選び、時間を節約します。
  • アーティストは、ワールドに大幅な変更を加えた後にプリコンピュートを実施することを選びます。
  • アーティストはライトマップ UV のみを素早く生成し、ライトマップ レイアウトをプレビューできます。
  • アーティストが処理中の変更をワールドに含めると、間接光への影響を確認できるようになります。

すぐに使用するには、上のワークフローを最初に実行します。

2.レビュー用のパッケージ化されたビルドを作成します。

  • 理想的には、ビルド ファームでの無人分散継続ビルドの一部として自動化します。
  • ワールドのすべての部分を同時にプリコンピュートします。
  • 常にワールドの最新バージョン/構成を使用します。
  • ワールドの各バージョンに対してはプリコンピュートを 1 度だけ実行します。
  • 最新のビルド結果は、ワールドの各バージョンに紐づけられた中央リポジトリに保存します。

この分離には、以下のようなメリットがあります。

  • パッケージ化されたゲーム ビルドでは、Enlighten ランタイム データが常に信頼できるものになります。プロセスの自動化によって、ヒューマン エラーが最小になります。
  • ワールドに対して作業するメンバーが多い大規模なチームでは、ワールドの変更の影響をプレビューしたい場合を除き、各チームメンバーがローカルでプリコンピュートを実行する必要はありません。

データのデバッグ

プリコンピュートにより、ランタイムをデバッグするために使用できるデバッグ データが生成されます。このデータは、たとえば GeoRadiosity 視覚化サービスで使用でき、独自の視覚化を作成するために使用します。

詳細についてはプリコンピュートのデバッグをご覧ください。