Material Spatial

Introducción

SpatialMaterial es un material 3D y su objetivo es que los artistas busquen la mayoría de las características en un material. Además, puede convertirse a código de shader y modificarse si se necesita agregar funcionalidades adicionales.

Este tutorial intentará cubrir la mayoría de los parámetros presentes en SpatialMaterial.

Hay 4 maneras de añadir un SpatialMaterial a un objeto. Se puede añadir en la propiedad Material de la malla. Se puede añadir en la propiedad Material del nodo que utiliza la malla (como un nodo MeshInstance), o en la propiedad Material Override del nodo que utiliza la malla.

../../_images/add_material.png

Si se añade un material a la propia malla, cada vez que se utilice esa malla tendrá ese material. Si añade un material al nodo usando la malla, el material sólo será usado por ese nodo, también anulará la propiedad de material de la malla. Si se añade un material en la propiedad Material Override del nodo, sólo será usado por ese nodo. También anulará la propiedad material regular del nodo y la propiedad material de la malla.

La propiedad Material Overlay permite renderizar un material sobre el que actualmente se está utilizando en el malla. Por ejemplo, esto se puede utilizar para aplicar un efecto de escudo transparente en una malla.

Indicadores

Los materiales spatial tienen muchos indicadores que determinan la utilización general de un material.

../../_images/spatial_material1.png

Transparente

En Godot, los materiales no son transparentes a menos que se configuren específicamente de esta forma. La razón principal es que los materiales transparentes son renderizados usando una técnica diferente (ordenados de atrás hacia adelante y renderizados en orden).

Esta técnica es menos eficiente (ocurren muchos cambios de estado) y hace que los materiales sean inutilizables con muchos efectos intermedios y posteriores (como SSAO, SSR, etc.) que requieren una geometría perfectamente opaca.

Por esta razón, los materiales en Godot se muestran opacos a menos que se especifique lo contrario. Los principales ajustes que permiten la transparencia son:

  • Opción Transparent (esta)

  • Modo de mezcla (blend mode) configurado en otro que no sea "Mix"

  • Activar el desvanecimiento de la distancia o la proximidad

Usar la sombra para la opacidad

La iluminación modifica el alfa para que las áreas sombreadas sean opacas y las no sombreadas sean transparentes. Útil para superponer sombras a una cámara en AR.

Unshaded (Sin sombra)

En la mayoría de los casos, es común que los materiales se vean afectados por la iluminación (shaded).

Algunas veces, uno puede querer mostrar sólo el albedo (color) e ignorar el resto. Al activar esta opción, se eliminarán todo el shading y se mostrará el color puro, sin iluminación.

../../_images/spatial_material26.png

Vertex Lighting (Iluminación de vértices)

Godot tiene un coste por píxel más o menos constante (gracias al paso previo de profundidad o depth pre-pass). Todos los cálculos de iluminación se realizan ejecutando el shader de iluminación en cada píxel.

Dado que estos cálculos son costosos, el rendimiento puede reducirse considerablemente en algunos casos particulares, como el dibujo de varias capas de transparencia (común en los sistemas de partículas). Cambiar a iluminación por vértice (per-vertex) puede ayudar en estos casos.

Además, en dispositivos móviles o de gama baja, el cambio a vertex lighting puede aumentar considerablemente el rendimiento del renderizado.

../../_images/spatial_material2.png

Hay que tener en cuenta que cuando la vertex lighting está activado, sólo directional lighting (iluminación direccional) puede producir sombras (por razones de rendimiento).

Sin prueba de profundidad

Para que los objetos cercanos aparezcan sobre objetos lejanos, se realiza una prueba de profundidad. Deshabilitarlo tiene como resultado que los objetos aparezcan por encima (o por debajo) de todo lo demás.

Desactivar esto tiene más sentido para dibujar indicadores en el espacio del mundo (world space), y funciona muy bien con la propiedad "Render Priority" de Material (ver abajo).

../../_images/spatial_material3.png

Usar Point Size (Tamaño de punto)

Esta opción sólo es efectiva cuando la geometría representada está hecha de puntos (generalmente sólo está hecha de triángulos cuando se importa desde DCCs 3D). Si es así, entonces los puntos pueden ser dimensionados (ver abajo).

World Triplanar (Mundo Triplanar)

Cuando se utiliza el mapeo triplanar (ver abajo, en los ajustes UV1 y UV2), el triplanar se calcula en el espacio local del objeto (local space). Esta opción hace que los triplanares trabajen en el espacio del mundo.

