¿Qué estás buscando?
Engine & platform

El nuevo Sistema de Aguas en Unity 2022 LTS y 2023.1

ADRIEN DE TOCQUEVILLE Graphics Engineer
Jun 28, 2023|18 minutos
El nuevo Sistema de Aguas en Unity 2022 LTS y 2023.1
Para tu comodidad, tradujimos esta página mediante traducción automática. No podemos garantizar la precisión ni la confiabilidad del contenido traducido. Si tienes alguna duda sobre la precisión del contenido traducido, consulta la versión oficial en inglés de la página web.

La mayoría de los entornos de gama alta requieren en algún momento un océano, un lago, un río o incluso una simple piscina. Hay muchas formas de emularlas con unos pocos sombreadores, pero construir todo un sistema basado físicamente e integrado de forma coherente en el High Definition Render Pipeline (HDRP) ha sido una tarea compleja y que ha llevado mucho tiempo.

Hoy destacamos el nuevo sistema Unity Water, introducido por primera vez en HDRP como parte del flujo tecnológico 2022.2, con especial atención al renderizado. La próxima versión 2023.1 Tech Stream amplía el conjunto de funciones del sistema para una mejor integración con los mundos y la jugabilidad.

Crea un océano, un lago, un río o una piscina en unos pocos clics

Ahora es fácil para los artistas de entornos crear y configurar superficies de agua -como océanos, lagos, ríos y estanques- que se integrarán con otros elementos del mundo y del juego, como barcos o paseos marítimos.

El primer paso es activar el agua en su proyecto:

  • Activar y configurar el agua para cada nivel de calidad (renderizar activos de tuberías para cada nivel de calidad).
  • Activa el agua en los ajustes de encuadre de tu(s) cámara(s)
  • Activa el agua dentro de tu escena con una anulación de volumen de renderizado de agua, que te permite activar el renderizado de agua sólo cuando lo necesites en función de dónde esté la cámara.

Una vez que el agua está activa, estás a sólo unos clics de crear hermosas masas de agua desde el menú GameObject. El HDRP ofrece tres tipos de superficie acuática: piscina, río y océano.

Crear un océano en unos pocos clics
Inicio rápido con muestras de agua
Tres de las cuatro escenas de muestra desarrolladas como parte del nuevo sistema de agua de Unity para la tubería de renderizado de alta definición (HDRP).

Crear masas de agua es rápido, pero el Sistema de Agua proporciona muchas herramientas y opciones para personalizar e integrar el agua con tu mundo y tu juego.

Para una rápida visión general de todos los sistemas y extensiones en acción, eche un vistazo a nuestras muestras de agua en el paquete HDRP (abra el Gestor de paquetes > seleccione el paquete High Definition Render Pipeline en sus activos > elija las muestras de agua dentro de la sección Muestras).

Proporcionamos cuatro escenas de muestra.

La escena Piscina muestra cómo configurar diferentes "piscinas" en la misma escena a diferentes alturas, así como el uso de mallas personalizadas para renderizar las superficies con formas personalizadas.

La escena Isla muestra el cuerpo del océano e incluye una máscara de agua para eliminar el oleaje alrededor de la isla, un deformador de agua para crear olas, calcomanías para colocar espuma en la playa, un generador de espuma para generar espuma detrás de las olas y alrededor de la isla, y un excluidor de agua para excluir el agua del interior de un barco. También se centra en aprovechar Burst con la API de consulta de agua para paralelizar el cálculo de múltiples objetos (por ejemplo, gaviotas) para que floten en el agua.

El escenario Glacier presenta muchas características, entre ellas:

  • Masa de agua fluvial
  • Deformador de agua para crear una cascada
  • Simulación de corriente para hacer fluir el agua por el glaciar
  • API de consulta de agua para que los icebergs floten río abajo
  • Generador de espuma para añadir espuma detrás de los icebergs
  • Espuma personalizada en los bordes del río y para el remolino de la cascada utilizando Shader Graph y el nodo maestro Agua.
  • Calcomanías para animar el agua que cae en cascada
  • Muestras cáusticas para proyectar fuera del agua

La escena Línea de agua muestra la personalización del nivel de la superficie del agua y el renderizado subacuático mediante un pase personalizado, generando una mayor separación borrosa y simulando el efecto del agua en la lente de una cámara.

Ahora que ya estás bien informado, vamos a sumergirnos en cada sistema.

Representación física del agua

