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

配置模型转换参数

本文介绍如何为模型转换配置参数。

“设置”文件

如果名为 <modelName> 的文件。转换设置.json 位于输入模型 modelName>< 旁边的输入容器中。<ext>,然后使用该文件为模型转换过程提供额外的配置。 例如,转换 box.gltf 时,将使用框。转换设置.json 以设置模型转换的参数。

JSON 转换设置文件的内容应具有以下架构:

{
    "$schema" : "http://json-schema.org/schema#",
    "description" : "ARR ConversionSettings Schema",
    "type" : "object",
    "definitions" : 
    {
        "position_attribute" : {"type" : "string", "description" : "Destination format of the position attribute", "enum" : [ "32_32_32_FLOAT", "16_16_16_16_FLOAT" ]},
        "color_attribute" : {"type" : "string", "description" : "Destination format of the color attribute", "enum" : [ "NONE", "8_8_8_8_UNSIGNED_NORMALIZED" ]},
        "vector_attribute" : {"type" : "string", "description" : "Destination format of the normals, tangents and binormals attributes", "enum" : [ "NONE", "8_8_8_8_SIGNED_NORMALIZED", "16_16_16_16_FLOAT" ]},
        "texcoord_attribute" : {"type" : "string", "description" : "Destination format of the texture coordinates attribute", "enum" : [ "NONE", "32_32_FLOAT", "16_16_FLOAT" ]}
    },
    "properties" : 
    {
        "scaling" : { "type" : "number", "exclusiveMinimum" : 0, "default" : 1.0 },
        "recenterToOrigin" : { "type" : "boolean", "default" : false },
        "opaqueMaterialDefaultSidedness" : {" type" : "string", "enum" : [ "SingleSided", "DoubleSided" ], "default" : "DoubleSided" },
        "material-override" : { "type" : "string", "default" : "" },
        "gammaToLinearMaterial" : { "type" : "boolean", "default" : false },
        "gammaToLinearVertex" : { "type" : "boolean", "default" : false },
        "sceneGraphMode" : { "type" : "string", "enum" : [ "none", "static", "dynamic" ], "default" : "dynamic" },
        "generateCollisionMesh" : { "type" : "boolean", "default" : true },
        "unlitMaterials" : { "type" : "boolean", "default" : false },
        "deduplicateMaterials" : {"type" : "boolean", "default" : true },
        "fbxAssumeMetallic" : {"type" : "boolean", "default" : true },
        "axis" : {
            "type" : "array",
            "items" : {
                "type" : "string",
                "enum" : [ "default", "+x", "-x", "+y", "-y", "+z", "-z" ]
            },
            "minItems" : 3,
            "maxItems" : 3
        },
        "vertex" : {
            "type" : "object",
            "properties" : {
                "position" : { "$ref" : "#/definitions/position_attribute" },
                "color0" : { "$ref" : "#/definitions/color_attribute" },
                "color1" : { "$ref" : "#/definitions/color_attribute" },
                "normal" : { "$ref" : "#/definitions/vector_attribute" },
                "tangent" : { "$ref" : "#/definitions/vector_attribute" },
                "binormal" : { "$ref" : "#/definitions/vector_attribute" },
                "texcoord0" : { "$ref" : "#/definitions/texcoord_attribute" },
                "texcoord1" : { "$ref" : "#/definitions/texcoord_attribute" }
            },
            "additionalProperties" : false
        },
        "metadataKeys" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            }
        }
    },
    "additionalProperties" : false
}

一个框。转换设置.json 文件可能如以下示例所示:

{
    "scaling" : 0.01,
    "recenterToOrigin" : true,
    "material-override" : "box_materials_override.json"
}

用于转换三角网格和点云的架构是相同的。 但是,与三角网格转换相比,点云转换使用严格的特征子集。

三角网格的设置

转换三角网格(如从 .fbx 文件)时,上一部分所示的架构示例中的所有参数都会影响转换结果。 后续部分提供了参数的详细说明。

