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

模型格式的材料映射

将源资产转换为模型时,转换器将为每个网格创建材料。 材料的创建方式是可以替代的。 但是转换过程默认创建 PBR 材料。 由于每个源文件格式(如 FBX)使用自己的约定来定义材料,因此必须将这些约定映射到 Azure 远程渲染的 PBR 材料参数。

本文列出了用于将材料从源资产转换为运行时材料的确切映射。

glTF

除了 EmissiveFactor 和 EmissiveTexture以外,Azure 远程渲染几乎支持 glTF 2.0 规范中的所有映射。

下表显示了映射:

glTF Azure 远程渲染
baseColorFactor albedoColor
baseColorTexture albedoMap
metallicFactor metalness
metallicTexture metalnessMap
roughnessFactor roughness
roughnessTexture roughnessMap
occlusionFactor occlusion
occlusionTexture occlusionMap
normalTexture normalMap
normalTextureInfo.scale normalMapScale
alphaCutoff alphaClipThreshold
alphaMode.OPAQUE alphaClipEnabled = false,isTransparent = false
alphaMode.MASK alphaClipEnabled = true,isTransparent = false
alphaMode.BLEND isTransparent = true
doubleSided isDoubleSided
emissiveFactor -
emissiveTexture -

glTF 中的每个纹理都包含 texCoord 值,也支持用于 Azure 远程渲染材料。

嵌入的纹理

支持 *.bin*.glb 文件中嵌入的纹理。

支持的 glTF 扩展

除了基础特征集之外,Azure 远程渲染还支持以下 glTF 扩展:

FBX

FBX 格式采用封闭源代码,因此 FBX 材料通常与 PBR 材料不兼容。 FBX 使用包含很多唯一参数和属性的复杂表面描述,但仅有部分可以用于 Azure 远程渲染管道。

重要

Azure 远程渲染模型转换管道仅支持 FBX 2011 及以上版本。

FBX 格式定义了用于材料的传统方法,官方 FBX 规范中只提供两种类型:

  • Lambert - 已经很长时间不常使用,但在转换到 Phong 的转换期间仍提供对它的支持。
  • Phong - 几乎所有材料和大多数内容工具都使用此类型。

Phong 模型更为精准,它用作 FBX 材料的唯一模型。 下面的 FBX 材料将参考此模型。

Maya 通过定义 PBR 的自定义属性和材料的 Stingray 类型,将两个自定义扩展用于 FBX。 这些详细信息未包含在 FBX 规范中,因此当前不受 Azure 远程渲染支持。

FBX 材料使用 Diffuse-Specular-SpecularLevel 概念,因此,若要从漫射纹理转换到反照率图,我们需要考虑其他参数并将它们从漫射中去除。

FBX 中的所有颜色和纹理都在 sRGB 空间中(也称为 Gamma 空间),但 Azure 远程渲染在可视化期间使用线性空间,并在帧结束时将所有内容转换回 sRGB 空间。 Azure 远程渲染资产管道将所有内容转换到线性空间,并将其作为准备好的数据发送到渲染器。

此表显示了如何将纹理从 FBX 材料映射到 Azure 远程渲染材料。 其中一些纹理不会直接使用,而是与公式中的其他纹理组合使用(例如漫射纹理):

FBX Azure 远程渲染
AmbientColor 遮蔽图
DiffuseColor 用于反照率、金属度
TransparentColor 用于反照率的 alpha 通道
TransparencyFactor 用于反照率的 alpha 通道
不透明度 用于反照率的 alpha 通道
SpecularColor 用于反照率、金属度、粗糙度
SpecularFactor 用于反照率、金属度、粗糙度
ShininessExponent 用于反照率、金属度、粗糙度
NormalMap NormalMap
Bump 转换为 NormalMap
EmissiveColor -
EmissiveFactor -
ReflectionColor -
DisplacementColor -

以上映射是材料转换中最复杂的部分,因为需要进行很多假定。 下面将介绍这些假定情况。

使用下面一些定义:

  • Specular = SpecularColor * SpecularFactor
  • SpecularIntensity = Specular.Red ∗ 0.2125 + Specular.Green ∗ 0.7154 + Specular.Blue ∗ 0.0721
  • DiffuseBrightness = 0.299 * Diffuse.Red2 + 0.587 * Diffuse.Green2 + 0.114 * Diffuse.Blue2
  • SpecularBrightness = 0.299 * Specular.Red2 + 0.587 * Specular.Green2 + 0.114 * Specular.Blue2
  • SpecularStrength = max(Specular.Red, Specular.Green, Specular.Blue)

