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);
この例から得られる AlbedoBuffer
と EmissiveBuffer
オブジェクトを IndirectInputLighting
関数に送り、アルベド カラーとエミッシブ カラーを提供できます。
動的アルベド更新
適切な Set*
と Update*
関数を使用して、マテリアル カラーを変更しまとめて適用するだけで、アルベド、エミッシブ、透明度を実行時に動的に更新することが可能です。新しいカラーを設定するには、DyanmicMaterialWorkspace
オブジェクトを保持する必要があります。通常は、マテリアル数が非常に多い場合を除き、小さなメモリ フットプリントだけを使用しますが、必要なくなったときにこのオブジェクトを削除できます。Utilities API の Read
関数を使用してマテリアル データ オブジェクトをロードした場合、対応する Delete*
を呼び出してこれを削除し、メモリの割り当て/解放操作が同じメモリ システムで行われるようにする必要があります。
動的マテリアル コンポーネントは Initialise*
の呼び出しの前に動的初期化を行う必要があります。初期化されると、動的マテリアル コンポーネントは Set*
関数の呼び出しで更新できます。更新されたマテリアル カラーは、バッファで関連する Update/*
関数が呼び出されると、AlbedoBuffer
、EmissiveBuffer
、または TransparencyBuffer
にのみ表示されます。Update
関数を呼び出す前に多数の Set
呼び出しをまとめることができます。