Las funciones materiales te permiten empaquetar partes de un gráfico de material en un recurso reutilizable que puedes compartir con una biblioteca e insertar fácilmente en otros materiales. Su objetivo es optimizar la creación de material dando acceso instantáneo a redes de nodos de material utilizadas frecuentemente.
Por ejemplo, la función Blend_Overlay que se muestra a continuación contiene toda la red de expresión de material mostrada en la parte derecha de la imagen. En vez de construir esta red de nodos una y otra vez, puedes insertarla directamente en tu gráfico desde la biblioteca de funciones materiales.
Las funciones se editan en el editor de material como un material normal, pero con algunas restricciones sobre los nodos que puedes utilizar. Cuando se utilizan correctamente, pueden reducir la redundancia de material, lo que, a su vez, reduce el esfuerzo de mantenimiento del artista. Las funciones materiales mantienen sincronizadas las expresiones duplicadas, lo que impide los inevitables errores que surgen cuando se pasa por alto un duplicado durante una modificación.
Las funciones materiales son una clase de recurso diferente del explorador de contenido. Sus gráficos son similares a los materiales, pero difieren en un aspecto importante. En vez de un nodo de material principal, las funciones materiales tienen nodos FunctionOutput, que aparecen como pines de salida en el nodo de función material final cuando se utiliza en un material.
Pensar en una función material como en la caja de un proyecto de electrónica puede ayudar. Puedes añadir las entradas y las salidas que consideres necesarias. El corazón de la función es la red de expresión de material entre esas entradas y esas salidas. Este ejemplo toma dos capas y las mezcla como una mezcla de pantalla de Photoshop. La función resume los detalles de un artista, por lo que no es necesario conocer las matemáticas de una mezcla de pantalla para utilizar una operación de mezcla de pantalla.
Nodos de entrada (1) y salida (2) de la función material.
Como puedes ver arriba, lo que pasa entre la entrada y la salida depende totalmente de ti, y lo definirá cualquier red de nodos de expresión de material estándar. Cuando insertes una función material en un material, solo verás el nodo de llamada de función material con sus entradas y sus salidas. El resto del gráfico está oculto en la función.
Biblioteca de funciones materiales
Una vez finalizada tu función material, puedes publicarla en la biblioteca de funciones materiales para acceder a ella fácilmente durante la creación de material. La biblioteca de funciones materiales está en la paleta de la parte derecha del editor de material. La paleta contiene una lista categorizada y filtrable de las funciones materiales disponibles. Esta lista se rellena a partir de las funciones cargadas, pero también a partir de las funciones materiales predeterminadas de la base de datos del explorador de contenido.
Puedes colocar el cursor sobre estas entradas para ver su descripción como mensaje con información, o arrastrar y soltar una en tu material.
Para que una función material aparezca en la biblioteca de funciones materiales, debe marcarse su propiedad Exponer a biblioteca. En el editor de funciones materiales, anula la selección de todos los nodos haciendo clic en un espacio vacío del gráfico para mostrar las propiedades básicas de la función material. La opción Exponer a biblioteca está en el panel de detalles.
Si quieres ver la lista completa de las funciones que existen en la biblioteca de funciones materiales de forma predeterminada, consulta la Referencia de funciones materiales.
Nodos relacionados con funciones
A continuación indicamos los nodos de expresión de material relacionados con funciones materiales, junto con su finalidad:
- MaterialFunctionCall: permite utilizar una función externa de otro material u otra función. Los nodos de entrada y salida de la función externa se convierten en entradas y salidas del nodo de llamada de función.
- FunctionInput: solo se puede colocar en una función material, donde define uno de los pines de entrada de la función.
- FunctionOutput: solo se puede colocar en una función material, donde define uno de los pines de salida de la función.
- TextureObject: útil para proporcionar una textura predeterminada para una entrada de función de textura en una función. Este nodo no muestrea realmente la textura, por lo que debe utilizarse junto con un nodo TextureSample.
- TextureObjectParameter: define un parámetro de textura y su salida es el objeto de textura, utilizado en materiales que llaman a una función con entradas de texturas. Este nodo no muestrea realmente la textura, por lo que debe utilizarse junto con un nodo TextureSample.
- StaticSwitch: realiza una elección de tiempo de compilación entre dos entradas, según el valor de la entrada.
- StaticBool: útil para proporcionar un valor booleano predeterminado para una entrada de función booleana estática en una función. Este nodo no alterna entre nada, por lo que debe utilizarse junto con un nodo StaticSwitch.
- StaticBoolParameter: define un parámetro booleano estático y su salida es el valor booleano estático, utilizado en materiales que llaman a una función con entradas booleanas estáticas. Este nodo no alterna entre nada, por lo que debe utilizarse junto con un nodo StaticSwitch.
Entrada y salida
Como las funciones materiales son redes encapsuladas de nodos, el usuario debe asegurarse de que los datos puedan entrar en ellas y salir de ellas. Esto se hace con los nodos FunctionInput y FunctionOutput. Comprender estos nodos es fundamental para utilizar las funciones materiales.
En la propia función material, los nodos FunctionInput y FunctionOutput aparecen así:
Cuando se utiliza la función material en un material, los nodos FunctionInput y FunctionOutput aparecen como pines de entrada y salida en el nodo de función material:
Nodos FunctionInput
Como hemos dicho, los nodos FunctionInput son la puerta por la que entran los datos en una función material. Una función puede tener cualquier cantidad de nodos de entrada, cada uno correspondiente a un pin de entrada del nodo de llamada de función material.
Los nodos FunctionInput tienen las siguientes propiedades y los siguientes pines de datos:
| Elemento | Descripción |
|---|---|
| Propiedades | |
| Nombre de entrada | El nombre de la entrada, que es visible como pin de salida en la función material cuando se utiliza en un material. |
| Descripción | Una descripción de la entrada, que es visible como mensaje con información cuando colocas el cursor sobre el pin de entrada correspondiente en el nodo de función material. |
| Tipo de entrada | Define qué tipo de datos acepta la entrada. Consulta Tipos de entrada a continuación. |
| Valor de vista previa | Permite realizar pruebas y ayuda a visualizar qué hace la función durante el proceso de construcción. Los valores introducidos aquí se utilizan como si procedieran de una entrada situada fuera de la función. |
| Utilizar valor de vista previa como valor predeterminado | Esta casilla de verificación permite que los datos introducidos en el valor de vista previa sean el valor predeterminado. Esto es útil si no quieres obligar al usuario a proporcionar una entrada en la función para este valor. |
| Prioridad de orden | Este número se utiliza para controlar el orden en el que se muestran los pines de entrada en el nodo de función material. El orden va de menor a mayor. |
| Pines de entrada | |
| Vista previa | Los datos introducidos en esta entrada sustituyen a la propiedad de valor de vista previa. Igual que su propiedad asociada, esto es útil para probar la función durante la construcción y configurar valores predeterminados. |
| Pines de salida | |
| (Sin etiqueta) | Esto proporciona la salida para los datos entrantes que procesará la función. |
Nodos FunctionOutput
Un nodo FunctionOutput proporciona el medio para que los datos de una función material salgan de la función y sean utilizados en un material. Es decir: su salida es el resultado final de la función material. Igual que en los nodos FunctionInput, una función puede tener cualquier cantidad de nodos de salida, que producirá cualquier cantidad de pines de salida posibles.
Cuando se selecciona un nodo FunctionOutput, en el panel de detalles se puede acceder a las propiedades que se indican a continuación.
| Elemento | Descripción |
|---|---|
| Salida de función de expresión de material | |
| Nombre de salida | El nombre de la salida, que es visible como pin de salida en la función material cuando se utiliza en un material. |
| Descripción | Una descripción de la salida, que se muestra como mensaje con información cuando colocas el cursor sobre el pin de salida correspondiente en el nodo de función material. |
| Expresión de material | |
| Prioridad de orden | Este número se utiliza para controlar el orden en el que se muestran los pines de salida en el nodo de función material. El orden va de menor a mayor. |
| Descripción | Este campo de descripción define el texto de la burbuja de comentarios del nodo. Esto solo es visible en el editor de funciones materiales. |
| Pines de salida | |
| (Sin etiqueta) | Esto proporciona la salida para los datos entrantes que procesará la función. |
Tipos de entrada
Las entradas tienen un tipo especificado que se requiere a todas las expresiones conectadas a ellas. Para definir el tipo de entrada, selecciona un nodo FunctionInput en el editor de funciones materiales y utiliza el desplegable Tipo de entrada para seleccionar una opción.
Cuando se llama al tipo de entrada en un material, este se muestra como abreviatura junto a los conectores de la entrada. En este caso, las dos entradas eran de Vector3, por lo que se muestra V3. Cualquier cosa conectada a una entrada cuando se utiliza en un material debe ser convertible al tipo de entrada correcto, o recibirás un error.
A continuación se indican los tipos de entrada disponibles y sus abreviaturas:
| Tipo de entrada | Abreviatura |
|---|---|
| Scalar | S |
| Vector2 | V2 |
| Vector3 | V3 |
| Vector4 | V4 |
| Texture2D | T2D |
| TextureCube | TCube |
| Texture2DArray | T2dArr |
| VolumeTexture | TVol |
| StaticBool | B |
| MaterialAttributes | MA |
| TextureExternal | TExt |
Propiedades comunes
Al editar una función material, si anulas la selección de todos los nodos o haces clic en el fondo del gráfico de material, las propiedades básicas de la función se verán en el panel de detalles.
| Elemento | Descripción |
|---|---|
| Propiedades | |
| Descripción | Esta descripción se mostrará como mensaje con información cuando los usuarios coloquen el cursor sobre la función material en la paleta o sobre el cuerpo del nodo de llamada de función en el editor de material. |
| Exponer a biblioteca | Si se marca este cuadro, la función material aparecerá en la lista de funciones materiales dentro de la paleta del editor de material para que puedas insertarla en materiales. Es posible que debas reiniciar el editor para que aparezca una nueva función. |
| Categorías de biblioteca | Esta matriz contiene todas las categorías de la pestaña de funciones materiales en la que aparecerá esta función. |
Vista previa
Cuando se edita una función material, el visor de vista previa muestra los nodos que se estén previsualizando. Puedes hacer clic con el botón derecho en cualquier nodo y seleccionar Iniciar vista previa de nodo para previsualizar los resultados de la red de materiales hasta ese punto.
La mayor parte de las veces, querrás previsualizar la salida de la función o el resultado final de la función material. El nodo de salida de la función material se previsualiza de forma predeterminada.
Vista previa de entrada de función
Los nodos de entrada de función tienen algunas opciones para especificar valores de vista previa, pues no conocen los valores reales que utilizarán los artistas en el material. Cada entrada tiene un Valor de vista previa integrado que puedes utilizar para mostrar una constante en los tipos de entrada float. Las entradas de función también tienen un conector de 'Vista previa' que te permite anular el valor integrado y sustituirlo por cualquier valor que coincida con el tipo de entrada. En este ejemplo, se utilizan muestras de textura para proporcionar un valor de vista previa a las dos entradas Vector3.
Ten en cuenta que la entrada tiene una opción en el panel de detalles para Utilizar valor de vista previa como valor predeterminado. Cuando se activa esta opción, el valor de vista previa se utiliza siempre que se llama a la función en un material y no hay nada conectado a esa entrada. El valor de vista previa actúa como reserva e impide los errores de compilación cuando no hay nada conectado a la entrada. Esto convierte a la entrada en una entrada opcional, por lo que se dibuja en gris.
Parámetros
Puedes utilizar Parámetros en una función material igual que en un material normal. Estos parámetros se pasan directamente a cualquier material para utilizarlos. Existen algunas pequeñas diferencias en el procedimiento de uso de los parámetros de textura.
Parámetros de textura
Para utilizar un parámetro de textura en una función material, crea un nodo FunctionInput y cambia el tipo de datos a Texture2D. Conéctalo al pin de anulación de objeto de textura de un nodo de Muestra de textura.
Cuando utilices esa función material en un material, coloca un nodo TextureObjectParameter y conéctalo al pin de entrada Texture2D en la función material.
Parámetro booleano estático
De forma similar, para los parámetros de interruptor estático, crea un FunctionInput y cambia el tipo de entrada a StaticBool. Conéctalo a un nodo StaticSwitch:
En el material que utiliza la función, coloca un nodo StaticBoolParameter y conéctalo a la entrada que acepta un parámetro booleano estático (Activar mosaico en este ejemplo).
Organización
Por diseño, muchos artistas y compañeros de equipo que no participaron en la creación de la función utilizan con frecuencia funciones materiales. Por eso, es importante proporcionar buena documentación sobre lo que hacen las funciones y sobre los valores requeridos para sus entradas y sus salidas. Por este motivo, las funciones tienen varios campos de documentación sobre el nombre de función y los nombres de entrada/salida:
Descripción de función
Las funciones materiales tienen un campo Descripción en el que puedes documentar lo que hace la función. Para añadir una descripción, haz clic en una zona vacía del gráfico de material cuando edites una función material. Así, se mostrarán las propiedades de la función en el panel de detalles, donde podrás introducir una descripción en el campo.
El texto de la descripción se muestra como mensaje con información cuando colocas el cursor sobre el nodo de llamada de función material en un gráfico de material.
Descripciones de entrada y salida
Puedes añadir un nombre y una descripción para los pines de entrada y salida de tu función material. Cuando edites una función material, selecciona un nodo de entrada o salida en el gráfico de material. En el panel de detalles, rellena los campos Nombre de entrada y Descripción.
Cuando esta función material se utiliza en un material, cada pin de entrada muestra el nombre que has introducido, y la descripción se muestra como mensaje con información cuando colocas el cursor sobre la entrada.
Cuando editas una función material, tienes a tu disposición todas las herramientas para organizar y documentar tu gráfico de material. Consulta aquí cómo organizar un gráfico de material.
Propagación
Cuando editas una función material y haces clic en el botón Guardar para recompilar y aplicar los cambios, la nueva versión se propaga a todas las funciones o materiales cargados que hacen referencia a esta función material. Los materiales no cargados que hacen referencia a la función se actualizarán con los cambios la próxima vez que se carguen.
Cuando se eliminan de una función una entrada o una salida y los cambios están propagados, dejarán de funcionar los enlaces a estos conectores eliminados en los materiales que utilizan la función. Es importante tener esto en cuenta antes de recompilar una función material, porque la propagación no se puede deshacer. Cuanto mayor sea el número de materiales en los que se utilice una función, mayor será el potencial de errores de funcionamiento, así que ten cuidado.
Todos los materiales cargados que utilizan la función se marcarán como materiales sucios cuando se propague el cambio de la función, lo que puede utilizarse para ver qué paquetes pueden guardarse de nuevo para evitar tiempos de carga mayores. Para buscar todos los materiales cargados que utilizan una función, haz clic con el botón derecho en el Explorador de contenido y elige Buscar materiales que utilizan esto.
Anidamiento de funciones
Puedes anidar funciones materiales en otras funciones y encadenarlas arbitrariamente. La única salvedad es que las funciones materiales no pueden anidarse de forma que creen una dependencia circular.
Errores de compilación
Si hay errores en una función material, se genera un diálogo de error de compilación cuando intentas compilar el material. También aparece un mensaje de error de color rojo sobre la función material que no se ha compilado correctamente. Puedes colocar el cursor sobre el mensaje de error para ver un mensaje con información que describe el error de compilación. En este ejemplo, la función material no recibe datos en ninguna de sus entradas, lo que hace que la compilación falle.
Para evitar los errores anteriores, proporciona valores de vista previa para tus entradas y, a continuación, activa la propiedad Utilizar valor de vista previa como valor predeterminado de cada entrada. Sin embargo, esta práctica puede ser un arma de doble filo, pues no habrá ninguna alerta muy obvia (como un mensaje de error) para recordarte que has dejado desconectada una entrada.
Funciones materiales predeterminadas
Unreal Engine incluye varias decenas de funciones materiales predeterminadas prediseñadas. Se puede acceder a ellas desde Paleta del editor de material o desde el menú de búsqueda contextual.
Si quieres editar una de las funciones materiales predeterminadas, tienes los recursos en el Explorador de contenido, en la carpeta Motor > Contenido > Funciones.
Si se realiza y guarda algún cambio en una función material predeterminada, esos cambios se producirán en todas las instancias de la función. Por este motivo, te recomendamos encarecidamente que hagas una copia duplicada de las funciones predeterminadas cuando quieras realizar cambios.
Si deseas más información sobre las funciones materiales predeterminadas incluidas en Unreal Engine, consulta Referencia de funciones materiales.