Asignación de materiales para formatos de modelos

Cuando un recurso de origen se convierte en modelo, el convertidor crea materiales para cada malla. La forma en que los materiales se crean se puede modificar. Sin embargo, de forma predeterminada, la conversión creará materiales de PBR. Dado que todos los formatos de archivo de origen, como FBX, usan sus propias convenciones para definir materiales, esas convenciones deben asignarse a los parámetros de material de PBR de Azure Remote Rendering.

En este artículo se enumeran las asignaciones exactas que se usan para convertir materiales de recursos de origen a materiales de entorno de ejecución.

glTF

Casi todo lo que se encuentra en la especificación glTF 2.0 es compatible con Azure Remote Rendering, excepto EmissiveFactor y EmissiveTexture.

En la tabla siguiente se muestra la asignación:

glTF Azure Remote Rendering
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 -

Cada textura de glTF puede tener un valor texCoord, que también se admite en los materiales de Azure Remote Rendering.

Texturas incrustadas

Se admiten las texturas incrustadas en archivos *.bin o *.glb.

Extensión de glTF compatible

Además del conjunto de características básicas, Azure Remote Rendering admite las siguientes extensiones de glTF:

  • MSFT_packing_occlusionRoughnessMetallic
  • KHR_materials_unlit: corresponde a materiales de color. Como materiales emisores, se recomienda usar esta extensión.
  • KHR_materials_pbrSpecularGlossiness: en lugar de texturas de rugosidad metálica, puede proporcionar texturas de brillo especular difusa. La implementación de Azure Remote Rendering sigue directamente las fórmulas de conversión de la extensión.

FBX

El formato FBX es de código cerrado y los materiales de FBX no son compatibles con los materiales de PBR en general. FBX usa una descripción compleja de las superficies con muchos parámetros y propiedades únicos, y no todos se usan en la canalización de Azure Remote Rendering.

Importante

La canalización de conversión del modelo de Azure Remote Rendering solo admite FBX 2011 y versiones posteriores.

El formato FBX define un enfoque conservador para los materiales, solo hay dos tipos en la especificación oficial de FBX:

  • Lambert: no se usa habitualmente desde hace ya bastante tiempo, pero se sigue admitiendo mediante la conversión a Phong en el momento de la conversión.
  • Phong: casi todos los materiales y la mayoría de las herramientas de contenido usan este tipo.

El modelo Phong es más preciso y se usa solo como modelo para los materiales de FBX. Más abajo se hace referencia a este modelo como material de FBX.

Maya usa dos extensiones personalizadas para FBX mediante la definición de propiedades personalizadas para los tipos PBR y Stingray de un material. Estos detalles no se incluyen en la especificación de FBX, por lo que actualmente no se admite en Azure Remote Rendering.

Los materiales de FBX usan el concepto Difusión-Especular-NivelEspecular, por lo que, para convertir una textura difusa en un mapa de albedo, tenemos que calcular los demás parámetros para restarlos de la difusión.

Todos los colores y las texturas de FBX están en el espacio sRGB (también conocido como espacio Gamma), pero Azure Remote Rendering funciona con el espacio lineal durante la visualización y al final del fotograma vuelve a convertir todo al espacio sRGB. La canalización de recursos de Azure Remote Rendering convierte todo al espacio lineal para enviarlo en forma de datos preparados al representador.

En esta tabla se muestra cómo se asignan las texturas de materiales de FBX a materiales de Azure Remote Rendering. Algunas no se usan directamente, sino en combinación con otras que participan en las fórmulas (por ejemplo, la textura difusa):

FBX Azure Remote Rendering
AmbientColor Mapa de oclusión
DiffuseColor Se usa para Albedo, Metalness
TransparentColor Se usa para el canal alfa de Albedo
TransparencyFactor Se usa para el canal alfa de Albedo
Opacidad Se usa para el canal alfa de Albedo
SpecularColor Se usa para Albedo, Metalness, Roughness
SpecularFactor Se usa para Albedo, Metalness, Roughness
ShininessExponent Se usa para Albedo, Metalness, Roughness
NormalMap NormalMap
Bump Se convierte a NormalMap
EmissiveColor -
EmissiveFactor -
ReflectionColor -
DisplacementColor -

La asignación anterior es la parte más compleja de la conversión de materiales, debido a la cantidad de suposiciones que se deben realizar. A continuación se indican estas suposiciones.