El sistema de agua viene con un sombreador de agua listo para usar, basado físicamente y diseñado a partir de un modelo de iluminación introducido recientemente en HDRP, también disponible para Shader Graph para su personalización. Puede ajustar las propiedades de suavidad, refracción, absorción, difusión y dispersión de la luz de una superficie acuática.

El color de dispersión funciona como el color base del agua, así que hay que empezar por ahí para establecer la sensación general. Luego puedes cambiar la distancia de absorción y el color de refracción, para controlar lo transparente que es tu agua y el tinte que se aplica a los objetos que ves a través de la refracción del agua. Para un Mar Caribe limpio, se necesitaría una gran distancia de absorción junto con un color cian de dispersión y refracción, mientras que para un río sucio, se necesitaría un color marrón oscuro de dispersión y un río casi opaco con una pequeña distancia de absorción.

Existen limitaciones en el renderizado de agua en 2022.2, algunas de las cuales se han solucionado en 2023.1 (ver el agua detrás de las nubes volumétricas, línea de flotación precisa) o se solucionarán en 2023.2 (mejora del rendimiento, compatibilidad con el renderizado de superficies transparentes superpuestas al agua).

Sumerjámonos

Si es tan fan, como nosotros, del Comandante Cousteau, disfrutará buceando bajo el agua con el Sistema Acuático. Puede detectar cuándo la cámara está bajo el plano del agua y simular el renderizado subacuático según las propiedades físicas del agua.

Las cáusticas pueden generarse procedimentalmente para simular la refracción de la luz de las superficies proyectadas sobre la superficie del suelo. Tenga en cuenta que las cáusticas pueden reutilizarse como proyecciones fuera del agua, utilizando una calcomanía, por ejemplo, para simular las cáusticas del agua reflejadas en el interior de una cueva.

Cuando la cámara se sitúa entre el agua y el exterior, se genera una línea de agua y el renderizado subacuático se compone sobre la parte sumergida de la cámara. El renderizado de líneas de agua se ha mejorado en 2023.1, permitiéndote personalizarlo con un pase personalizado (ver: Escena de muestra de The Water Line).

Marejada, agitación, ondulaciones y corrientes

Lo que hace que el agua sea aún más atractiva visualmente es cómo se mueve. Tenga en cuenta que el sistema de simulación de agua proporcionado se centra en la deformación del plano de agua y no en la simulación de fluidos o salpicaduras.

Parametrización de la simulación

Las ondas se generan procedimentalmente mediante una simulación por transformada rápida de Fourier (FFT). En pocas palabras, funciona sumando muchas ondas simples de distintas frecuencias para formar ondas complejas. Al controlar la gama de frecuencias, puede controlar la agitación del agua.

El sistema funciona sumando rangos variados de frecuencias, que llamamos bandas.

La simulación total se realiza sumando las ondas generadas a través de hasta tres bandas de frecuencia

El HDRP admite hasta tres bandas, lo que simula tres efectos del mundo real sobre el agua y cubre la mayoría de los casos de uso:

  • El oleaje, que representa las olas generadas por los efectos de la luna y el viento lejano. Está controlado únicamente por el parámetro de viento a distancia y permite orientar la dirección del oleaje.
  • Agitación, que representa el caos generado por el viento.
  • Ondulaciones, que representan corrientes o efectos del viento local. Es la banda con las frecuencias más altas, o las ondas más pequeñas, y añade detalles finos al agua.
Parámetros para controlar la simulación por gama de frecuencias en el Inspector

Por ejemplo, como las piscinas tienen pequeñas perturbaciones, sólo utilizan la banda de frecuencia más alta: las ondulaciones. Un río, que es un poco más complejo, tendrá ondulaciones y una banda de agitación. Y un océano tiene toda la gama de frecuencias para poder abarcar todos los distintos tamaños de olas que vemos en la vida real. La simulación se realiza en un parche cuadrado que se repite infinitamente.

En 2023.1, añadiremos soporte para corrientes que harán que las ondas fluyan según los mapas de flujo. La simulación es completamente determinista, por lo que puedes obtener resultados consistentes al realizar juegos multijugador, simulaciones de física o grabar un cortometraje o una cinemática.

Renderizado con precisión y a escala