几何参数

  • scaling:此参数统一缩放模型。 缩放可用于增加或收缩模型,例如,在表顶上显示构建模型。 当模型在计量以外的单位中定义时,缩放也很重要,因为呈现引擎需要计量。 例如,如果模型以厘米为单位定义,则应用 0.01 刻度会使模型的大小正确。 某些源数据格式(例如 .fbx 文件)提供单元缩放提示。 在这种情况下,转换会将模型隐式缩放为计量单位。 源格式提供的隐式缩放将应用于参数的 scaling 顶部。 最终缩放因子应用于场景图形节点的几何顶点和局部转换。 根实体转换的缩放比例保持不变。

    重要

    展示和快速入门可能会补偿任何转换时缩放,因为它们都有内置的自动缩放功能。 有关详细信息,请参阅故障排除指南

  • recenterToOrigin:此参数指出应转换模型,使其边界框居中位于原点。 如果源模型远离原点,浮点精度问题可能会导致呈现项目。 将模型居中可在此方案中提供帮助。

  • opaqueMaterialDefaultSidedness:呈现引擎假定不透明材料是双面的。 如果该假设不是特定模型的 true,则应将此参数设置为 SingleSided。 有关详细信息,请参阅 单面呈现

重复数据删除

  • deduplicateMaterials:此参数启用或禁用共享相同属性和纹理的材料自动重复数据删除。 重复数据删除在处理材料替代后发生。 默认情况下启用筛选器功能。

  • 如果模型具有超过 65,535 个材料,即使在删除重复数据后,该服务也会尝试合并具有类似属性的材料。 最后一个选项是,超出限制的任何材料将被红色错误材料替换。

下图显示了两个多维数据集,共 68,921 个彩色三角形。 左示例是在删除重复之前,使用 68,921 种颜色材料。 正确的示例是在重复数据删除后,使用 64,000 种颜色材料。 材料数量限制为 65,535 个。 有关材料限制的详细信息,请参阅 限制

Screenshot that shows two cubes of 68,921 colored triangles and the effect of deduplication.

颜色空间参数

呈现引擎期待颜色值处于线性空间内。 如果使用 gamma 空间定义模型,则应将以下选项设置为 true

  • gammaToLinearMaterial:将材料颜色从伽玛空间转换为线性空间。
  • gammaToLinearVertex:将顶点颜色从伽玛空间转换为线性空间。

注意

对于 FBX、E57、PLY、LAS、LAZ 和 XYZ 文件格式,这些设置默认设置为 true 。 对于所有其他文件格式,默认值为 false

场景参数

  • sceneGraphMode:定义源文件中的场景图的转换方式。
    • dynamic(默认值):文件中的所有对象都作为 API 中的实体公开,并可任意转换和重新设置父级。 在运行时,节点层次结构与源文件中的结构相同。
    • static:与 dynamic 类似,但场景图中的对象不能在运行时动态地重新成为其他对象的父级。 对于具有许多移动部件(如爆炸视图)的动态模型,该 dynamic 选项会生成一个模型,该模型可以更高效地呈现,但 static 模式仍允许单个部件转换。 如果不需要动态重新父级,则 static 此选项最适合具有多个单独部件的模型。
    • none:场景图折叠为一个对象。

每个模式具有不同的运行时性能。 在 dynamic 模式下,即使没有移动部件,性能开销也会随图形中实体的数量线性缩放。 仅当需要同时移动多个部分或大型子图时,才使用 dynamic 模式。 例如爆炸视图动画。

static模式还会导出完整的场景图。 空间查询 返回各个部分,并且每个部分都可以通过 状态重写进行修改。 在此模式下,每个对象的运行时开销可忽略不计。 此模式非常适合大型场景,你需要对各个部分进行每对象检查和偶尔转换更改,但不需要重新父化对象。

none 模式的运行时开销最小,并且加载时间也稍微快一些。 在此模式下无法检查或转换单个对象。 例如,用例是不以有意义的场景图开头的摄影模型。

提示

许多应用程序加载多个模型。 应根据使用方式优化每个模型的转换参数。 例如,如果要显示汽车的模型供用户分离并详细检查,请先使用 dynamic 模式进行转换。 但是,如果还想将汽车放在显示室环境中,则可以使用 sceneGraphMode 设置为 static甚至转换为 none该模型。

物理学参数

  • generateCollisionMesh:如果需要对 模型进行空间查询 的支持,则必须启用此选项。 冲突网格生成不会增加额外的转换时间,也不会增加输出文件大小。 具有冲突网格的模型的加载时间和运行时成本仅微不足道更高。 除非有特定原因从空间查询中排除模型,否则可以将此标志保留为默认标志(已启用)。

未打光材料