请从此处获取 SpecularIntensity 公式。 有关亮度公式的说明,请参阅此规范

粗糙度

公式中使用 SpecularShininessExponent 计算得出 Roughness。 该公式使用 Phong 反射指数计算得出粗糙度的近似值:

Roughness = sqrt(2 / (ShininessExponent * SpecularIntensity + 2))

金属度

glTF 规范提供的公式中使用 DiffuseSpecular 计算得出 Metalness

此处思路在于求解方程:Ax2 + Bx + C = 0。 大体上,非传导性表面以反射方式反射约 4% 的光线,而其余光线则以漫射方式反射。 金属表面不会以漫射方式反射光线,而是全部以反射方式反射光线。 此公式有一些缺点,它无法区分有光泽的塑料表面和有光泽的金属表面。 假定大多数情况下表面具有金属属性,结果,有光泽的塑料/橡胶表面看起来可能并不正常。

dielectricSpecularReflectance = 0.04
oneMinusSpecularStrength = 1 - SpecularStrength

A = dielectricSpecularReflectance
B = (DiffuseBrightness * (oneMinusSpecularStrength / (1 - A)) + SpecularBrightness) - 2 * A
C = A - SpecularBrightness
squareRoot = sqrt(max(0.0, B * B - 4 * A * C))
value = (-B + squareRoot) / (2 * A)
Metalness = clamp(value, 0.0, 1.0);

反照率

使用 DiffuseSpecularMetalness 计算得出 Albedo

如“金属度”部分中所述,非传导性表面反射约 4% 的光线。
此处思路是使用 Metalness 值作为因子,以线性方式在 DielectricMetal 颜色之间进行内插。 如果金属度为 0.0,则根据反射情况,要么是暗色(当反射值很大时),要么漫射不会变化(当没有反射时)。 如果金属度的值很大,则漫射颜色将会消失,反射颜色会加重。

dielectricSpecularReflectance = 0.04
oneMinusSpecularStrength = 1 - SpecularStrength

dielectricColor = diffuseColor * (oneMinusSpecularStrength / (1.0f - dielectricSpecularReflectance) / max(1e-4, 1.0 - metalness))
metalColor = (Specular - dielectricSpecularReflectance * (1.0 - metalness)) * (1.0 / max(1e-4, metalness))
albedoRawColor = lerpColors(dielectricColor, metalColor, metalness * metalness)
AlbedoRGB = clamp(albedoRawColor, 0.0, 1.0);

已根据以上公式计算得出 AlbedoRGB,但 alpha 通道还需要进行其他计算。 FBX 格式对透明度没有明确规定,有多种方法可以定义它。 不同的内容工具使用不同的方法。 此处思路是将它们统一为一个公式。 但如果不是以常见方式创建资产,则此公式会将它们错误地呈现为透明。

使用 TransparentColorTransparencyFactorOpacity 进行计算。

如果定义了 Opacity,则直接使用它:AlbedoAlpha = Opacity else
如果定义了 TransparencyColor,则 AlbedoAlpha = 1.0 - ((TransparentColor.Red + TransparentColor.Green + TransparentColor.Blue) / 3.0) else
如果 TransparencyFactor,则 AlbedoAlpha = 1.0 - TransparencyFactor

最终 Albedo 颜色具有四个通道,并将 AlbedoRGBAlbedoAlpha 组合在一起。

摘要

总之,如果 Specular 接近于零,则 Albedo 将非常接近于原始的 Diffuse。 否则,表面将类似于金属表面,且失去漫射颜色。 如果 ShininessExponent 足够大且 Specular 很明亮,则表面更类似于抛光且反射光。 否则,表面将会很粗糙,且几乎不反射环境中的光线。

已知问题

  • 当前公式不适用于简单的彩色几何图形。 如果 Specular 足够明亮,则所有几何图形都将成为没有任何颜色的反光金属表面。 在这种情况下,解决方法是将 Specular 从原始值调低到 30%,或者使用转换设置 fbxAssumeMetallic
  • Maya3DS Max 内容创建工具中最近添加了 PBR 材料。 它们使用用户定义的自定义黑盒属性将其传递到 FBX。 Azure 远程渲染不会读取这些属性,因为没有记录这些属性且其格式采用封闭源代码。

后续步骤