Fixed Size (Tamaño fijo)

Esto hace que el objeto renderizado tenga el mismo tamaño sin importar la distancia. Es especialmente útil para indicadores (sin prueba de profundidad y alta prioridad de renderizado) y algunos tipos de billboards.

Do Not Receive Shadows (No recibir sombras)

Hace que el objeto no reciba ningún tipo de sombra que de otro modo sería proyectada sobre él.

Desactivar Luz Ambiental

Hace que el objeto no reciba ningún tipo de luz ambiental que de otro modo sería lo iluminaría.

Asegura Normales Correctas

Fija las normales cuando se utiliza una escala no uniforme.

Color del vértice

Esta opción permite elegir lo que se hace por defecto en los colores de los vértices que provienen de su aplicación de modelado 3D. Por defecto, se ignoran.

../../_images/spatial_material4.png

Use as Albedo (Usar como Albedo)

Esta opción hace que el color del vértice se utiliza como color del albedo.

Es sRGB

La mayoría de los DCCs 3D probablemente exportarán los colores de los vértices como sRGB, por lo que activar esta opción ayudará a que se vean correctamente.

Parámetros

SpatialMaterial también tiene varios parámetros que pueden configurarse para ajustar muchos aspectos del renderizado:

../../_images/spatial_material5.png

Diffuse Mode (Modo difuso)

Especifica el algoritmo utilizado por la dispersión difusa de la luz al golpear el objeto. El predeterminado es Burley. También hay otros modos disponibles:

  • Burley: Modo predeterminado, el algoritmo difuso original de Disney Principled PBS.

  • Lambert: No se ve afectado por la rugosidad.

  • Lambert Wrap: Extiende Lambert para cubrir más de 90 grados cuando la rugosidad es mayor. Funciona muy bien para el cabello y simula la dispersión a bajo costo de la superficie. Esta implementación es para conservar energía.

  • Oren Nayar: El objetivo de esta implementación es tener en cuenta el microsurfacing (a través de la rugosidad). Funciona bien con materiales similares a la arcilla y algunos tipos de tela.

  • Toon: Proporciona un acabado duro para la iluminación, con alisado afectado por la rugosidad. Se recomienda desactivar la influencia del cielo en la configuración de la luz ambiental del entorno o desactivar la luz ambiental en el material spatial para lograr un mejor efecto.

../../_images/spatial_material6.png

Specular Mode (Modo Specular)

Especifica cómo se renderizará el specular blob. El specular blob representa la forma de una fuente de luz reflejada en el objeto.

  • **ShlickGGX:**El blob más común usado por los motores PBR 3D hoy en día.

  • Blinn: Común en motores de generaciones anteriores. No vale la pena usarlo hoy en día, pero lo hemos dejado por motivos de compatibilidad.

  • Phong: Igual que arriba.

  • Toon: Crea un blob toon, que cambia de tamaño dependiendo de la rugosidad.

  • Disabled: A veces, el reflejo molesta. ¡Desaparece!

../../_images/spatial_material7.png

Modo de Fusión

Controla el modo de mezcla para el material. Hay que tener en cuenta que cualquier otro modo que no sea Mix obliga al objeto a pasar por el pipeline transparente.

  • Mix: Modo de mezcla por defecto, alpha controla cuánto es visible el objeto.

  • Add: El objeto es mezclado de manera aditiva, bueno para efectos de destellos o similares al fuego.

  • Sub: El objeto es substraído.

  • Mul: El objeto es multiplicado.

../../_images/spatial_material8.png

Modo de Sacrificio

Determina qué lado del objeto no se dibuja cuando se procesan las backfaces:

  • Back: La parte posterior del objeto no es dibujada cuando no es visible (por defecto).

  • Front: La parte frontal del objeto no es dibujada cuando no es visible.

  • Disabled: Utilizado para objetos de doble cara (no se realiza ningún proceso de culling).

Nota

Por defecto, Blender tiene la opción de culling (ocultación de caras posteriores) desactivada en los materiales y exportará los materiales para que coincidan con cómo se renderizan en Blender. Esto significa que los materiales en Godot tendrán su modo de culling establecido en Disabled. Esto puede disminuir el rendimiento ya que las caras posteriores se renderizarán incluso cuando estén siendo ocultadas por otras caras. Para resolver esto, habilita Backface Culling (ocultación de caras posteriores) en la pestaña de Materiales de Blender y luego exporta la escena nuevamente a glTF.