Para representar la deformación del plano de agua, el sistema utiliza el desplazamiento de vértices y puede aplicarse a la geometría generada procedimentalmente o a una malla personalizada que usted proporcione. La geometría procedimental funciona instanciando quads unos junto a otros, de forma similar a lo que hace el terreno para el renderizado. Esto también se puede utilizar al crear un océano infinito o ríos largos para asegurarse de que la densidad de vértices se adapta a donde está la cámara.

Además, con el fin de tener una densidad de vértices más fina para renderizar pequeñas ondulaciones, HDRP puede confiar en GPU Tessellation, que es una forma de subdividir triángulos utilizando shaders especiales. Con esta capacidad, cuando la cámara está a cierta distancia de la superficie del agua, se puede ver que se generan más triángulos cerca del punto de vista.

El sistema también ofrece varias opciones para equilibrar la calidad visual y el rendimiento del renderizado. Más información sobre la optimización del rendimiento en nuestra documentación.

Muestreo de la simulación

Como acabamos de explicar, la simulación se ejecuta íntegramente en la GPU por motivos de eficiencia, pero parte de ella puede reflejarse en la CPU para permitir muestrear la altura del agua y las corrientes (por ejemplo, para hacer flotar objetos a lo largo de un río).

Esto tiene un alto coste de CPU, ya que se necesitan muchos cálculos para la simulación, pero se mantiene razonable utilizando trabajos burstificados para paralelizar las operaciones de forma más eficiente.

Ten en cuenta que, según los comentarios recibidos, la API de secuencias de comandos ha evolucionado entre 2022.2 y 2023.1, por lo que es posible que tengas que realizar ajustes en el código entre las dos versiones.

Para empezar, puedes encontrar dos ejemplos de código en las escenas acuáticas: uno en la escena Isla, que aprovecha Burst para paralelizar el muestreo de muchos objetos, y otro en la escena Glaciar, que muestra cómo hacer que los icebergs floten a lo largo de las corrientes del río y caigan por la cascada con un código más sencillo y no paralelizado.

Espuma

La espuma simula las burbujas generadas sobre o bajo el agua por el viento en las crestas, por las olas que rompen contra la orilla o las rocas, o por un barco o personaje en movimiento en el agua.

El Sistema de Aguas puede generar automáticamente espuma en función de la simulación de la masa de agua y de la velocidad del viento a distancia para ríos y océanos. A continuación, permite ajustar la cantidad de espuma y retocar el aspecto, eligiendo su suavidad y el alicatado de la textura.

Espuma generada por la simulación del agua

Para 2023.1, se añadió un Generador de Espuma para simular aguas bravas para un camino de barcos, olas o alrededor de rocas en aguas abiertas, de modo que la espuma pueda engendrarse y seguir su propio curso según las olas. En la escena de muestra, verá diferentes ejemplos de uso del Generador de espuma: En la escena de la isla se utiliza para generar espuma en la parte superior de las olas rompientes y alrededor de la isla, y en la escena del glaciar para generar espuma detrás de los icebergs que flotan río abajo.

Espuma colocada manualmente alrededor de las rocas y en las olas de la costa mediante generadores de espuma

Usando Shader Graph, puedes inyectar espuma personalizada al nodo maestro Agua y usarlo para añadir espuma procedural personalizada para cosas como bordes de ríos o remolinos en una cascada. Por ejemplo, en la muestra Glaciar, el remolino en la parte inferior de la cascada se hace simplemente desplazando y mezclando una textura de espuma personalizada en Shader Graph. La espuma de los bordes se hace muestreando el Tampón de profundidad para aproximar la profundidad.

Espuma generada por la lectura del búfer de profundidad en el agua Gráfico de sombreado

Se inyectará espuma de simulación donde la agitación de las olas lo requiera. Pero para fines artísticos, puede que desee enmascarar algunas regiones de recibir espuma utilizando una máscara de espuma.

Integración con mundos

Para que parezcan más realistas, las superficies de agua y las simulaciones deben modificarse localmente para integrarse mejor con el mundo y el atrezo. Por ejemplo, eliminar la geometría del agua en el interior de un barco, añadir olas rompientes cerca de la orilla en las zonas del mar expuestas al oleaje, producir espuma alrededor de las rocas, modificar las corrientes locales, dar forma a zonas tranquilas en el interior de las bahías, crear una cascada en medio de un río o generar pequeños remolinos en un río o un vórtice gigante en medio del océano.

