jueves, 16 de septiembre de 2021

De Resogun a Returnal: la magia de los efectos visuales que dio vida a Atropos

https://lh5.googleusercontent.com/UQ2vP_L-SEa-wnGgVvTqDO6XnLWKXuqPzuViHBFsjbvSGKJx-GQ1bDkKy8lTl20gUCTOWGc0djz50xMePplh2OtfvIE42ow6Cz04uRAe9wIpGNJv27LxBLh24rc610fJYoxI_IU=s0

Además de una jugabilidad cautivadora, Housemarque es conocido por sus espectaculares efectos de partículas. Títulos como Resogun, Alienation, Matterfall y Nex Machina utilizaron su propia tecnología de efectos visuales para crear coloridas explosiones en la pantalla con el fin de recompensar a los jugadores por destruir enemigos o completar niveles. En Returnal, Housemarque cambió la cámara vertical por una en tercera persona, pero también por un estilo artístico más aterrizado y oscuro que antes. En este artículo, Risto Jankkila, artista principal de efectos visuales, y Sharman Jagadeesan, programador gráfico senior, nos explican cómo utilizaron su tecnología de efectos visuales para dar vida al planeta alienígena de Atropos y a sus habitantes.

A continuación, puedes encontrar el vídeo completo que trata algunas de las características de los efectos visuales de Returnal. Además, en este artículo profundizaremos un poco más en algunas de esas características.

La historia de nuestra tecnología VFX

Llevamos trabajando en nuestra tecnología de VFX propia desde Resogun (título de lanzamiento de PS4 de 2013), donde se utilizó el primer prototipo de nuestro actual sistema de partículas en algunos de los efectos de muestra. Después de Resogun, el sistema de partículas obtuvo una interfaz gráfica de usuario y empezamos a referirnos a él como Next Gen Particle System (NGP). En 2014 tomamos la decisión de producir todos los efectos de partículas para Alienation con NGP. Tras el lanzamiento de Alienation, el sistema se utilizó para Nex Machina y se portó a Unreal Engine para Matterfall.

NGP está diseñado para ser un sistema de creación de efectos visuales sólo para la GPU, con una sobrecarga mínima para la CPU. Se centra en el buen rendimiento y la flexibilidad. La autoría de las partículas la realizan los artistas de VFX, que escriben fragmentos de sombreado computacional que definen el comportamiento y los datos de las partículas. NGP se encarga de la asignación de la memoria y de la mayor parte del código de la placa base, mientras que los artistas pueden centrarse en el comportamiento y los efectos visuales.

Actualmente NGP no está pensado para manejar sólo efectos de partículas. También puede utilizarse para controlar el comportamiento por vóxel en los volúmenes o para generar geometría procedimental dinámica. También tenemos varios módulos que generan datos que se utilizan como entrada para los efectos.

Por ejemplo, tenemos nuestro propio módulo de simulación de fluidos que puede alimentar sus datos de simulación a NGP. Otro ejemplo es un módulo llamado voxelizer que puede convertir una malla animada en voxels. Esos datos se pueden utilizar luego para los efectos volumétricos de los personajes. Otros recursos como las texturas, las matrices de huesos y los búferes de vértices también pueden utilizarse como entradas para los efectos de partículas.

A continuación, repasaremos algunos de los módulos y características clave de NGP.

La magia de los efectos visuales detrás de los tentáculos de los enemigos y las estelas de las balas: las partículas de los nodos

Desde el principio del desarrollo del proyecto Returnal, estaba claro que queríamos hacer algo especial con las criaturas enemigas de Atropos. El director del juego, Harry Krueger, quería que se parecieran a criaturas de las profundidades marinas con propiedades como la bioluminiscencia y los tentáculos.

Nuestros animadores del equipo de enemigos experimentaron brevemente con la creación de tentáculos utilizando la física de cuerpo rígido tradicional para simular cadenas de huesos unidas a los esqueletos enemigos. Este enfoque parecía demasiado limitado, ya que el coste de rendimiento de hacer múltiples cadenas muy largas era demasiado alto, pero también porque carecíamos de medios para expresar los estados de los enemigos únicamente mediante simulaciones de física. A VFX se le asignó entonces la tarea de crear tentáculos dinámicos que pudieran unirse a las mallas y esqueletos enemigos.

Por suerte, ya teníamos una solución en mente. El equipo había estado experimentando con vegetación de partículas en proyectos anteriores y se había desarrollado un tipo de partícula especial para la vegetación ramificada, como los árboles. Llamamos a este tipo de partícula “Partícula de nodo” para reflejar sus propiedades y comportamiento.

