This is the documentation for Enlighten.

6.4.2. 永続ラジオシティ データ

プリコンピュートでは、システム、プローブ セット、キューブマップでグループ化されたラジオシティ データが出力されます。

各システムのラジオシティ データは、さらにオブジェクトセクションに分けられ、ランタイムのさまざまな機能を有効にします。

ラジオシティ データの抽出

以下の例は、ラジオシティ データの抽出方法を示しています。

ランタイムのメモリ使用とロード時間を最小化するため、以下の例ではデフォルト セクションでEnlighten ランタイムの中核的な機能を有効にするためのデータのみを含むよう指定しています。

 システム向けにラジオシティ データを抽出する方法は以下のとおりです。

// path: "radiosity/[system id].rc.sse"
const Enlighten::RadSystemCore* radiosityCore
    = Enlighten::ReadRadSystemCoreFromFile(path, Enlighten::Iff::RadSystemCoreDefaultSections);
 
// path: "radiosity/[system id].iw.sse"
const Enlighten::InputWorkspace* inputWorkspace
    = Enlighten::ReadInputWorkspaceFromFile(path, Enlighten::Iff::InputWorkspaceDefaultSections);
 
// path: "radiosity/[system id].vis"
const Enlighten::PrecomputedVisibilityData* directionalVisibility
    = Enlighten::ReadPrecomputedVisibilityDataFromFile(path);
 
// path: "radiosity/[system id].rnt"
Geo::GeoRGBXTexture* radiosityNormals = LoadInterface<Geo::GeoRGBXTexture>(path);

このシステム内のインスタンスのライティングにプローブが使用されている場合、システムにはライトマップ UV データがありません。

そのようなシステムでは、ラジオシティ コアラジオシティ法線は必要はありません。

プローブ セット向けにラジオシティ データを抽出する方法は以下のとおりです。

// path: radiosity/[probe set id].ps.sse
const Enlighten::RadProbeSetCore* radiosityCore
    = Enlighten::ReadRadProbeSetCoreFromFile(path, Enlighten::Iff::RadProbeSetCoreDefaultSections);

キューブ マップ向けにラジオシティ データを抽出する方法は以下のとおりです。

// path: radiosity/[cubemap id].rcm.sse
const Enlighten::RadCubeMapCore* radiosityCore
    = Enlighten::ReadRadCubeMapCoreFromFile(path);

永続ラジオシティ データ

ディスクでのデータ管理を簡素化するため、ラジオシティ データはファイルを集約して数を少なくすることをお勧めします。典型的な実装としては、同じゾーンのすべてのデータを単一のファイルに連結します。

コンソールやモバイル デバイスなど、制約があるターゲット プラットフォームにラジオシティ データをロードする際、メモリ使用量とロード時間はきわめて重要です。ロード時間を最小限まで短縮するには、それぞれの永続ラジオシティ データ オブジェクトをフラット バッファとして保存します。データをロードする際のメモリ アロケーションは必要ありません。

以下の例は、IGeoStream型の stream にラジオシティ データをフラット バッファとして書き込む方法を示しています。ファイルに書き込むには GeoFileStreamを、バッファに書き込むには GeoMemoryStreamを使用します。

システム向けにラジオシティ データを書き込む方法は以下のとおりです。

Geo::u64 radiosityCoreOffset = stream.GetPosition();
Enlighten::WriteRadSystemCoreForInPlace(radiosityCore, stream);
Geo::u64 radiosityCoreSize = stream.GetPosition() - radiosityCoreOffset;
 
Geo::u64 inputWorkspaceOffset = stream.GetPosition();
Enlighten::WriteInputWorkspaceForInPlace(inputWorkspace, stream);
Geo::u64 inputWorkspaceSize = stream.GetPosition() - inputWorkspaceOffset;
 
Geo::u64 directionalVisibility = stream.GetPosition();
Enlighten::WritePrecomputedVisibilityDataForInPlace(directionalVisibility, stream);
Geo::u64 directionalVisibilitySize = stream.GetPosition() - directionalVisibilityOffset;
 
Geo::u64 radiosityNormalsOffset = stream.GetPosition();
stream.Write(radiosityNormals->GetTextureData(), radiosityNormals->GetTextureData() + radiosityNormals->GetWidth() * radiosityNormals->GetHeight());
Geo::u64 radiosityNormalsCount = radiosityNormals->GetWidth() * radiosityNormals->GetHeight();

プローブ セット向けにラジオシティ データを書き込む方法は以下のとおりです。

Geo::u64 radiosityCoreOffset = stream.GetPosition();
Enlighten::WriteRadProbeSetCoreForInPlace(radiosityCore, stream);
Geo::u64 radiosityCoreSize = stream.GetPosition() - radiosityCoreOffset;

キューブマップ向けにラジオシティ データを書き込む方法は以下のとおりです。

Geo::u64 radiosityCoreOffset = stream.GetPosition();
Enlighten::WriteRadCubeMapCoreForInPlace(radiosityCore, stream);
Geo::u64 radiosityCoreSize = stream.GetPosition() - radiosityCoreOffset;

ラジオシティ データのロード

以下の例は、バイト アレイからラジオシティ データをロードする方法を示しています。

Enlighten::RadSystemCore* radiosityCore = Enlighten::ReadRadSystemCoreInPlace(data + radiosityCoreOffset, radiosityCoreSize);
Enlighten::InputWorkspace* inputWorkspace = Enlighten::ReadInputWorkspaceInPlace(data + inputWorkspaceOffset, inputWorkspaceSize);
Enlighten::PrecomputedVisibilityData* directionalVisibility = Enlighten::ReadPrecomputedVisibilityDataInPlace(data + directionalVisibilityOffset, directionalVisibilitySize);
Geo::GeoRGBXTextureElement* radiosityNormals = reinterpret_cast<Geo::GeoRGBXTextureElement*>(data + radiosityNormalsOffset);
Enlighten::RadProbeSetCore* radiosityCore = Enlighten::ReadRadProbeSetCoreInPlace(data + radiosityCoreOffset, radiosityCoreSize);
Enlighten::RadCubeMapCore* radiosityCore = Enlighten::ReadRadCubeMapCoreInPlace(data + radiosityCoreOffset, radiosityCoreSize);

ラジオシティ データ オブジェクトは、data アレイ内にインプレースで構築されます。data アレイを 16 バイト アライメントで割り当てる必要があります。

ラジオシティ データの使用中は、data アレイが解放されないようにする必要があります。ラジオシティ データ オブジェクトを直接削除または破壊してはなりません。