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,0721DiffuseBrightness
= 0,299 *Diffuse
.Rojo2 + 0,587 *Diffuse
.Verde2 + 0,114 *Diffuse
.Azul2SpecularBrightness
= 0,299 *Specular
.Rojo2 + 0,587 *Specular
.Verde2 + 0,114 *Specular
.Azul2SpecularStrength
= 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
, TransparencyFactor
Opacity
:
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 reducirSpecular
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
y3DS 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.