从早期 FBX 格式和 Phong 材料模型转换

  • fbxAssumeMetallic:早期版本的 FBX 格式使用 Phong 材料模型定义其材料。 转换过程必须推断这些材料如何映射到呈现程序的 PBR 模型。 这种映射的效果通常很好,但当材料没有纹理、高反射值和非灰返照色时,可能会出现模棱两可的情况。 在这种情况下,转换必须在确定高反射值优先级、定义高反射和金属材料之间做出选择,其中反光和金属材料会消散,或者通过定义类似于闪亮的彩色塑料中的某种东西来优先选择反光和金属材料。 默认情况下,转换过程假定高度反射值表示不明确方案中的金属材料。 可以将此参数设置为 false 相反的效果。

坐标系重写

  • axis:使用此参数替代坐标系单位向量。 默认值有 ["+x", "+y", "+z"]。 从理论上讲,FBX 格式有一个标头,其中定义了这些向量,转换使用该信息来转换场景。 GLTF 格式还定义了固定坐标系。 实际上,某些资产在其标头中具有不正确的信息,或者通过使用不同的坐标系约定保存。 此选项可用于替代坐标系统以进行补偿。 例如, "axis" : ["+x", "+z", "-y"] 交换 Z 轴和 Y 轴,并通过反转 Y 轴方向来保持坐标系的手法。

节点元数据

  • metadataKeys:使用此参数可以指定要保留在转换结果中的节点元数据属性的键。 可以指定精确键或通配符键。 Wild卡 键的格式ABC*和匹配以任何开头ABC的键。 支持的元数据值类型为 boolintfloatstring

    对于 GLTF 文件,此数据来自 节点上的额外对象。 对于 FBX 文件,此数据来自 Properties70 其上的 Model nodes数据。 有关详细信息,请参阅 3D 资产工具的文档。

加载启用了元数据的模型时,可以通过异步 QueryMetadataAsync 函数检索特定实体的元数据条目列表。

顶点格式

可以调整网格的顶点格式,以将精度用于节省内存。 如果模型内存占用量较低,可以加载更大的模型或实现更好的性能。 但是,根据数据的不同,错误的格式可能会显著影响呈现质量。

注意

如果模型不再适合内存,或者优化以获得最佳性能,则更改顶点格式应该是最后一个选项。 更改可以轻松引入呈现项目,既明显又微妙。 除非你知道应该注意什么,否则不应更改默认值。

可以进行以下调整:

  • 显式包含或排除特定数据流。
  • 降低数据流的准确性,以减少内存占用。

JSON 文件中的以下 vertex 部分是可选的。 对于未显式指定的每个部分,转换服务将回退到其默认设置。

{
    ...
    "vertex" : {
        "position"  : "32_32_32_FLOAT",
        "color0"    : "NONE",
        "color1"    : "NONE",
        "normal"    : "NONE",
        "tangent"   : "NONE",
        "binormal"  : "NONE",
        "texcoord0" : "32_32_FLOAT",
        "texcoord1" : "NONE"
    },
    ...
}

通过将组件强制为 NONE,可以保证输出网格没有各自的流。

每个顶点流的组件格式

下表描述了各自组件允许的格式:

顶点组件 支持的格式 材料中的使用情况
position 32_32_32_FLOAT默认值), 16_16_16_16_FLOAT 顶点位置。 必须始终存在。
color0 8_8_8_8_UNSIGNED_NORMALIZED默认值), NONE 顶点颜色。 查看useVertexColor颜色材料和 PBR 材料以及vertexMix颜色材料中的属性。
color1 8_8_8_8_UNSIGNED_NORMALIZEDNONE 默认值 未使用。 保留为默认值 NONE
normal 8_8_8_8_SIGNED_NORMALIZED默认值), 16_16_16_16_FLOATNONE 用于 PBR 材料中的照明。
tangent 8_8_8_8_SIGNED_NORMALIZED默认值), 16_16_16_16_FLOATNONE 用于使用 PBR 材料中的法线贴图进行照明。
binormal 8_8_8_8_SIGNED_NORMALIZED默认值), 16_16_16_16_FLOATNONE 用于使用 PBR 材料中的法线贴图进行照明。
texcoord0 32_32_FLOAT默认值), 16_16_FLOATNONE 纹理坐标的第一个槽。 单个纹理(如 albedo 和普通贴图)可以使用在源文件中定义的槽 0 或 1。
texcoord1 32_32_FLOAT默认值), 16_16_FLOATNONE 纹理坐标的第二个槽。 单个纹理(如 albedo 和普通贴图)可以使用在源文件中定义的槽 0 或 1。