Modo de Dibujo Profundo

Especifica cuándo se debe realizar el renderizado de profundidad.

  • Opaque Only (predeterminado): Sólo se dibuja la profundidad en objetos opacos.

  • Always: El dibujo de profundidad se realiza tanto para objetos opacos como transparentes.

  • Never: No se realiza ningún dibujo de profundidad (nota: no confundir con la opción No Depth Test anterior).

  • Depth Pre-Pass: En el caso de los objetos transparentes, primero se hace un pase opaco con las partes opacas y luego se dibuja la transparencia por encima. Esta opción se puede utilizar con césped transparente o follaje de árboles.

../../_images/material_depth_draw.png

Line Width (Ancho de línea)

Al dibujar líneas, especifica un ancho de las líneas que se están dibujando. Esta opción no está disponible en la mayoría del hardware moderno.

Point Size (Tamaño de puntos)

Cuando se dibujen puntos, hay que especificar el tamaño del punto en píxeles.

Modo Billboard

Activa billboard mode para materiales de dibujo. Esto controla la forma en que el objeto mira hacia la cámara:

  • Disabled: Billboard mode está desactivado.

  • Enabled: Billboard mode está activado, el eje -Z del objeto siempre estará mirando a la cámara.

  • Y-Billboard: el eje X del objeto siempre estará alineado con la cámara.

  • Particles: Usado en sistemas de partículas, porque permite especificar opciones de animación.

../../_images/spatial_material9.png

Las opciones anteriores sólo están habilitadas para Particle Billboard.

Cartel Mantiene la Escala

Permite escalar una malla en modo cartelera.

Crece

Hace que los vértices del objeto crezcan en la dirección señalada por sus normales:

../../_images/spatial_material10.png

Esto se utiliza comúnmente para crear contornos de bajo costo. Añade una segunda pasada al material, hazlo negro y sin sombrear, invierte el desechado de caras (Cull Front), y añade algo de tamaño:

../../_images/spatial_material11.png

Usar Alpha Scissor

Cuando no se necesita una transparencia distinta de 0 o 1, es posible establecer un umbral para evitar que el objeto muestre píxeles semi transparentes.

../../_images/spatial_material12.png

Esto renderiza el objeto a través del pipeline opaco que es más rápido y permite realizar efectos de medio y post proceso como SSAO, SSR, etc.

Color de materiales, mapas y canales

Además de los parámetros, lo que define a los materiales mismos son los colores, texturas y canales. Godot soporta una extensa lista de ellos. A continuación se describen con más detalle:

Albedo

Albedo es el color base del material, sobre lo que trabaja todo lo demás. Cuando se establece en Unshaded, este es el único color que es visible. En versiones anteriores de Godot, este canal se llamaba Diffuse. El cambio de nombre se produjo principalmente porque, en PBR (Physically Based Rendering), este color afecta a muchos más cálculos que sólo la ruta de iluminación difusa.

El color y la textura del albedo se pueden utilizar juntos a medida que se multiplican.

El Alpha channel en el color y la textura del albedo también se utiliza para la transparencia del objeto. Si se utiliza un color o una textura con alpha channel, asegúrate de habilitar la transparencia o alpha scissoring para que funcione.

Metálico

Godot utiliza un modelo metálico en lugar de otros conocidos, por su simplicidad. Este parámetro define qué tan reflectantes son los materiales. Cuanto más reflectante es, menos es afectado por la luz difusa/ambiental y mayor es el reflejo. Este modelo se llama "energy-conserving" (conservador de energía).

El parámetro Specular es sólo una cantidad general para la reflectividad (a diferencia de Metallic, éste no ahorra energía, así que simplemente déjalo en 0.5 y no lo toques a menos que lo necesites).

El mínimo de reflectividad interna es de 0.04, por lo que (al igual que en la vida real) es imposible hacer un material completamente antirreflectante.

../../_images/spatial_material13.png

Rugosidad

Roughness (rugosidad) afecta principalmente a la forma en que se produce el reflejo. Un valor de 0 lo convierte en un espejo perfecto, mientras que un valor de 1 difumina completamente el reflejo (simulando una microsuperficie natural). Los tipos más comunes de materiales se pueden lograr con la combinación correcta de Metallic y Roughness.

../../_images/spatial_material14.png

Emisión

Emission especifica cuánta luz es emitida por el material (Ten en cuenta que esto no incluye la luz que rodea a la geometría a menos que se utilice Usando GIProbe). Este valor se añade a la imagen final resultante y no se ve afectado por otra iluminación en la escena.

