/
7.11.2. 低レベル ベイク API でのベイク

This is the documentation for Enlighten.

7.11.2. 低レベル ベイク API でのベイク


概要

このセクションでは、低レベル ベイク API (EnlightenBake ライブラリ) について説明します。

Enlighten SDK は、追加のリソースとして BasicLightmapBaking と呼ばれるサンプル アプリケーションを含んでおり、これらすべてのステップを単純なシーンで実行します。コンパイルされたバイナリを実行することにより、直接光および間接光のライトマップ、アンビエント オクルージョン、GeoRadiosity で確認できる .scene ファイルが生成されます。詳細については、ソース ファイルを参照してください。

キー

ベイク システムの定義

ベイクの初期ステージは以下のとおりです。

  1. 各ベイク システムでどの Enlighten IPrecompInputGeometry インスタンスが必要かを決定します。各ベイク システムは、単一の出力ライトマップを表します。
  2. 必要な各ベイク システムに IBakeInputSystem を作成します。名前を一意に保ちます。
  3. システムの解像度を Enlighten IBakeInputProperties で設定し、独自のライトマップ UV ストリームを作成しない場合は、ここでパッキングもオンにします。IBakeInputSystem::SetBakeProperties を使用して、ベイク システムにプロパティを渡します。
  4. そのシステムの各インスタンスに対し、Enlighten BakeInputMeshInfo オブジェクトを作成し、それぞれのフィールドにデータを入力し、その後 IBakeInputSystem::AddMesh() を呼び出します。
  5. IBakeInputSystem::Finalise() を呼び出し、パッキングが必要だった場合は新しいライトマップ UV ストリームを抽出します。

前のステージの出力は後のステージで変更されることはないため、多くの場合これらのステージは (IncrediBuild のような分散ビルドシステムなどを通して) 並行して実行できます。

以下の図は、1 つの IBakeInputSystem の作成を表しています。必要な出力マップごとに繰り返します。

直接光のベイク

  1. 最初に、すべてのベイク システムを BakeSystemResource オブジェクトに統合する必要があります。このオブジェクトは、他のステージがトレースする KD ツリーの作成に使用されるため、ジオメトリの変化があった場合は更新する必要があります。
  2. 次に、ライティング情報を IBakeInputLighting オブジェクトにコピーします。
  3. ここで、各 BakeSystemResource に対し IBake API により IBakeVisibilityBuffer を作成します。この動作は時間がかかるため、ライトにのみ変化があり、ジオメトリには変化がない場合、前回の実行から IBakeVisibilityBuffer を渡して更新できます。
  4. IBake::BakeSystemDirect() を呼び出して IBakeOutputSystemDirect を作成します。オプションとして、BakeSystemResource オブジェクトを渡し、可視性を意識したポスト プロセス フィルターを適用できるようにします。サイズはフィルター サイズ ベイク プロパティとして設定されます。FP16 形式の最終的な出力テクスチャは、このオブジェクトから取得できます。

以下の図は、2 つの IBakeInputSystem を持つシーンを示しています。実際のシステムの数とはわずかに異なる場合があります。

間接光のベイク

  1. IBakeInputRuntime を作成し、各 Enlighten のシステムの RadSystemCoreInputWorkspace を入力します。
  2. 各 Enlighten のシステムに対し、Enlighten のシステムのすべてのラジオシティ オブジェクトを使用した IBakeInputSystem を作成します。これは、プロセスの後半で Enlighten でライティングされたインスタンスをベイク システムのインスタンスに適合させるために必要です。IBakeInputSystem::SetBakeProperties メソッドに渡される IBakeInputProperties オブジェクトを介して、IBakeInputSystem の解像度を Enlighten ライトマップの解像度に設定します。
  3. 各 Enlighten のシステムに対し、IBake::CreateRuntimeLighting を呼び出して以下から IBakeRuntimeLighting を作成します。
    1. 今作成した IBakeInputSystem
    2. IPrecompSystemDuster
    3. IPrecompPackedSystem
    4. グローバル IBakeInputLighting
  4. 作成した各ランタイム ライティングで以下を行います。
    1. 出力ライトマップを表す各ベイク システムで以下を行います。
      1. IBake::UpdateRuntimeLighting を呼び出し、各ベイク システムのライトとアルベド情報を Enlighten のシステムに適用します。
    2. IBake::FinaliseRuntimeLighting を呼び出します
  5. IBake::RunEnlightenSolver を呼び出します。これは、すべての情報を基にライティング値が決定するまで小規模な Enlighten ランタイムを実行し続けます。これはベイクのすべてのシステムに関する情報を含むため、1 度だけ実行されます。
  6. 各ベイク システムについて、IBake::BakeSystemIndirect を呼び出して、作成される IBakeOutputSystemIndirect から間接光を抽出します。オプションとして、BakeSystemResource オブジェクトと IBakeInputRayOriginPositions に渡し、同一名のベイク プロパティでの可視性を意識したアップサンプリングを可能にすることもできます。

ファイナル ギャザーのライト ベイク

