This is the documentation for Enlighten.
6.4.3. マテリアル カラー データ
マテリアルのアルベド カラーは、マテリアルによりサーフェスから反射される光の色を示します。マテリアルのエミッシブ カラーは、マテリアルによりサーフェスから反射される光の色と強度を示します。
ラジオシティ計算に含まれるサーフェスのみが、光を反射または発することができます。
ほとんどのマテリアルは、ゲーム実行中に変化しないアルベド カラーを有しており、静的アルベドと呼びます。ゲーム実行中に変化しない光をサーフェスが発する場合、これを静的エミッシブと呼びます。ランタイムのコストを最小化するには、編集ツールで静的アルベド カラーとエミッシブ カラーを計算し、永続ラジオシティ データとともに、AlbedoBuffer と EmissiveBuffer オブジェクトとして保存します。
ラジオシティ システム内のサーフェスにカラーを指定には、以下が必要です。
- ジオメトリ オブジェクトを参照するインスタンス オブジェクトのインスタンス ID
- ジオメトリ オブジェクト内のメッシュ オブジェクトの933298220
- メッシュ オブジェクトで指定されたマテリアル ID
また、プリコンピュートの後に933298220を一部抽出する必要もあります。
正確なライティングのため、レンダリングされたマテリアルに適合するアルベド カラーとエミッシブ カラーを使用します。これは、レンダリングされたマテリアルをサンプリングして自動計算することをお勧めします。
一部のケースでは、サーフェス全体で933298220を使用すれば十分な近似値が得られます。最も正確で真に迫った間接光を実現するには、レンダリングされたメッシュのサーフェスの933298220に対して933298220ことをお勧めします。
インスタンス ID
サーフェスのマテリアル カラーを計算するには、どのエンジン メッシュがインスタンス ID と関連するかを把握している必要があります。インスタンス オブジェクトと関連するオリジナルのエンジン メッシュを簡単に識別するために、インスタンス GUIDを使用します。
ラジオシティ システムの各インスタンス オブジェクトのインスタンス ID とインスタンス GUID を抽出するには、IPrecompInputSystem オブジェクトをロードします。
// path: "precomp/[system name].is" const Enlighten::IPrecompInputSystem* inputSystem = Geo::LoadInterfaceCompressed<Enlighten::IPrecompInputSystem>(path);
IPrecompInputSystem::GetInstanceArray を呼び出して、各インスタンスの情報を取得します。
各 PrecompInputInstance オブジェクトは、システム内のインスタンス オブジェクトに対応します。
for(Geo::s32 i = 0; i != inputSystem->GetInstanceCount(); ++i) { const Enlighten::PrecompInputInstance& inputInstance = inputSystem->GetInstanceArray()[i]; }
PrecompInputInstance::m_InstanceGuid はインスタンス GUIDを含み、PrecompInputInstance::m_Id は対応するインスタンス ID を含みます。
デフォルトでは、Enlighten が自動的にIPrecompInputSystem::GetInstanceCount と同じサイズのアレイに対し、インデックスであるインスタンス ID を割り当てます。これにより、インスタンス ID でインデックスが付与されたアレイにインスタンス GUID を簡単に保存できるようになります。
メッシュ インデックス
単一のエンジン メッシュが複数のメッシュ オブジェクトを生成する場合、ジオメトリ オブジェクト内のメッシュ オブジェクトのインデックスを使用してサーフェスを識別します。
各ジオメトリ オブジェクトに 1 つだけメッシュを追加する場合、メッシュ インデックスは必ず 0 になります。
マテリアル ID
多くの編集ツールでは、エンジン マテリアルを割り当てることによりアーティストがメッシュのカラーを設定できるようにしています。サーフェスのマテリアル カラーを計算するには、どのエンジン マテリアルがサーフェスと関連するかを把握している必要があります。
エンジン メッシュが、それぞれ異なるゲーム エンジン マテリアルに割り当て可能な部分により構成されている場合、各部分のメッシュ オブジェクトに対して 1 つのマテリアル ID を追加します。
各メッシュ オブジェクトに 1 つだけマテリアルを追加する場合、マテリアル ID は必ず 0 になります。
以下の例は、インスタンス ID によりインデックス化されたインスタンス ID のアレイを使用して、サーフェスと関連するエンジン マテリアルの間のマッピングを作成する擬似コードを示しています。
for 各インスタンス ID インスタンス GUID に関連するエンジン インスタンスを検索する for エンジン インスタンスの各メッシュ for メッシュで使用されている各マテリアル ID 割り当てられたエンジン マテリアルへの参照でサーフェス (インスタンス ID、メッシュ インデックス、マテリアル ID) を関連付ける
エンジン マテリアルの割り当てが変更されても、このマッピングを簡単に更新できます。
ワールド編集ツールでマテリアル カラーや割り当てが変更された場合にプリコンピュートを再実行する必要はありません。
追加ランタイム データ
AlbedoBuffer または EmissiveBuffer を作成するには、プリコンピュートの後で追加のランタイム データを一部抽出する必要があります。
各ラジオシティ システムに ClusterAlbedoWorkspaceMaterialDataオブジェクトをロードします。
// path: "radiosity/[system name].caw" const Enlighten::ClusterAlbedoWorkspaceMaterialData* materialData = ReadClusterAlbedoWorkspaceMaterialDataFromFile(path);
システム用に ClusterAlbedoWorkspaceMaterialDataで CreateDynamicMaterialWorkspace を呼び出します。
システム用に InputWorkspace で CreateAlbedoBuffer を呼び出します。
永続ラジオシティ データの抽出の際に InputWorkspace について紹介しました。
プリコンピュートの後に 1 度この追加ランタイム データを抽出し、永続ランタイム データとともに保存します。ワールド編集ツールでアルベド カラーとエミッシブ カラーが変更された場合は、このデータを使用してそれらを更新します。
DynamicMaterialWorkspace と ClusterAlbedoWorkspaceMaterialDataは、AlbedoBuffer または EmissiveBuffer を作成または更新する場合にのみ必要です。バッファが編集ツールでのみ変更され、実行時に変更されない場合、ターゲット プラットフォームに対してランタイム データを準備する際にこれらのオブジェクトを除外します。
均一のカラーの提供
サーフェスに対して均一のマテリアル カラーを提供するには、永続ランタイム データとインスタンス ID、メッシュ インデックス、マテリアル ID を使用します。
均一のカラーは以下のように取得します。
- インスタンス ID とエンジン メッシュ間のマッピングを使用する、または
- サーフェス とエンジン マテリアル間のマッピングを使用します。
MakeSingleSurfaceSelection を呼び出し、サーフェスを識別する SurfaceSelection を作成します。
SetMaterialAlbedoColour を呼び出し、SurfaceSelection のカラーを設定します。
複数のサーフェスにカラーを指定するには、SetMaterialAlbedoColour を必要な回数呼び出します。
最後に、InitialiseAlbedoBufferFromMaterialWorkspace を呼び出して、 AlbedoBuffer に変更をコミットします。
エミッシブ カラーを指定するには、エミッシブ関連の関数を使用して同様の手順に従います。
サンプル ポイント データ
サンプル ポイントに関する情報は、プリコンピュートの後で入手できます。
IPrecompSystemDuster オブジェクトをロードして、各ラジオシティ システムのサンプル ポイントのセットを取得します。
// path: "precomp/[system name].dust" const Enlighten::IPrecompSystemDuster* materialData = Geo::LoadInterfaceCompressed<IPrecompSystemDuster>(path);
IPrecompSystemDuster オブジェクト内で、各サンプル ポイントについて以下のデータを入手できます。
- インスタンス ID
- インスタンス GUID
- ジオメトリ オブジェクト内のメッシュ インデックス
- メッシュ オブジェクト内のフェース インデックス
- フェース内の重心座標
フェース インデックスは、ラジオシティ計算に含まれていたメッシュ LODを参照します。
IPrecompSystemDuster オブジェクトからは、サンプル カラーを計算するために必要な情報だけを抽出し、保存することをお勧めします。
サンプル カラーの提供
永続ランタイム データ、および各サンプル用に抽出した情報を使用して、各ラジオシティ システムにサンプル カラーを指定します。
最も正確な結果を得るには、独自のレンダラーとマテリアルを使用して、各サンプル ポイントをシェーディングします。
- システムの各インスタンスに対し、各サンプル ポイントに 1 つの頂点を含む頂点バッファを構築します。これはフェース インデックスと重心座標を使用して元のメッシュの頂点から補間されます。
- 2 つの出力バッファを作成します。1 つはアルベド、もう 1 つはエミッシブ用であり、それぞれが各サンプルポイントに対して 1 つのカラーを含みます。
- システムの各インスタンスに対し、アルベド カラーとエミッシブ カラーを出力バッファに出力する特別なピクセル シェーダーを備えたエンジン マテリアルを使用して、ポイント リストとして頂点バッファを描画します。
- アルベドとエミッシブの出力バッファを CPU がアクセスできるメモリにリード バックします。
- サンプリングされたアルベド カラーとエミッシブ カラーで InitialiseAlbedoBufferFromColoursPerPoint と InitialiseEmissiveBufferFromColoursPerPoint を呼び出します。