../../_images/spatial_material15.png

Normal map

El mapeo de normales (normal mapping) permite establecer una textura que representa detalles de forma más precisos. Esto no modifica la geometría, sólo el ángulo de incidencia de la luz. En Godot, sólo los canales rojo (red) y verde (green) se utilizan para mapas normales, con el fin de lograr una mayor compatibilidad.

../../_images/spatial_material16.png

Nota

Godot requiere que el mapa de normales (normal map) utilice las coordenadas X+, Y+ y Z+ (estilo OpenGL). Esto se conoce como estilo OpenGL. Si has importado un material creado para ser utilizado con otro motor, es posible que esté en estilo DirectX, en cuyo caso el mapa de normales necesita ser convertido para que su eje Y esté invertido.

Más información sobre mapa de normales (incluyendo la tabla de orden de coordenadas para motores populares) se puede encontrar aquí.

Rim

Algunos tejidos tienen micropelículas que hacen que la luz se disperse a su alrededor. Godot emula esto con el parámetro Rim. A diferencia de otras implementaciones de iluminación de bordes que sólo utilizan el canal de emisión, éste en realidad tiene en cuenta la luz (si no hay luz, no hay borde). Esto hace que el efecto sea mucho más creíble.

../../_images/spatial_material17.png

El tamaño del Rim depende de Roughness, y hay un parámetro especial para especificar cómo debe ser coloreado. Si Tint es 0, el color de la luz se utiliza para el Rim. Si tint es 1, entonces se utiliza el albedo del material. El uso de valores intermedios generalmente funciona mejor.

Clearcoat

Esta característica sólo está disponible cuando se utiliza el backend GLES3.

El parámetro Clearcoat se utiliza principalmente para añadir una pasada secundaria de recubrimiento transparente al material. Esto es común en la pintura de automóviles y juguetes. En la práctica, es un specular blob más pequeño añadido sobre el material existente.

El efecto es extremadamente sutil en las versiones de Godot 3 y puede requerir una iluminación específica o mirar un material de una manera particular para notar una diferencia. Esto se puede observar en la siguiente imagen donde el clearcoat está activado en la derecha.

../../_images/clearcoat_comparison.png

Nota

El efecto será más notable en Godot 4.

Anisotrópico

Esta característica sólo está disponible cuando se utiliza el backend GLES3.

Esto cambia la forma del specular blob y lo alinea con el espacio tangencial. Anisotropy se utiliza comúnmente con cabello, o para hacer que materiales como el aluminio pulido sean más realistas. Funciona especialmente bien cuando se combina con flowmaps.

../../_images/spatial_material18.png

Oclusión Ambiental

Es posible especificar un mapa de oclusión ambiental bakeado. Este mapa afecta la cantidad de luz ambiental que llega a cada superficie del objeto (no afecta la luz directa por defecto). Si bien es posible utilizar la oclusión ambiental en el espacio de la pantalla (SSAO) para generar Ambient Occlusion, nada superará la calidad de un mapa de AO bien bakeado. Se recomienda prebakear Ambient Occlusion siempre que sea posible.

../../_images/spatial_material19.png

Profundidad

Esta característica sólo está disponible cuando se utiliza el backend GLES3.

Establecer un mapa de profundidad a un material genera una búsqueda ray-marched para emular el desplazamiento adecuado de las cavidades a lo largo de la dirección de la vista. Esto no es una verdadera geometría añadida, sino una ilusión de profundidad. Puede que no funcione para objetos complejos pero produce un efecto de profundidad realista para texturas. Para obtener mejores resultados, se debe utilizar Depth junto con normal mapping.

../../_images/spatial_material20.png

Dispersión Subsuperficial

Esta característica sólo está disponible cuando se utiliza el backend GLES3.

Este efecto emula la luz que penetra la superficie de un objeto, se dispersa y luego sale. Es útil para hacer pieles realistas, mármol, líquidos de colores, etc.

../../_images/spatial_material21.png

Transmisión

Controla cuánta luz del lado iluminado (visible a la luz) se transfiere al lado oscuro (lado opuesto a la luz). Esto funciona bien para objetos delgados como hojas de árboles/plantas, césped, orejas humanas, etc.

../../_images/spatial_material22.png

Refracción

Esta característica sólo está disponible cuando se utiliza el backend GLES3.

