Las instancias de materiales en Unreal Engine se utilizan para cambiar la apariencia de un material sin tener que realizar una recompilación costosa del material.
Si bien no es posible cambiar un material típico sin recompilar (algo que se debe realizar antes de jugar), es posible editar un material parametrizado en una instancia del material sin dicha recompilación. Esto aporta numerosas ventajas para los procesos de trabajo y puede mejorar el rendimiento de los materiales.
Instancia de un material abierta en el editor de instancias de materiales. Es posible personalizar los atributos enumerados en Grupos de parámetros desde esta interfaz.
Algunos tipos de materiales instanciados incluso se pueden cambiar durante el juego como respuesta a los acontecimientos que se producen en el juego (como un árbol cuyo material se ennegrece y se carboniza cuando se quema). Esto aporta una gran flexibilidad en los elementos artísticos.
Herencia de materiales
La relación entre los materiales y las instancias de materiales es una relación jerárquica padre-hijo. Una instancia de material hereda todos sus atributos del material padre (o maestro). Por ejemplo, este es el grafo de material de una de las sillas de atrezo que aparecen en el contenido de inicio:
Todas las instancias de materiales creadas a partir de M_Chair heredan todos los atributos del grafo que se muestra arriba.
Observa las convenciones de nomenclatura que se utilizan arriba. Adoptarlas es una práctica recomendada, ya que permite identificar fácilmente a los materiales padres y a sus instancias en el explorador de contenido.
El prefijo M_ denota un material padre, como en M_Chair.
El prefijo MI_ denota una instancia de material, como en los dos ejemplos que se muestran a la derecha.
Puesto que heredan sus atributos del padre, las instancias de un material recién creadas son idénticas al material padre cuando se aplican a los objetos de un nivel. En la imagen siguiente, la silla del extremo izquierdo tiene el material padre aplicado, mientras que las del centro y de la derecha utilizan instancias del material sin ninguna modificación.
La ventaja clave para el proceso de trabajo de las instancias de materiales es que se pueden personalizar muy rápidamente en el editor de instancias de material sin tener que editar el grafo de nodos ni recompilar el material.
En el vídeo siguiente, se abren las dos instancias del material desde el explorador de contenido y se editan en el editor de instancias de materiales. Los cambios aparecen en el visor principal inmediatamente, mientras que la recompilación de un material estándar podría tardar hasta un minuto, en función de su complejidad.
Parametrización de materiales
Es importante saber que no es posible editar todas las características de una instancia de un material de forma predeterminada. Para poder editar los atributos de un material en una instancia, es necesario designarlos como parámetros en el material padre. Esto se llama parametrización del material.
Un parámetro se crea igual que cualquier otro nodo de datos del editor de materiales y contiene la misma información que su homólogo no parametrizado.
Por ejemplo, una expresión constante contiene un solo valor con coma flotante y, con frecuencia, se utiliza para controlar entradas del material como Rugosidad y Metálico. La versión parametrizada de este nodo se denomina Parámetro escalar.
Expresión constante del material (1) y parámetro escalar (2).
El parámetro escalar también se convierte en un valor con nombre que sirve como conducto para enviar valores de datos hacia una instancia de un material. Es importante asignar un nombre único y descriptivo al parámetro en el panel Detalles. Selecciona el nodo en el grafo de material para acceder a sus propiedades en el panel Detalles.
En el ejemplo anterior, el nombre del parámetro es Rugosidad y tiene un valor predeterminado de 0.25.
En el material parametrizado simple que se muestra a continuación, un parámetro vectorial está conectado a la entrada Color de base, mientras que los parámetros escalares están conectados a Metálico y Rugosidad.
Para ilustrar con más detalle la idea de la parametrización, también se pasa un valor constante 0.5 a la entrada Especular.
Al abrir el editor de instancias de materiales, los tres parámetros están expuestos y son editables, pero la constante, no. Los valores que quieras exponer a los artistas deben ser parámetros y los valores que no quieras que nadie cambie deben permanecer como constantes.
Los parámetros de Color de base, Metálico y Rugosidad son editables en el editor de instancias de materiales, mientras que el valor constante no está expuesto a los artistas.
Tipos de parámetros
Es posible utilizar parámetros en cualquier parte de un grafo de material para aplicar una amplia gama de efectos de materiales.
A continuación, se documentan algunos de los tipos de parámetros clave y aquí puedes consultar una lista completa de las expresiones de parámetros.
Parámetros escalares
Un parámetro escalar es un parámetro que contiene un solo valor expresado en coma flotante. Los parámetros escalares pueden servir para cualquier efecto basado en valores únicos, como sucede con los ejemplos Rugosidad y Metálico anteriores.
Los parámetros escalares también se utilizan, con frecuencia, para controlar el factor multiplicador de un atributo.
En este grafo, se multiplica un parámetro escalar por un color sólido y el resultado se envía a una entrada de Color de emisión. El valor del parámetro escalar controla la intensidad del efecto de emisión. Cuanto mayor es el valor, mayor es el brillo de la emisión.
Parámetros vectoriales
Un parámetro vectorial es un parámetro que contiene un valor vectorial de 4 canales, o cuatro valores expresados en coma flotante.
Por lo general, estos se utilizan para proporcionar colores configurables, pero también se pueden utilizar para representar datos de posición o controlar cualquier efecto que requiera más de un valor.
Parámetros de textura
El parámetro de textura que se utiliza con más frecuencia es TextureSampleParameter2D, que permite cambiar texturas dentro de una instancia de material.
Existen varios tipos adicionales de parámetros de textura disponibles. Cada uno es específico del tipo de textura que acepta o de la forma en que se utiliza. Por ejemplo:
TextureSampleParameterCube acepta un TextureCube o Cubemap.
TextureSampleParameterFlipbook acepta una FlipbookTexture.
TextureSampleParameterMeshSubUV acepta una Texture2D que se utiliza para efectos sub UV con un emisor de malla.
TextureSampleParameterMeshSubUV acepta una Texture2D que se utiliza para efectos de mezcla sub UV con un emisor de malla.
Consulta la Referencia sobre expresiones de materiales para obtener una lista completa de parámetros de textura.
Parámetros estáticos
Los parámetros estáticos se aplican en tiempo de compilación, de modo que se pueden editar en el editor de instancias de materiales pero no desde ninguna secuencia de comandos ni en tiempo de ejecución.
Se pueden utilizar para enmascarar ramificaciones de un material. Por ejemplo, un parámetro de conmutador estático acepta dos entradas. Envía el primer valor hacia la salida si el valor del parámetro es true y el segundo en caso contrario. Esto da lugar a un código mejor optimizado, ya que la rama enmascarada por el parámetro estático no se ejecuta en tiempo de ejecución.
Consulta parámetro de conmutador estático y parámetro de máscara de componente estático para obtener información sobre los tipos de parámetros estáticos específicos.
Un nuevo material se compila para cada combinación de parámetros estáticos del material de base que las instancias utilizan.
Esto puede dar lugar a un número demasiado elevado de sombreadores que es necesario compilar. Intenta minimizar el número de parámetros estáticos del material y el número de permutaciones de estos materiales que se utilizan realmente.
Instancias constantes y dinámicas
Existen dos tipos de instancias de materiales disponibles en Unreal Engine:
Constante de instancia de material: solo se calcula antes del tiempo de ejecución.
Dinámica de instancia de material: se puede calcular (y modificar) en tiempo de ejecución.
Constante de instancia de material
Una constante de instancia de material es una instancia de material que se calcula una sola vez, antes del tiempo de ejecución. Esto significa que no puede cambiar durante el juego. Aunque permanece constante a lo largo del juego, para el rendimiento, todavía presenta la ventaja de que no requiere compilación.
Por ejemplo, si un juego contiene varios coches con distintos acabados de pintura cuyos colores no van a cambiar durante el juego, el mejor enfoque es crear un material maestro que represente los aspectos básicos de una pintura de coche genérica. A continuación, puedes crear constantes de instancia de material para representar las variaciones de los distintos tipos de coche, como distintos colores, niveles variables de rugosidad, etc. Este enfoque se ha mostrado con el ejemplo de las sillas anteriormente en esta página.
Las constantes de instancia de material se crean en el explorador de contenido y se editan en el editor de instancias de materiales.
Instancia de materiales dinámica
Una dinámica de instancia de material (MID) es una instancia de material que se puede calcular durante el juego (en tiempo de ejecución). Esto significa que, durante la partida, se puede usar una secuencia de comandos (código compilado o secuencia de comandos visual de blueprint) para cambiar los parámetros del material, con el fin de alterar el material a lo largo del juego. Las posibles aplicaciones de este proceso son infinitas, desde mostrar distintos niveles de daños hasta cambiar los colores de pintura en una visualización arquitectónica.
Las MID se crean dentro de una secuencia de comandos, ya sea a partir de un material parametrizado o una instancia de material constante. En un blueprint, tomaríamos un material determinado con propiedades parametrizadas y lo utilizaríamos en un nodo Create Dynamic Material Instance. A continuación, el resultado de ese nodo se aplicaría al objeto en cuestión con un nido Set Material. Esto genera un material nuevo que se puede cambiar durante el juego.
Creación y uso de instancias de materiales
La creación y el uso de instancias de materiales es un proceso en dos pasos. En primer lugar, es necesario crear un material padre que utilice expresiones paramétricas para las propiedades que quieras anular en una instancia del material. A continuación, se puede crear una instancia de material y personalizar las propiedades en el editor de instancias de materiales.
Para ver cómo se crea un material parametrizado y se utiliza en una instancia de material, consulta Crear y usar instancias de materiales.