This is the documentation for Enlighten.

7.1.1.1.3. アルベド情報の提供


このページでは、Enlighten Albedo 低レベル API により、マテリアル GUID を使用してマテリアル アルベドとエミッシブ カラーを設定する方法を説明します。

コード例: 
// 以下の 3 つのオブジェクトを扱う必要があります。
// クラスタ アルベド ワークスペース - システムの現在のアルベド カラーのセットです。
// クラスタ アルベド マテリアル データ - インスタンス、メッシュ、マテリアル GUID、および アルベド カラーの間の関係性を示します。
// 入力ワークスペース - アルベド カラーを適用するシステムを示します。

// プリコンピュートの出力からクラスタ アルベド マテリアル データをロードします。
// 2 つ目のパラメーターも、オプションのマテリアル GUID データ ブロックのロードを指定します。これは、インスタンス、メッシュ、マテリアル GUIDを使用してマテリアルの使用を識別するために必要です
Enlighten::ClusterAlbedoWorkspaceMaterialData* cawMaterialData =
     Enlighten::ReadClusterAlbedoWorkspaceMaterialDataFromFile(myClusterMatFilename, Enlighten::Iff::ClusterAlbedoWorkspaceMaterialGuidsSection);

// 動的マテリアル ワークスペース オブジェクトを作成します
Geo::u32 dynamicMaterialWorkspaceSize = Enlighten::CalcDynamicMaterialWorkspaceSize(cawMaterialData);
void* dynamicMaterialWorkspaceMem = GEO_ALLIGNED_MALLOC(dynamicMaterialWorkspaceSize, 16); // 16 バイト アライメントが必要です。
DynamicMaterialWorkspace* dynamicMaterialWorkspace = Enlighten::CreateDynamicMaterialWorkspace(cawMaterialData, dynamicMaterialWorkspaceMem);

// GUID ルックアップの実行をサポートするための小さな「ワークスペース」バッファを作成する必要があります。このバッファのサイズは以下を呼び出すことで計算されます。
// Enlighten::CalcMaterialGuidsLookupWorkspaceSize(cawMaterialData):
void* workspaceMemory = GEO_ALIGNED_MALLOC(Enlighten::CalcMaterialGuidsLookupWorkspaceSize(cawMaterialData), 8);

// ここで、マテリアルにカラーを割り当て、一括してクラスタ アルベド ワークスペースに適用します。
// 効率を上げるためにカラーをまとめて適用します。

// 上の GeoRadiosity デモと同じ方法でカラーを設定します
v128 solidBlack  = VConstruct(0.0f, 0.0f, 0.0f, 0.0f);
v128 solidBlue   = VConstruct(0.0f, 0.0f, 1.0f, 1.0f);
v128 solidYellow = VConstruct(1.0f, 1.0f, 0.0f, 1.0f);

// マテリアル 0x000...0C2 のすべての使用でアルベドを青、エミッシブを黒に設定します (つまり、エミッシブ カラーはありません)
Enlighten::SetMaterialAlbedoColour(
     dynamicMaterialWorkspace,
     cawMaterialData,
     GeoGuid::Invalid,
     GeoGuid::Invalid,
     GeoGuid::Create(0x0000000000000000, 0x00000000000000C2),
     solidBlue,
     workspaceMemory);

Enlighten::SetMaterialEmissiveColour(
     dynamicMaterialWorkspace,
     cawMaterialData,
     GeoGuid::Invalid,
     GeoGuid::Invalid,
     GeoGuid::Create(0x0000000000000000, 0x00000000000000C2),
     solidBlack,
     workspaceMemory);

// インスタンス 0x000...A1 のマテリアル 0x000...0C2 の使用でアルベドを黄、エミッシブを黒に設定します (つまり、エミッシブ カラーはありません)
Enlighten::SetMaterialAlbedoColour(
     dynamicMaterialWorkspace,
     cawMaterialData,
     GeoGuid::Create(0x0000000000000000, 0x00000000000000A1),
     GeoGuid::Invalid,
     GeoGuid::Create(0x0000000000000000, 0x00000000000000C2),
     solidYellow,
     workspaceMemory);

Enlighten::SetMaterialEmissiveColour(
     dynamicMaterialWorkspace,
     cawMaterialData,
     GeoGuid::Create(0x0000000000000000, 0x00000000000000A1),
     GeoGuid::Invalid,
     GeoGuid::Create(0x0000000000000000, 0x00000000000000C2),
     solidBlack,
     workspaceMemory);

GEO_ALIGNED_FREE(workspaceMemory); //ワークスペース メモリの使用は終わりました

// 次にアルベド バッファを割り当てます。
// 自分自身でメモリを取り扱うので、まず割り当てるサイズを知る必要があります (これには InputWorkspace がi必要なので、ロードします)。
Enlighten::InputWorkspace* inputWorkspace = Enlighten::ReadInputWorkspaceFromFile(myInputWorkspaceFilename);

Geo::u32 albedoBufferMemorySize = Enlighten::CalcAlbedoBufferSize(inputWorkspace);
void* albedoMemory = GEO_ALIGNED_MALLOC(albedoBufferMemorySize, 16); // 16 バイト アライメントが必要です。
Geo::u32 emissiveBufferMemorySize = Enlighten::CalcEmissiveBufferSize(inputWorkspace);
void* emissiveMemory = GEO_ALIGNED_MALLOC(emissiveBufferMemorySize, 16); // 16 バイト アライメントが必要です。

// 次に、メモリを初期化して AlbedoBuffer と EmissiveBuffer にします
Enlighten::AlbedoBuffer* albedoBuffer = Enlighten::CreateAlbedoBuffer(albedoMemory, inputWorkspace);
Enlighten::EmissiveBuffer* emissiveBuffer = Enlighten::CreateEmissiveBuffer(emissiveMemory, inputWorkspace);

// ここで、アルベド バッファとエミッシブ バッファを初めて初期化します。
InitialiseAlbedoBufferFromMaterialWorkspace(dynamicMaterialWorkspace, cawMaterialData, albedoBuffer);
InitialiseEmissiveBufferFromMaterialWorkspace(dynamicMaterialWorkspace, cawMaterialData, emissiveBuffer);

この例から得られる AlbedoBufferEmissiveBuffer オブジェクトを IndirectInputLighting 関数に送り、アルベド カラーとエミッシブ カラーを提供できます。

動的アルベド更新

適切な Set*Update* 関数を使用して、マテリアル カラーを変更しまとめて適用するだけで、アルベド、エミッシブ、透明度を実行時に動的に更新することが可能です。新しいカラーを設定するには、DyanmicMaterialWorkspace オブジェクトを保持する必要があります。通常は、マテリアル数が非常に多い場合を除き、小さなメモリ フットプリントだけを使用しますが、必要なくなったときにこのオブジェクトを削除できます。Utilities API の Read 関数を使用してマテリアル データ オブジェクトをロードした場合、対応する Delete* を呼び出してこれを削除し、メモリの割り当て/解放操作が同じメモリ システムで行われるようにする必要があります。

動的マテリアル コンポーネントは Initialise* の呼び出しの前に動的初期化を行う必要があります。初期化されると、動的マテリアル コンポーネントは Set* 関数の呼び出しで更新できます。更新されたマテリアル カラーは、バッファで関連する Update/* 関数が呼び出されると、AlbedoBufferEmissiveBuffer、または TransparencyBuffer にのみ表示されます。Update 関数を呼び出す前に多数の Set 呼び出しをまとめることができます。