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
アレイが解放されないようにする必要があります。ラジオシティ データ オブジェクトを直接削除または破壊してはなりません。