Este tipo de partícula nos permite crear conexiones unidireccionales, padre-hijo. Una partícula puede ser padre de varios hijos, pero una partícula sólo puede tener un padre. Cuando se lee la partícula padre, los datos del padre son de hace un fotograma, es decir, no son los datos que se están escribiendo en el fotograma actual. Esto hace imposible “seguir” estrictamente al padre y da lugar a un efecto secundario que hace que el movimiento de las partículas parezca “orgánico”. Este efecto secundario se utiliza ampliamente en los efectos de partículas en Returnal, y era especialmente útil para cosas como los tentáculos.

Pero antes de empezar a trabajar en el comportamiento de los tentáculos, teníamos que decidir cómo los renderizaríamos. Primero experimentamos con tiras planas de polígonos. La calidad era casi aceptable, pero faltaba en algunas áreas como las sombras. Después de un tiempo, decidimos renderizar los tentáculos como mallas cilíndricas construidas a partir de NGP durante el tiempo de ejecución.

Una vez que nos decidimos por el renderizado de tubos, pudimos empezar a centrarnos en el comportamiento de los tentáculos. Al poder controlar el comportamiento de las partículas, ya no estábamos limitados sólo por las simulaciones físicas, sino que podíamos cambiar convenientemente el movimiento de los tentáculos en función del estado del enemigo. Esto nos facilitó experimentar con cosas como forzar el movimiento de los tentáculos de una manera determinada cuando el enemigo se está preparando para un ataque. Hemos repetido los tiempos con el equipo de enemigos y los diseñadores para asegurarnos de que el comportamiento de los tentáculos ayude a telegrafiar los estados del enemigo junto con la animación y otros efectos visuales.

Las partículas de los nodos también resultaron útiles para las numerosas cintas y estelas que tenemos en el juego. Queríamos que algunas de las balas que se dirigen a los objetivos tuvieran una larga estela que permaneciera en la pantalla durante un tiempo detrás de la bala. También las estelas de los ataques cuerpo a cuerpo de los enemigos utilizaban partículas de nodo. Abajo puedes ver un video de partículas de nodo siguiendo a las principales, creando un rastro, seguido de un ataque de bala de Phrike.

Simulaciones de fluidos

Uno de nuestros principios clave en Housemarque en lo que respecta a los efectos visuales es simular todo lo posible durante el tiempo de ejecución, utilizando la menor cantidad posible de datos precocinados. Como ya habíamos utilizado simulaciones de fluidos en nuestros títulos anteriores, como Alienation y Matterfall, teníamos claro desde el principio que no debíamos conformarnos con campos de velocidad preconfeccionados para Returnal.

En su lugar, utilizamos una simulación de fluidos en tiempo real alrededor del jugador para simular el flujo de aire que afecta al movimiento de las partículas, la vegetación y otros elementos VFX. Además de esa simulación (a la que nos referimos como Simulación Global de Fluidos), podemos tener simulaciones adicionales unidas a diferentes actores del juego.

Cualquier evento del juego puede ser programado para añadir fuerzas a la simulación de fluidos, haciendo que los elementos VFX cercanos reaccionen. Por ejemplo, estas fuerzas pueden incluirse en las animaciones de los enemigos, de modo que cuando un enemigo realiza un ataque de salto, añadimos un impulso radial a la simulación de fluidos en ese momento y en ese lugar. Esto hace que las partículas cercanas, como las hojas o las chispas, salgan volando desde el punto de impacto. En el siguiente vídeo puedes ver los impulsos de fluido provocados por las animaciones de los enemigos y las acciones de los jugadores que afectan a la vegetación de partículas.

Mientras que usar sólo las velocidades de los fluidos era suficiente para cosas como la vegetación, en los casos en los que se pueden ver partículas puntuales discretas, parecía que al campo de velocidad global de la simulación de fluidos le faltaba detalle. Para obtener más detalle, se optó por implementar cálculos de vorticidad opcionales para la simulación de fluidos y en la actualización de las partículas se añadió el rizado de un campo de ruido a la velocidad de las partículas, proporcional a la magnitud de la velocidad del fluido en la ubicación de la partícula. En el juego esta técnica se utilizó para los hologramas de Xeno-archivo y en el efecto de teletransporte del jugador, que puedes ver a continuación.

Voxelizador y efectos volumétricos