支持的组件格式

下表描述了受支持组件格式的内存占用情况:

格式 说明 每个顶点的字节数
32_32_FLOAT 双分量完整浮点精度 8
16_16_FLOAT 双分半浮点精度 4
32_32_32_FLOAT 三分量全浮点精度 12
16_16_16_16_FLOAT 四分量半浮点精度 8
8_8_8_8_UNSIGNED_NORMALIZED 四分字节,规范化为 [0; 1] 范围 4
8_8_8_8_SIGNED_NORMALIZED 四分字节,规范化为 [-1; 1] 范围 4

组件格式更改的最佳做法

  • position:降低的准确度够用的情况很罕见。 16_16_16_16_FLOAT 引入明显的量化项目,甚至适用于小型模型。
  • normaltangent、和 binormal:通常,这些值将一起更改。 除非存在由正常量化而导致的明显发光点,否则没有理由提高其准确度。 但在某些情况下,这些组件可以设置为 NONE
    • normaltangent并且 binormal 仅当模型中至少有一个材料应亮起时才需要。 在 Azure 远程渲染中,每当模型上使用 PBR 材料,会出现这种情况。
    • tangentbinormal并且仅在任何点亮材料使用普通地图纹理时才需要。
  • texcoord0texcoord1:纹理坐标可以在其值保持在[0; 1]范围内时以及寻址纹理的最大大小为 2,048 × 2,048 像素时使用降低的准确性(16_16_FLOAT)。 如果超出这些限制,纹理映射的质量会降低。

示例

假设你有一个摄影测量模型,其纹理中融入了照明。 要呈现该模型,只需要顶点位置和纹理坐标。

默认情况下,转换器必须假定你可能想要在某个时候对模型使用 PBR 材料,因此它会为你生成normal数据tangentbinormal 因此,每个顶点内存使用量为 position (12 字节) + texcoord0 (8 字节) + normal (4 字节) + tangent (4 字节) + binormal (4 字节) = 32 字节。 此类型的较大模型可以轻松拥有数百万个顶点,从而生成可占用数千兆字节内存的模型。 此类大量数据会影响性能,甚至可能耗尽内存。

知道你从不需要模型上的动态照明,并且知道所有纹理坐标都在[0; 1]范围内,你可以设置normaltangent设置和binormal设置为NONEtexcoord0半精度(16_16_FLOAT),因此每个顶点只有 16 个字节。 当网格数据被切成一半时,可以加载更大的模型,并且性能可能会得到改善。

点云的设置

转换点云时,仅使用架构中的一小部分属性。 除非指定其他属性,否则将忽略其他属性。

会影响点云转换的属性包括:

  • scaling:与三角网格的含义相同。
  • recenterToOrigin:与三角网格的含义相同。
  • axis:与三角网格的含义相同。 默认值是 ["+x", "+y", "+z"],但与呈现器自己的坐标系相比,大多数点云数据都会旋转。 为了补偿,在大多数情况下 ["+x", "+z", "-y"] 修复旋转。
  • gammaToLinearVertex:类似于三角网格,此标志指示是否应将点颜色从伽玛空间转换为线性空间。 点云格式(E57、PLY、LAS、LAZ 和 XYZ 文件)的默认值为 true
  • generateCollisionMesh:与三角网格类似,若要支持 空间查询,必须启用此标志。

内存优化

加载内容的内存消耗可能会成为呈现系统上的瓶颈。 如果内存有效负载太大,则可能会损害呈现性能或导致模型完全不加载。 本段落讨论了一些用于降低内存占用量的重要策略。

注意

以下优化适用于三角网格。 无法通过配置转换设置来优化点云的输出。

实例化

在实例化中,网格将重复使用具有不同空间转换的部件,而不是引用其自己的唯一几何图形的每个部分。 实例化对内存占用产生了重大影响。

实例化示例用例可以是引擎模型中的螺丝,也可以是体系结构模型中的椅子。

注意

实例化可以显著改善内存消耗(因此加载时间),但对呈现性能的改进微不足道。