Algunas de las definiciones que se usan a continuación:

  • Specular = SpecularColor * SpecularFactor
  • SpecularIntensity = Specular.Rojo ∗ 0,2125 + Specular.Verde ∗ 0,7154 + Specular.Azul ∗ 0,0721
  • DiffuseBrightness = 0,299 * Diffuse.Rojo2 + 0,587 * Diffuse.Verde2 + 0,114 * Diffuse.Azul2
  • SpecularBrightness = 0,299 * Specular.Rojo2 + 0,587 * Specular.Verde2 + 0,114 * Specular.Azul2
  • SpecularStrength = max(Specular.Rojo, Specular.Verde, Specular.Azul)

La fórmula SpecularIntensity se obtiene de aquí. La fórmula de brillo se describe en esta especificación.

Rugosidad

Roughness se calcula a partir de Specular y ShininessExponent mediante esta fórmula. La fórmula es una aproximación de la rugosidad del exponente especular Phong:

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

Metalness

Metalness se calcula a partir de Diffuse y Specular mediante esta fórmula de especificación glTF.

La idea es que se solucione la ecuación: Ax2 + Bx + C = 0. Básicamente, las superficies dieléctricas reflejan aproximadamente el 4 % de la luz de forma especular y el resto se difumina. Las superficies metálicas no reflejan ninguna luz de forma difusa, sino todas de forma especular. Esta fórmula tiene algunas desventajas, ya que no hay ninguna manera de distinguir entre las superficies metálicas satinadas y las de plástico brillante. Suponemos que la mayor parte del tiempo que la superficie tiene propiedades metálicas y, por consiguiente, es posible que las superficies de plástico o caucho brillantes no tengan la apariencia esperada.

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);

Albedo

Albedo se calcula a partir de Diffuse, Specular y Metalness.

Tal y como se describe en la sección Metalness, las superficies dieléctricas reflejan aproximadamente el 4 % de la luz.
Aquí, la idea es interpolar linealmente entre los colores Dielectric y Metal con el valor Metalness como un factor. Si Metalness es 0.0, en función del valor de Specular, será un color oscuro (si el valor es alto) o no se cambiará el valor de Diffuse (si no hay ningún valor de Specular). Si el valor es grande, el color difuso desaparecerá en favor del color especular.

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 se ha calculado con la fórmula anterior, pero el canal alfa requiere más cálculos. El formato FBX es impreciso en cuanto a la transparencia y tiene muchas maneras de definirla. Las distintas herramientas de contenido usan métodos diferentes. La idea es unificarlos en una fórmula. Sin embargo, hace que algunos recursos se representen incorrectamente como transparentes, si no se crean de la forma habitual.

Se calcula a partir de TransparentColor, TransparencyFactorOpacity:

Si se define Opacity, úselo directamente: AlbedoAlpha = Opacity de lo contrario,
Si se define TransparencyColor, AlbedoAlpha = 1.0 - ((TransparentColor.Red + TransparentColor.Green + TransparentColor.Blue) / 3.0) de lo contrario.
si TransparencyFactor, entonces AlbedoAlpha = 1,0 - TransparencyFactor

El color de Albedo final tiene cuatro canales, que combina el valor AlbedoRGB con el de AlbedoAlpha.

Resumen

Para resumir aquí, Albedo estará muy cerca del valor Diffuse original, si Specular está cerca de cero. De lo contrario, la superficie parecerá metálica y perderá el color difuso. La superficie tendrá un aspecto más pulido y reflectante si ShininessExponent es lo suficientemente grande y Specular es brillante. De lo contrario, la superficie será más rugosa y apenas reflejará el entorno.

Problemas conocidos

  • La fórmula actual no funciona bien para geometrías de color simple. Si Specular es suficientemente brillante, todas las geometrías se convierten en superficies metálicas reflectantes sin ningún color. La solución alternativa en este caso es reducir Specular al 30 % del original o usar la configuración de conversión fbxAssumeMetallic.
  • Los materiales de PBR se agregaron recientemente a las herramientas de creación de contenido Maya y 3DS Max. Usan propiedades de caja negra personalizadas definidas por el usuario para pasarlos a FBX. Azure Remote Rendering no lee estas propiedades porque no están documentadas y el formato es de código cerrado.

Pasos siguientes