ファイナル ギャザーは、以前に計算した間接および直接ライトマップを使用して、レイ トレーシングを介して洗練された間接ライトマップを作成します。従って、ファイナル ギャザーのベイクは、ベイクされたシーンに対して以前作成されたすべての IBakeOutputSystemIndirect とすべての IBakeOutputSystemDirect オブジェクト、およびそれらに対応する IBakeInputSystem オブジェクトに依存します。また、ベイクされたシーンの IBakeSystemResource オブジェクト (レイトレーシングに使用) と IBakeSolvedRuntime オブジェクトにも依存します。

  1. IBakeInputSystem に対し、IBake::BakeSystemFinalGather を呼び出します。
  2. 結果として生じる IBakeOutputSystemFinalGather オブジェクトから FP16 出力テクスチャを抽出します。

アンビエント オクルージョン

  1. BakeSystemResource に対し、IBake::BakeSystemAO を呼び出します。
  2. 結果として生じる IBakeOutputSystemAO オブジェクトから FP16 出力テクスチャを抽出します。

プローブの直接ライト ベイク

  1. 最初に、ライティング情報を IBakeInputLighting オブジェクトにコピーします。
  2. ここで、IPrecompInputProbeSet で表される各プローブ セットに対し、IBake API によって IBakeVisibilityBuffer を作成します。また、プローブの直接ライティングに影響を与えるすべてのシステムを含む BakeSystemResource オブジェクトにも渡す必要があります。この動作は時間がかかるため、ライトにのみ変化があり、ジオメトリには変化がない場合、前回の実行から IBakeVisibilityBuffer を渡して更新できます。
  3. IBake::BakeProbeSetDirect() を呼び出して IBakeOutputProbeSet を作成します。IBakeOutputProbeSet::GetOutput() メソッドを使用して、プローブ セットのすべてのプローブの SH 係数を取得します。

プローブの間接ライト ベイク

  1. 最初に、間接ライト ベイクで説明されていたステップに従います。
  2. 次に、プローブ セットの各プローブについて、IBakeSolvedRuntimeIBakeSolvedRuntime::GetSolvedProbe() メソッドを使用して SH 係数を取得します。

ベイクされたラジオシティ法線テクスチャ

ベイクされたラジオシティ法線テクスチャは、ベイクされたディレクショナル イラディアンスを使用する際、ランタイムで使用されるきめ細かいシェーディング法線が、ラジオシティ計算で使用されるより粗い法線から外れている場合に、さらに機能を引き出すために必要です。(典型的な例は法線マップのリライティングです)

  1. BakeInputSystem について、すべての Enlighten のシステムに BakeSolvedRuntime を提供する IBake::BakeSystemRadiosityNormal を呼び出します。
  2. 結果として生じる IBakeOutputSystemRadiosityNormal オブジェクトから FP16 出力テクスチャを抽出します。

メッセージ報告およびエラー処理

低レベル プリコンピュート API の使用時に問題が発生した場合は、GeoAttachSystemLoggers/GeoAttachLogger 関数を呼び出してエラーおよび警告メッセージを発行します。その他の情報については、メッセージ報告およびエラー処理モジュールに関する API ドキュメントをご覧ください。

GeoRadiosity を使用したデバッグ

GeoRadiosity を使用してベイクされたライト マップを含むシーンをデバッグするには、低レベル プリコンピュート API の必要なステップに従います。プリコンピュート入力ファイルに加え、 IBakeInputSystemIBakeInputProperties オブジェクトもシリアル化する必要があります。IBakeInputProperties に GUID を割り当てている必要があることに注意してください。この識別子は生成されたライト マップのプロパティをリンクするために使用されます。

低レベル ベイク API に低レベル プリコンピュート API とは異なるチャート UV を渡した場合、シーンの各ジオメトリに対し IBakeInputGeometryUvs クラスのオブジェクトを生成する必要があります。このファイルは、シリアル化された IPrecompInputGeometry オブジェクトと同じファイル名で、拡張子を .buv に変更したものである必要があります。

さらに、ベイクでマテリアルをサポートするために、High Level Build System で使用されるものと同じ XML ベースのマテリアル ファイルを生成する必要があります。存在する各 IPrecompInputGeometry について、メッシュのインデックスをファイル名に追加し、拡張子を .mats に変更したマテリアル ファイルを各メッシュに対して作成できます。たとえば、シリアル化された IPrecompInputGeometryGeom.ig という名称で、2 つのメッシュを含む場合、Geom_0.matsGeom_1.mats という 2 つのマテリアル ファイルを作成する必要があります。これはオプションであり、再構成したシーンでマテリアルを再生成する必要がある場合にのみ必要であることに注意してください。たとえばデバッグの作業で重要な場合などです。

マテリアル ファイルで参照されるテクスチャには、マテリアル ファイルに対する相対ファイルパスが必要です。テクスチャをシリアル化するには GeoRGBXTexture クラスを使用します。

ライト マップにインスタンスを割り当てるシーンのみを抽出できます。ライト マップに個別のメッシュをマッピングするシーンは、現在サポートされていません。

Related content