Cuando refraction está habilitada, reemplaza alpha blending, y Godot intenta obtener información desde detrás del objeto que se está renderizando en su lugar. Esto permite distorsionar la transparencia de manera similar a la refracción en la vida real.

Remember to use a transparent albedo texture (or reduce the albedo color's alpha channel) to make refraction visible, as refraction relies on transparency to have a visible effect.

A normal map can optionally be specified in the Refraction Texture property to allow distorting the refraction's direction on a per-pixel basis.

../../_images/spatial_material23.png

Nota

Refraction is implemented as a screen-space effect and forces the material to be transparent. This makes the effect relatively fast, but this results in some limitations:

  • Transparency sorting issues may occur.

  • The refractive material cannot refract onto itself, or onto other transparent materials. A refractive material behind another transparent material will be invisible.

  • Off-screen objects cannot appear in the refraction. This is most noticeable with high refraction strength values.

  • Opaque materials in front of the refractive material will appear to have "refracted" edges, even though they shouldn't.

Detail

Godot permite usar un albedo y normal map secundarios para generar texturas detalladas, las cuales pueden ser mezcladas de muchas maneras. Combinado con UV secundario o modo triplanar, se pueden lograr muchas texturas interesantes.

../../_images/spatial_material24.png

Hay varios ajustes que controlan el uso de los detalles.

Máscara: La máscara de detalle es una imagen en blanco y negro que se utiliza para controlar dónde tiene lugar la mezcla en una textura. El blanco es para las texturas de detalle, el negro es para las texturas materiales regulares, los diferentes tonos de gris son para la mezcla parcial de las texturas materiales y las texturas de detalle.

Modo de fusión: Estos cuatro modos controlan cómo se mezclan las texturas.

  • Mezclar: Combina los valores de los píxeles de ambas texturas. En negro, sólo muestra la textura del material, en blanco, sólo muestra la textura del detalle. Los valores de gris crean una mezcla suave entre los dos.

  • Add: Añade los valores de los píxeles de una textura con la otra. A diferencia del modo mix, ambas texturas se mezclan completamente en las partes blancas de una máscara y no en las partes grises. La textura original es mayormente sin cambios en el negro

  • Sustracción: resta los valores de los píxeles de una textura con la otra. La segunda textura se sustrae completamente en las partes blancas de una máscara con sólo una pequeña sustracción en las partes negras, siendo las partes grises diferentes niveles de sustracción basados en la textura exacta.

  • Mul: Multiplica los números de canal RGB de cada píxel de la textura superior por los valores del píxel correspondiente de la textura inferior.

Albedo: Aquí es donde pones una textura de albedo que quieres mezclar. Si no hay nada en esta ranura se interpretará como blanco por defecto.

Normal: Aquí es donde pones una textura normal que quieres mezclar. Si no hay nada en esta ranura se interpretará como un mapa plano normal. Esto puede ser usado incluso si el material no tiene el mapa normal habilitado.

UV1 y UV2

Godot soporta dos canales UV por material. Los UV secundarios son a menudo útiles para ambient occlusion o emission (baked light). Los UVs pueden ser escalados y desplazados, lo que es útil en texturas con repetición.

Mapeado Triplanar

El mapeo triplanar es compatible tanto para UV1 como para UV2. Esta es una forma alternativa de obtener coordenadas de textura, a menudo llamada "Autotexture". Las texturas son muestreadas en X, Y y Z y mezcladas por la normal. El mapeo triplanar puede ser espacio de mundo o espacio de objeto.

En la imagen de abajo, puedes ver cómo todos los primitivos comparten el mismo material con el triplanar del mundo, para que los la textura pueda continuar con suavidad entre las partes.

../../_images/spatial_material25.png

Desvanecimiento de proximidad y distancia

Godot permite que los materiales se desvanezcan por proximidad entre ellos, además de hacerlo por la distancia con el observador. El desvanecimiento por proximidad es útil para efectos como partículas suaves o masas de agua que se mezclen de forma suave con la orilla. El desvanecimiento por distancia es útil para entradas de luz o indicadores que solo están presentes a cierta distancia.

Hay que tener en cuenta que habilitarlos también activa alpha blending, por lo que abusar de ellos durante toda una escena no suele ser una buena idea.

../../_images/spatial_material_proxfade.gif

Prioridad de Renderización

El orden de renderizado de los objetos se puede cambiar, esto es útil sobre todo para los objetos transparentes (u objetos opacos que dibujan en profundidad pero no en color, como grietas en el suelo).