素材

素材は、三角形メッシュのレンダリング方法を定義する共有リソースです。 一方、ポイント クラウドでは、素材は一切公開されません。

素材は、次の項目の指定に使用されます

  • 適用するテクスチャ
  • オブジェクトを透明にするかどうか、
  • 照明がサーフェスとどのように相互作用するか。

素材はモデル変換中に自動的に作成され、実行時にアクセスできます。 コードからカスタム素材を作成し、既存の素材を置き換えることもできます。 このシナリオは、多くのメッシュで同じ素材を共有する場合に特に意味があります。 素材の変更は、それを参照するすべてのメッシュに表示されるため、この方法を使用して簡単に変更を適用できます。

Note

選択したオブジェクトの強調表示などの一部のユース ケースは、素材を変更することによって実行できますが、HierarchicalStateOverrideComponent を使用した方がはるかに簡単です。

素材の種類

Azure Remote Rendering には、次の 2 つの異なる素材の種類があります。

  • PBR 素材 は、可能な限り物理的に正確にレンダリングする必要があるサーフェスに使用されます。 このような素材については、物理ベース レンダリング (PBR) を使用して、現実的なライティングが計算されます。 この素材の種類を最大限に活用するには、粗さや法線マップなどの高品質な入力データを提供することが重要です。

  • 色素材は、追加の照明が必要ない場合に使用されます。 これらの素材は常に完全に明るく、設定が簡単です。 色素材は、ライティングをまったく持たないデータ、または photogrammetry で取得したモデルなどの静的なライティングが既に組み込まれているデータに使用されます。

メッシュとMeshComponent 素材の割り当て

三角形メッシュには、1 つ以上のサブメッシュがあります。 各サブメッシュは 1 つの素材を参照します。 メッシュで直接使用する素材を変更することも、MeshComponent でサブメッシュに使用する素材をオーバーライドすることもできます。

メッシュ リソースで素材を直接変更すると、その変更はそのメッシュのすべてのインスタンスに影響を及ぼします。 ただし、MeshComponent での変更は、1 つのメッシュ インスタンスにのみ影響します。 どちらの方法が適しているかは、目的の動作によって異なりますが、MeshComponent の変更がより一般的な方法です。

素材の重複除去

同じプロパティやテクスチャを持つ複数のマテリアルは変換中に自動的に重複除去され、1 つの素材になります。 この機能は [変換設定] で無効にすることができますが、最適なパフォーマンスを得るには、そのままにしておくことをお勧めします。

Material クラス

API によって提供されるすべての素材は、基本クラス Material から派生します。 それらの型を照会するには Material.MaterialSubType を使用するか、直接キャストします。

void SetMaterialColorToGreen(Material material)
{
    if (material.MaterialSubType == MaterialType.Color)
    {
        ColorMaterial colorMaterial = material as ColorMaterial;
        colorMaterial.AlbedoColor = new Color4(0, 1, 0, 1);
        return;
    }

    PbrMaterial pbrMat = material as PbrMaterial;
    if (pbrMat != null)
    {
        pbrMat.AlbedoColor = new Color4(0, 1, 0, 1);
        return;
    }
}
void SetMaterialColorToGreen(ApiHandle<Material> material)
{
    if (material->GetMaterialSubType() == MaterialType::Color)
    {
        ApiHandle<ColorMaterial> colorMaterial = material.as<ColorMaterial>();
        colorMaterial->SetAlbedoColor({ 0, 1, 0, 1 });
        return;
    }

    if (material->GetMaterialSubType() == MaterialType::Pbr)
    {
        ApiHandle<PbrMaterial> pbrMat = material.as<PbrMaterial>();
        pbrMat->SetAlbedoColor({ 0, 1, 0, 1 });
        return;
    }
}

API ドキュメント

次のステップ