Múltiples componentes permiten personalizar la simulación, la espuma y las corrientes para crear estas variaciones locales o efectos más complejos:

  • La Máscara de Agua permite atenuar o suprimir las ondulaciones, el oleaje y la espuma en una porción específica de la superficie del agua.
  • Se pueden añadir calcomanías en el agua para crear espuma local, anular la suavidad del agua o simular pequeñas deformaciones locales como gotas, impactos u ondulaciones personalizadas mediante un mapa de normales. También pueden utilizarse para simular la humedad en la arena o las rocas (véase: la escena de muestra Isla) o la cáustica en las paredes (véase: la escena de muestra Glaciar) independientemente del sistema de agua. Tenga en cuenta que el color no se puede cambiar, ya que las calcomanías sólo se tratan como escala de grises.
  • Los deformadores de agua pueden modificar localmente la simulación para crear olas, como se muestra en la muestra Isla, o una cascada, como se ilustra en la muestra Glaciar.
Rendimiento y depuración

Hemos medido el rendimiento de la escena Glaciar, en la que la mayoría de las funciones se activan en varias consolas, y hemos perfilado el sistema de agua basándonos en ella. A través de las mediciones, hemos averiguado que el tiempo de renderizado del agua tarda aproximadamente 4 ms en la GPU de las últimas generaciones, mientras que en las consolas de generaciones anteriores tardaba unos 7 ms. Esto, por supuesto, depende en gran medida de los ajustes de calidad del agua, de la complejidad de la simulación y de la cantidad de píxeles de agua que se muestren en pantalla. Pero el sistema tiene el rendimiento suficiente para funcionar sin problemas en varias plataformas.

Además, el sistema utiliza iluminación agrupada diferida para optimizar el sombreado y admitir un elevado número de fuentes de luz. La mayor parte del tiempo de renderizado proviene del pase GBuffer debido al importante número de vértices necesarios para obtener ondas bonitas, incluso en la distancia. Cuando se activa el teselado de la GPU en la superficie, este coste puede controlarse cambiando el nivel máximo de teselado y la distancia de desvanecimiento cuando la cámara está lejos del agua.

En la sección Varios de cada superficie de agua, tienes acceso a varios modos de depuración para visualizar la dirección de la corriente, la deformación, la espuma y otras máscaras que se aplican sobre el agua.

Modos de depuración que muestran la corriente, la deformación, la máscara de agua y la espuma
Demostración del agua

Para ver cómo funciona el sistema Water System en escenas más complejas, creamos un proyecto de demostración con escenas de piscina, isla y río.

Escena de demostración en una isla

La escena de la isla muestra un océano infinito con olas que llegan a la playa. Muestra cómo utilizar las máscaras de agua y hacer deformadores y generadores de espuma utilizando texturas de render personalizadas. También utiliza calcomanías para crear complejas interacciones con la superficie del agua cuando una ola se acerca a la playa.

La escena Piscina muestra una superficie de agua interior con colores realistas, profundidad, bajo el agua y cáusticos.

Escena de demostración del río

La escena del río muestra el uso de quads en instancias y aprovecha un mapa actual para simular el flujo, así como calcomanías, un gráfico de sombreado personalizado y un gráfico VFX para mejorar los efectos visuales.

Puede descargar las demos en GitHub.

Cómo empezar

Para utilizar el sistema de agua, debe estar trabajando con HDRP y Unity 2022.2 o superior.

Aunque puede utilizar algunas de las funcionalidades iniciales en 2022.2, le recomendamos que empiece por 2023.1, donde se han añadido múltiples mejoras y funcionalidades, incluidos algunos cambios en la API.

Puede descargar las muestras de agua en el Gestor de paquetes, desde donde podrá empezar a reutilizar el código y los sistemas de muestra. También puede consultar nuestro proyecto de demostración WaterScenes en GitHub para ver ejemplos más complejos de integración de sistemas hídricos.

Para obtener más información, vea la inmersión en profundidad de Rémi y Adrien en Water System de la GDC 2023 o lea nuestra documentación.

¿Cuál es el siguiente paso?

Por el momento no hemos previsto nuevas funciones y nos concentramos en la estabilidad. Puedes compartir tus comentarios con nosotros o hacernos preguntas en nuestro hilo del foro dedicado a Unity.

Para proponer nuevas funciones y votar por las que están en estudio, consulte nuestras hojas de ruta públicas.

Por favor, comparta sus comentarios sobre el nuevo Sistema de Aguas en el foro del HDRP. Para consultar futuros blogs técnicos de desarrolladores de Unity, permanece atento a la serie Tech from the Trenches.