Uno de los elementos del entorno que queríamos tener en el bioma inicial de Returnal (Overgrown Ruins) era una niebla espesa y volumétrica parecida a la de un cementerio. Debido a las diferencias de altura de nuestros niveles, la colocación procedimental de la niebla resultó problemática. En su lugar, decidimos colocar los volúmenes de niebla manualmente. Con un elevado número de volúmenes que debía colocar el equipo de entorno, teníamos que hacer el proceso lo más sencillo posible.

La flexibilidad de nuestro sistema de partículas nos permitió construir estos volúmenes en NGP. Dado que los datos y el comportamiento de las partículas pueden personalizarse por completo, podemos almacenar un índice tridimensional para un número de partículas y hacer que representen un volumen. Los límites del volumen pueden pasarse como datos constantes de la CPU a NGP. Junto con el índice tridimensional, podemos almacenar cualquier otro dato por vóxel también. Esto nos da la posibilidad de almacenar diferentes estados para cada vóxel dentro de un volumen. Además de poder almacenar los estados de los vóxeles, también podemos cambiar su lógica de actualización en función de su posición en el mundo del juego o dentro del volumen.

Al tener vóxeles que conocen su estado y posición, podíamos hacer que emitieran automáticamente más densidad cerca de superficies como suelos y paredes, pero también que se desvanecieran suavemente cerca de los bordes de los volúmenes. Esto hizo que el proceso de colocación de los volúmenes de niebla fuera mucho más rápido, ya que la niebla se adaptaba automáticamente a su entorno. También pudimos muestrear la simulación global de fluidos en la posición de los vóxeles, y hacer que la niebla se moviera en función de cosas como el viento, las balas y las acciones del jugador. En el siguiente vídeo se puede ver uno de estos volúmenes de niebla NGP colocado en un nivel. La densidad de la niebla se crea de forma adaptativa sólo cerca de las superficies, y se advierte mediante la simulación de fluidos en el juego.

Uniéndolo todo para crear la batalla con el jefe Phrike

Para el encuentro con el jefe Phrike, queríamos ser capaces de emitir niebla volumétrica desde la malla del esqueleto de Phrike. Esto planteaba un problema, ya que la niebla volumétrica y las mallas esqueléticas se construyen con distintos tipos de elementos. La malla esquelética es un conjunto de vértices, puntos animados en el espacio 3D que se ordenan para formar triángulos que se pueden renderizar. Los vértices pueden colocarse arbitrariamente para formar todo tipo de formas diferentes, desde árboles hasta humanoides. La niebla volumétrica, por su parte, utiliza cajas que se denominan volúmenes. Estos volúmenes están formados por elementos más pequeños llamados vóxeles. A diferencia de las mallas esqueléticas, los volúmenes de niebla en Unreal Engine siempre tienen forma de caja, al igual que los vóxeles con los que se construyen.

Si quisiéramos utilizar los vértices de Phrike para emitir niebla volumétrica, tendríamos que averiguar en qué vóxel del volumen de niebla se encuentra cada vértice de la malla esquelética. Esto era trivial de resolver, pero el mayor problema era el hecho de que sólo podíamos manejar un vértice por vóxel. Tener dos vértices ocupando el mismo vóxel llevaría a un comportamiento indefinido y posiblemente a un fallo del juego. Para empeorar las cosas, era mucho más probable tener varios vértices dentro de un mismo vóxel que tener solo uno.

La solución a esto fue un voxelizador en tiempo real (basado en un trabajo de investigación de Elmar Eisemann y Xavier Décoret de 2008) [2]. El voxelizador toma una malla esquelética como entrada y produce un volumen en el que cada vóxel que está dentro de la malla esquelética se marca como ocupado. Esto hace que el proceso de emisión de niebla sea sencillo, ya que sólo tenemos que comprobar la salida del voxelizador y ver si el vóxel dado está marcado como ocupado o no. En el siguiente video se puede ver la salida del voxelizador usando la malla de Phrike como entrada.

Con la capacidad de emitir niebla desde la malla de Phrike, pudimos mezclar mejor el personaje con el entorno cuando se movía. También hizo que las acciones especiales de Phrike, como el teletransporte y el desove, fueran más fáciles de ejecutar, ya que podíamos ocultar estas transiciones con la niebla. A continuación puedes ver un vídeo comparativo de la secuencia de aparición de Phrike con niebla volumétrica y otros efectos y sin ellos.

Con esto concluye nuestra inmersión en los efectos visuales de Returnal. Esperamos que hayas disfrutado leyendo esto y que desees compartir más de nuestros trucos y técnicas en el futuro.

No hay comentarios:

Publicar un comentario