Categorías
Informática Internacional Videojuego

Materiales

El material es aquello que hace que una superficie responda a la luz y se comporte visualmente de una cierta manera. En Unreal Engine se busca que imiten lo más posibles las características físicas de las superficies y por eso se hablan de materiales PBR (Physics-Based Rendering). Típicamente se tocan atributos como la metalicidad o rugosidad, el color base (difuso) o emisivo, etc.

Aunque el lenguaje para programar estas «funciones» de materiales es HLSL (high-level shader language), Unreal Engine ofrece un editor de materiales que permite programarlos visualmente. Los modelos de sombrado (shader model) actuales tienen muchas etapas: vertex (ej. cambiar los vértices de sitio -aparentemente porque la colisión no cambia-), hull, tessellation, domain, geometry (ej. cambiar nivel de detalle al vuelo) y pixel (ej. añadir color o transparencia a los «fragmentos» que pronto se volverán píxeles). Algunos nodos (las expresiones de material) son válidos para ejecutarse en más de varias etapas, típicamente pixel shader y vertex shader, como UV Coordinate, aunque la mayoría de nodos de Unreal funcionan solamente en la etapa de pixel shader, . Por el contrario, todo lo que entra por CustomizedUVs del material base, se ejecuta en vertex shader. En la mayoría de los mundos 3D por vértices se hacen menos cálculos que por píxeles, aunque conviene asegurarse de que el efecto final es el que queremos y no de peor calidad.

No conviene programar demasiados materiales base, sino que es mejor reutilizar ese código, parametrizarlo, y crear instancias de material, que a su vez serán constantes o dinámicos si cambian o no durante el juego.

Materiales para el paisaje

Aunque se puede usar cualquier material en un actor Landscape, lo habitual es usar uno que mezcle distintas capas. El más básico podría ser uno como el de este video, que alterna entre arena y hierba.

La mezcla de capas se hace por peso (weight blending) en vez de con transparencia (alpha blending), porque así dar menos protagonismo a una capa implica dárselo a las otras, y nunca llega a quedarse una zona «en negro», sin capa de material aplicada.

Ejemplares de materiales

La manera profesional de trabajar con materiales es crear un conjunto reducido pero muy flexible de materiales genéricos, con los menos pipelines gráficos posibles, y luego crear todos los materiales (Materials) que se usan en el juego exclusivamente como «ejemplares» de los genéricos (Material Instances). De esta manera lo vas a tener cargado casi todo ya desde el comienzo del juego. Eso sí, en Unreal Engine, a diferencia de Unity, no existe un conjunto por defecto de materiales genéricos y se tiende a crear y usar montones de materiales genéricos de paquetes hechos por terceros, aumentando de manera exagerada la cantidad de pipelines gráficos a preparar y para los que precompilar shaders.

Optimizaciones

Desde Unreal Engine 5.2, gracias al Pipeline State Object (PSO) Caching, existe la posibilidad de cachear la información precompilada de los materiales jugando una partida en desarrollo, de manera que cuando el jugador pruebe el juego no note esos «tirones» (por un fotograma que tarda mucho en renderizar –spike-, bajadas irregulares de frameratestutters- o repetición múltiple de un mismo frame congelado -hitching-) tan típicos de cuando se calculan los PSO (compilación de shaders, estados de render…) en tiempo de ejecución. Normalmente se habilita la recolección en el DefaultEngine.ini, se juegan partes del juego en modo manual o automático, se consolida el caché recolectado y al empaquetar el juego se incluyen esos PSOs, de modo que cuando sea jugado no se encuentren los principales tirones. ¡Es algo que incluso desarrolladoras profesionales olvidan hacer en sus productos y Epic Games llegó a publicar un post recordándoselo!

Más información

Se recomienda consultar estos documentos, incluyendo los de la documentación oficial:

Esta página está licenciada bajo CC BY-NC-SA 4.0 por Laboratorios Narratech.