This is the documentation for Enlighten.
7.11.2. 低レベル ベイク API でのベイク
概要
このセクションでは、低レベル ベイク API (EnlightenBake
ライブラリ) について説明します。
Enlighten SDK は、追加のリソースとして BasicLightmapBaking
と呼ばれるサンプル アプリケーションを含んでおり、これらすべてのステップを単純なシーンで実行します。コンパイルされたバイナリを実行することにより、直接光および間接光のライトマップ、アンビエント オクルージョン、GeoRadiosity で確認できる .scene
ファイルが生成されます。詳細については、ソース ファイルを参照してください。
キー
ベイク システムの定義
ベイクの初期ステージは以下のとおりです。
- 各ベイク システムでどの
Enlighten IPrecompInputGeometry
インスタンスが必要かを決定します。各ベイク システムは、単一の出力ライトマップを表します。 - 必要な各ベイク システムに
IBakeInputSystem
を作成します。名前を一意に保ちます。 - システムの解像度を
Enlighten IBakeInputProperties
で設定し、独自のライトマップ UV ストリームを作成しない場合は、ここでパッキングもオンにします。IBakeInputSystem::SetBakeProperties
を使用して、ベイク システムにプロパティを渡します。 - そのシステムの各インスタンスに対し、
Enlighten BakeInputMeshInfo
オブジェクトを作成し、それぞれのフィールドにデータを入力し、その後IBakeInputSystem::AddMesh()
を呼び出します。 IBakeInputSystem::Finalise()
を呼び出し、パッキングが必要だった場合は新しいライトマップ UV ストリームを抽出します。
前のステージの出力は後のステージで変更されることはないため、多くの場合これらのステージは (IncrediBuild
のような分散ビルドシステムなどを通して) 並行して実行できます。
以下の図は、1 つの IBakeInputSystem
の作成を表しています。必要な出力マップごとに繰り返します。
直接光のベイク
- 最初に、すべてのベイク システムを
BakeSystemResource
オブジェクトに統合する必要があります。このオブジェクトは、他のステージがトレースする KD ツリーの作成に使用されるため、ジオメトリの変化があった場合は更新する必要があります。 - 次に、ライティング情報を
IBakeInputLighting
オブジェクトにコピーします。 - ここで、各 BakeSystemResource に対し IBake API により
IBakeVisibilityBuffer
を作成します。この動作は時間がかかるため、ライトにのみ変化があり、ジオメトリには変化がない場合、前回の実行からIBakeVisibilityBuffer
を渡して更新できます。 IBake::BakeSystemDirect()
を呼び出してIBakeOutputSystemDirect
を作成します。オプションとして、BakeSystemResource
オブジェクトを渡し、可視性を意識したポスト プロセス フィルターを適用できるようにします。サイズはフィルター サイズ ベイク プロパティとして設定されます。FP16 形式の最終的な出力テクスチャは、このオブジェクトから取得できます。
以下の図は、2 つの IBakeInputSystem
を持つシーンを示しています。実際のシステムの数とはわずかに異なる場合があります。
間接光のベイク
IBakeInputRuntime
を作成し、各 Enlighten のシステムのRadSystemCore
とInputWorkspace
を入力します。- 各 Enlighten のシステムに対し、Enlighten のシステムのすべてのラジオシティ オブジェクトを使用した
IBakeInputSystem
を作成します。これは、プロセスの後半で Enlighten でライティングされたインスタンスをベイク システムのインスタンスに適合させるために必要です。IBakeInputSystem::SetBakeProperties
メソッドに渡されるIBakeInputProperties
オブジェクトを介して、IBakeInputSystem
の解像度を Enlighten ライトマップの解像度に設定します。 - 各 Enlighten のシステムに対し、
IBake::CreateRuntimeLighting
を呼び出して以下からIBakeRuntimeLighting
を作成します。 - 作成した各ランタイム ライティングで以下を行います。
- 出力ライトマップを表す各ベイク システムで以下を行います。
IBake::UpdateRuntimeLighting
を呼び出し、各ベイク システムのライトとアルベド情報を Enlighten のシステムに適用します。
IBake::FinaliseRuntimeLighting
を呼び出します
- 出力ライトマップを表す各ベイク システムで以下を行います。
IBake::RunEnlightenSolver
を呼び出します。これは、すべての情報を基にライティング値が決定するまで小規模な Enlighten ランタイムを実行し続けます。これはベイクのすべてのシステムに関する情報を含むため、1 度だけ実行されます。- 各ベイク システムについて、
IBake::BakeSystemIndirect
を呼び出して、作成されるIBakeOutputSystemIndirect
から間接光を抽出します。オプションとして、BakeSystemResource
オブジェクトとIBakeInputRayOriginPositions
に渡し、同一名のベイク プロパティでの可視性を意識したアップサンプリングを可能にすることもできます。
ファイナル ギャザーのライト ベイク
ファイナル ギャザーは、以前に計算した間接および直接ライトマップを使用して、レイ トレーシングを介して洗練された間接ライトマップを作成します。従って、ファイナル ギャザーのベイクは、ベイクされたシーンに対して以前作成されたすべての IBakeOutputSystemIndirect
とすべての IBakeOutputSystemDirect
オブジェクト、およびそれらに対応する IBakeInputSystem
オブジェクトに依存します。また、ベイクされたシーンの IBakeSystemResource
オブジェクト (レイトレーシングに使用) と IBakeSolvedRuntime
オブジェクトにも依存します。
- 各
IBakeInputSystem
に対し、IBake::BakeSystemFinalGather
を呼び出します。 - 結果として生じる
IBakeOutputSystemFinalGather
オブジェクトから FP16 出力テクスチャを抽出します。
アンビエント オクルージョン
- 各
BakeSystemResource
に対し、IBake::BakeSystemAO
を呼び出します。 - 結果として生じる
IBakeOutputSystemAO
オブジェクトから FP16 出力テクスチャを抽出します。
プローブの直接ライト ベイク
- 最初に、ライティング情報を
IBakeInputLighting
オブジェクトにコピーします。 - ここで、
IPrecompInputProbeSet
で表される各プローブ セットに対し、IBake API によってIBakeVisibilityBuffer
を作成します。また、プローブの直接ライティングに影響を与えるすべてのシステムを含むBakeSystemResource
オブジェクトにも渡す必要があります。この動作は時間がかかるため、ライトにのみ変化があり、ジオメトリには変化がない場合、前回の実行からIBakeVisibilityBuffer
を渡して更新できます。 IBake::BakeProbeSetDirect()
を呼び出してIBakeOutputProbeSet
を作成します。IBakeOutputProbeSet::GetOutput()
メソッドを使用して、プローブ セットのすべてのプローブのSH
係数を取得します。
プローブの間接ライト ベイク
- 最初に、間接ライト ベイクで説明されていたステップに従います。
- 次に、プローブ セットの各プローブについて、
IBakeSolvedRuntime
のIBakeSolvedRuntime::GetSolvedProbe()
メソッドを使用してSH
係数を取得します。
ベイクされたラジオシティ法線テクスチャ
ベイクされたラジオシティ法線テクスチャは、ベイクされたディレクショナル イラディアンスを使用する際、ランタイムで使用されるきめ細かいシェーディング法線が、ラジオシティ計算で使用されるより粗い法線から外れている場合に、さらに機能を引き出すために必要です。(典型的な例は法線マップのリライティングです)
- 各
BakeInputSystem
について、すべての Enlighten のシステムにBakeSolvedRuntime
を提供するIBake::BakeSystemRadiosityNormal
を呼び出します。 - 結果として生じる
IBakeOutputSystemRadiosityNormal
オブジェクトからFP16
出力テクスチャを抽出します。
メッセージ報告およびエラー処理
低レベル プリコンピュート API の使用時に問題が発生した場合は、GeoAttachSystemLoggers/GeoAttachLogger
関数を呼び出してエラーおよび警告メッセージを発行します。その他の情報については、メッセージ報告およびエラー処理モジュールに関する API ドキュメントをご覧ください。
GeoRadiosity を使用したデバッグ
GeoRadiosity を使用してベイクされたライト マップを含むシーンをデバッグするには、低レベル プリコンピュート API の必要なステップに従います。プリコンピュート入力ファイルに加え、 IBakeInputSystem
と IBakeInputProperties
オブジェクトもシリアル化する必要があります。IBakeInputProperties
に GUID を割り当てている必要があることに注意してください。この識別子は生成されたライト マップのプロパティをリンクするために使用されます。
低レベル ベイク API に低レベル プリコンピュート API とは異なるチャート UV を渡した場合、シーンの各ジオメトリに対し IBakeInputGeometryUvs
クラスのオブジェクトを生成する必要があります。このファイルは、シリアル化された IPrecompInputGeometry
オブジェクトと同じファイル名で、拡張子を .buv
に変更したものである必要があります。
さらに、ベイクでマテリアルをサポートするために、High Level Build System で使用されるものと同じ XML ベースのマテリアル ファイルを生成する必要があります。存在する各 IPrecompInputGeometry
について、メッシュのインデックスをファイル名に追加し、拡張子を .mats
に変更したマテリアル ファイルを各メッシュに対して作成できます。たとえば、シリアル化された IPrecompInputGeometry
が Geom.ig
という名称で、2 つのメッシュを含む場合、Geom_0.mats
と Geom_1.mats
という 2 つのマテリアル ファイルを作成する必要があります。これはオプションであり、再構成したシーンでマテリアルを再生成する必要がある場合にのみ必要であることに注意してください。たとえばデバッグの作業で重要な場合などです。
マテリアル ファイルで参照されるテクスチャには、マテリアル ファイルに対する相対ファイルパスが必要です。テクスチャをシリアル化するには GeoRGBXTexture
クラスを使用します。
ライト マップにインスタンスを割り当てるシーンのみを抽出できます。ライト マップに個別のメッシュをマッピングするシーンは、現在サポートされていません。