你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

材料

材料是定义如何渲染三角网格共享资源。 另一方面,点云不会公开任何材料

材料用于指定

  • 要应用哪些纹理
  • 是否要使对象透明,
  • 光线如何与表面交互。

材料在模型转换期间自动创建,可在运行时访问。 还可以通过代码创建自定义材料并替换现有材料。 如果要跨许多网格共享相同资料,此方案特别有意义。 由于对材料的修改在每个引用它的网格上可见,因此此方法可用于轻松应用更改。

注意

某些用例(例如突出显示已选取的对象)可以通过修改材料来完成,但通过 HierarchicalStateOverrideComponent 实现会轻松得多。

材料类型

Azure 远程渲染具有两种不同的材料类型:

  • PBR 材料用于应尽可能在物理方面正确渲染的曲面。 使用基于物理方式的渲染 (PBR) 为这些材料计算现实照明。 若要充分利用此材料类型,必须提供高质量输入数据,例如,粗糙度和法线贴图。

  • 颜色材料用于不需要额外照明的情况。 这些材料始终全亮,更易于设置。 颜色材料用于根本不应有照明或是已合并静态照明的数据,例如通过 photogrammetry 获取的模型。

网格与 MeshComponent 材料分配

三角网格具有一个或多个子网格。 每个子网格都引用一个材料。 可以更改材料以在网格上直接使用,也可以在 MeshComponent 上替代要用于子网格的材料。

直接在网格资源上修改材料时,此更改会影响该网格的所有实例。 但在 MeshComponent 上更改它只会影响这一个网格实例。 更合适的方法取决于所需行为,但修改 MeshComponent 是更常见的方法。

材料重复数据删除

在转换过程中,多个具有相同属性和纹理的材料会自动进行重复数据删除,转变为单个材料。 可以在转换设置中禁用此功能,但建议使它保持打开状态以获得最佳性能。

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 文档

后续步骤