如果源文件中已相应标记了部件,则转换服务不会遵循实例化。 但是,转换不会对网格数据执行额外的深入分析,以识别可重用部件。 内容创建工具及其导出管道是正确实例设置的决定性标准。

在转换期间测试实例信息是否保留的一种简单方法是查看 输出统计信息。 具体而言,检查numMeshPartsInstanced值。 如果该值 numMeshPartsInstanced 大于零,则网格在实例之间共享。

示例:3DS Max 中的实例化设置

Autodesk 3ds Max 具有不同的对象克隆模式,称为 “复制”、“ 实例”和 “引用”。 这些模式在导出 的 .fbx 文件中以不同的方式进行实例化。

Screenshot that shows an example of cloning an object by using Autodesk 3ds Max.

  • 复制:在此模式下,将克隆网格,因此不使用实例化( = numMeshPartsInstanced0)。
  • 实例:这两个对象共享同一网格,因此使用实例化( = numMeshPartsInstanced1)。
  • 参考:可以将不同的修饰符应用于几何图形,因此导出程序会选择保守的方法,并且不使用实例化( = numMeshPartsInstanced0)。

基于深度的组合模式

如果内存是问题,请使用 基于深度的合成模式配置呈现器。 在此模式下,GPU 有效负载分布于多个 GPU。

减小顶点大小

如组件格式更改的最佳做法中所述,调整顶点格式可以减少内存占用。 但是,此选项应该是你选择的最后一个选项。

纹理大小

根据方案类型,纹理数据量可能超过用于网格数据的内存。 摄影测量模型是候选项。 转换配置不支持自动纵向缩减纹理。 如有必要,纹理缩放必须作为客户端预处理步骤完成。 但转换步骤确实选择了合适的 纹理压缩格式

  • 不透明颜色纹理的 BC1 文件格式
  • 具有 alpha 通道的源颜色纹理的 BC7 文件格式

由于 BC7 文件格式的内存占用量是 BC1 文件格式的两倍,因此请务必确保输入纹理不提供不必要的 alpha 通道。

典型用例

查找特定用例的良好导入设置可能是一个繁琐的过程。 另一方面,转换设置可能对运行时性能产生重大影响。

某些特定用例类符合特定的优化条件。 以下各节介绍了一些示例。

用例:体系结构可视化或大型户外地图

对于涉及建筑可视化或大型户外地图的方案,请考虑以下因素:

  • 这些类型的场景往往是静态的。 它们不需要可移动部件。 因此,可以设置为sceneGraphModestatic甚至none提升运行时性能。 在 static 模式下,场景的根节点仍可移动、旋转和缩放。 例如,它可以动态切换 1:1 缩放(对于第一人称视图)和表顶视图。

  • 如果应用程序不使用剪切平面,则应关闭 opaqueMaterialDefaultSidedness 标志。 性能提升通常为 20% 到 30%。 你仍然可以使用剪切平面,但当你查看对象的内部部分时,不会有一个背脸,这似乎适得其反。 有关详细信息,请参阅 单面呈现

用例:摄影测量模型

呈现摄影测量模型时,通常不需要场景图。 在此方案中,可以选择设置为 sceneGraphModenone. 由于这些模型很少包含复杂的场景图,因此选择此选项的效果可能微不足道。 由于已将光照融入纹理,因此不需要动态照明。 在本方案中:

  • unlitMaterials 标志设置为 true以将所有材料转换为未打光有色材料
  • 从顶点格式中删除不需要的数据。 请参阅前面的 示例

用例:压缩计算机和其他计算机的可视化效果

在这些用例中,模型在一小部分中通常具有高度的详细信息。 呈现器经过大量优化,可以很好地处理这些情况。 但是,前面的用例中描述的大多数优化不适用于此处。 优化包括:

  • 各个部件应可选择且可移动,因此 sceneGraphMode 必须设置为 dynamic
  • 打光通常是应用程序不可分割的一部分,因此必须生成冲突网格。
  • 启用标志时 opaqueMaterialDefaultSidedness ,剪切平面看起来更好。

已弃用的功能

仍支持使用非特定于模型的转换设置模型转换参数设置.json 文件名,但已弃用。 请改用特定于<模型的 modelName>。转换设置.json 文件名。

material-override仍支持使用设置来标识转换设置文件中的材料替代文件,但已弃用。 请改用特定于 <模型的 modelName>。MaterialOverrides.json 文件名。

后续步骤