This is the documentation for Enlighten.

7.1.1.1.2. プリコンピュート データのロード

プリコンピュート データの処理

プリコンピュートで生成されたデータは、RadSystemCore など多くの「不透明」なデータ オブジェクトを含みます。これらは圧縮され、不変のシリアライズ可能なデータ ブロックの場合があります。利便性のため、不透明なオブジェクトはすべて再配置可能です (絶対メモリ ロケーションへのポインターは含みません)。ただし、すべてのプラットフォームでの適切なアライメントを確保し、コンソール ハードウェアにデータをロードする際の正しいエンディアン順を確保するため、ある程度の考慮が必要です。

すべてのブロックには内部にエンディアン順とアライメント制限 (通常 16 バイト) があります。オブジェクトの具体的なアライメント要件については、Enlighten API ドキュメントをご覧ください。同様に、API にはロード後にエンディアン順を切り替えるエンディアン変換関数も含まれています。エンディアンの処理は、このウォークスルーでは無視します。

Enlighten のメモリ アロケーターを使用している場合は、この例で示すように、入力ライティング バッファを作成するためにメモリのアライメントを行うことができます。

Geo::u32 size = Enlighten::CalcInputLightingBufferSize(inputWorkspace);
void* memory = GEO_ALIGNED_MALLOC(size, 16);
InputLightingBuffer* lightingBuffer = Enlighten::CreateInputLightingBuffer(memory, inputWorkspace);

RadSystemCore — コア ラジオシティ データ

Enlighten プリコンピュートで生成されたデータ ブロックをロードする最も簡単な方法は、対応するユーティリティ関数を使用することです。各データ ブロックには常にロードされているコア セクションがあり、ロード関数に渡される sections パラメーターに応じてロードされる可能性のあるオプションのブロックを持つ場合があります。たとえば RadSystemCore ブロックの場合、バウンス データがこのシステムに影響を与えるために必要なオプションのデータ ブロックをロードするには、適切なフラグを渡します。

Geo::u32 sections = loadBounceData ? Enlighten::Iff::ResamplingDataSection : 0;
Enlighten::RadSystemCore* radCore = Enlighten::ReadRadSystemCoreFromFile(coreFilename, sections);   // const Geo::c16*
Enlighten::RadSystemCore* radCore = Enlighten::ReadRadSystemCore(stream, sections);         // Geo::IGeoStream

これによりポインターが返され、Enlighten 解決関数に渡されます。しかし、この手法は ReadRadSystemCore ユーティリティ関数によるメモリ割り当てに依存します。Enlighten のコア関数では、メモリが割り当てられることはありません。さらにメモリを制御する必要がある場合は、SDK が使用するアロケーターを変えることができます (詳細については GeoBase/[GeoMemory.h をご覧ください)。

Enlighten.h で RadSystemCoreRadDataBlock の宣言を確認し、また、EnlightenUtils.inl のソース コードで詳細をご確認ください。

RadProbeSetCore — ライト プローブ データ

上記のように、ユーティリティ関数を使用してメモリにプローブ セット データをロードできます。オプションのプローブ オクトリー データ ブロック (存在する場合) をロードするには、sections パラメーターに適切なフラグを渡します。

Geo::u32 sections = loadOctreeData ? Enlighten::Iff::ProbeSetOctreeDataSection : 0;
Enlighten::RadProbeSetCore* probeSetCore = Enlighten::ReadRadProbeSetCoreFromFile(filename, sections);  // const Geo::c16*
Enlighten::RadProbeSetCore* probeSetCore = Enlighten::ReadRadProbeSetCore(stream, sections);        // Geo::IGeoStream&

InputWorkspace — 入力ライティングに必要なデータ

InputWorkspace オブジェクトをロードするための同様の関数があります。

Geo::u32 sections = loadDynamicData ? Enlighten::Iff::DynamicInputWorkspaceDataSection : 0;
Enlighten::InputWorkspace* iw = Enlighten::ReadInputWorkspaceFromFile(iwFilename, sections);    // const Geo::c16*
Enlighten::InputWorkspace* iw = Enlighten::ReadInputWorkspaces(stream, sections);       // Geo::IGeoStream&

ClusterAlbedoWorkspaceMaterialData — マテリアル アルベド データ

Utilities API にも ClusterAlbedoWorkspaceMaterialData オブジェクトをロードする関数があります。これらのオブジェクトにはオプションのデータ ブロックがないため、sections パラメーターは必要ありません。

Enlighten::ClusterAlbedoWorkspaceMaterialData* cawMaterialData = Enlighten::ReadClusterAlbedoWorkspaceMaterialDataFromFile(cawMaterialDataFilename);    // const Geo::c16*
Enlighten::ClusterAlbedoWorkspaceMaterialData* cawMaterialData = Enlighten::ReadClusterAlbedoWorkspaceMaterialData(stream);                 // Geo::IGeoStream&

RadCubeMapCore — 動的キューブマップ生成に必要なデータ

RadCubeMapCore は、以下のようにロード可能な単一のデータ ブロックを含みます。

Enlighten::RadCubeMapCore* cubeMapCore = Enlighten::ReadRadCubeMapCoreFromFile(cubeMapfilename);    // const Geo::c16*
Enlighten::RadCubeMapCore* cubeMapCore = Enlighten::ReadRadCubeMapCore(stream);             // Geo::IGeoStream&

PrecomputedVisibilityData — プリコンピュートされたディレクショナル ライトの可視性データ

プリコンピュートされた InputWorkspace クラスタのディレクショナル ライトの可視性データは、以下の Enlighten3 ユーティリティ関数を使用して PrecomputedVisibilityData オブジェクトにロードできます。

Enlighten::PrecomputedVisbilityData visData = Enlighten::ReadPrecomputedVisibilityDataFromFile(visibilityFilename);     // const Geo::c16*
Enlighten::PrecomputedVisbilityData visData = Enlighten::ReadPrecomputedVisibilityData(stream);             // Geo::IGeoStream&

ReadXXXFromFile は、より包括的なストリーム ベースの Read 関数を呼び出すだけです。これらは IGeoStream 型であるため、どのようなストレージにも拡張できます。