O novo sistema de água no Unity 2022 LTS e 2023.1

A maioria dos ambientes de alto padrão exige um oceano, lago, rio ou até mesmo uma piscina em algum momento. Há muitas maneiras de emular esses elementos com alguns sombreadores, mas a criação de um sistema inteiro integrado de forma coerente e com base física no Pipeline de Renderização de Alta Definição (HDRP) tem sido uma tarefa complexa e demorada.
Hoje, destacamos o novo Unity Water System, introduzido pela primeira vez no HDRP como parte do fluxo tecnológico 2022.2, com foco na renderização. O próximo fluxo técnico 2023.1 amplia o conjunto de recursos do sistema para melhor integração com mundos e jogabilidade.
Agora é fácil para os artistas de ambiente criarem e configurarem superfícies de água, como oceanos, lagos, rios e piscinas, que serão integradas a outros elementos do mundo e da jogabilidade, como barcos ou praias.
A primeira etapa é ativar a água em seu projeto:
- Ativar e configurar a água para cada nível de qualidade (renderizar ativos de pipeline para cada nível de qualidade)
- Ative a água nas configurações de quadro da(s) sua(s) câmera(s)
- Ative a água dentro da sua cena com uma substituição de volume de renderização de água, que permite ativar a renderização de água somente quando necessário, dependendo de onde a câmera estiver
Quando a água estiver ativa, você estará a apenas alguns cliques de criar belos corpos d'água no menu GameObject. O HDRP oferece três tipos de superfície de água: piscina, rio e oceano.


A criação de corpos d'água é rápida, mas o Water System oferece muitas ferramentas e opções para personalizar e integrar a água ao seu mundo e à sua jogabilidade.
Para obter uma visão geral rápida de todos os sistemas e extensões em ação, dê uma olhada em nossas amostras de água no pacote HDRP (abra o Package Manager > selecione o pacote High Definition Render Pipeline em seus ativos > escolha as amostras de água na seção Samples).
Fornecemos quatro exemplos de cenas.
A cena Piscina mostra como configurar diferentes "piscinas" na mesma cena, em diferentes alturas, e como usar malhas personalizadas para renderizar as superfícies com formas personalizadas.
A cena da ilha mostra o corpo do oceano e inclui uma máscara de água para remover as ondas ao redor da ilha, um deformador de água para criar ondas, decalques para colocar espuma na praia, um gerador de espuma para gerar espuma atrás das ondas e ao redor da ilha e um excludente de água para excluir a água de dentro de um barco. Ele também se concentra em aproveitar o Burst com a API de consulta de água para paralelizar o cálculo de vários objetos (ou seja, gaivotas) para flutuar na água.
O cenário Glacier apresenta muitos recursos, incluindo:
- Corpo de água do rio
- Deformador de água para criar uma cachoeira
- Simulação de corrente para fazer a água fluir pela geleira
- API de consulta de água para fazer icebergs flutuarem rio abaixo
- Gerador de espuma para adicionar espuma atrás de icebergs
- Espuma personalizada nas bordas do rio e para o redemoinho da cachoeira usando o Shader Graph e o nó mestre Water
- Decalques para animar a queda de água em uma cachoeira
- Amostra de cáusticos para projetar fora da água
A cena Water Line mostra a personalização do nível da superfície da água e a renderização subaquática usando uma passagem personalizada, gerando uma separação borrada maior e simulando o efeito da água em uma lente de câmera.
Agora que você já está totalmente informado, vamos nos aprofundar em cada sistema.
O Water System vem com um sombreador de água pronto para uso e baseado em física, projetado a partir de um modelo de iluminação recentemente introduzido no HDRP, também disponível para o Shader Graph para personalização. Você pode ajustar a suavidade, a refração, a absorção, a difusão e as propriedades de dispersão da luz de uma superfície de água.
A cor de dispersão funciona como a cor de base da água, portanto, você precisa começar por aí para definir a sensação geral. Em seguida, você pode alterar a distância de absorção e a cor de refração para controlar a transparência da água e a tonalidade aplicada aos objetos que você vê por meio da refração da água. Para um Mar do Caribe limpo, você teria uma grande distância de absorção associada a uma cor de dispersão e refração ciano, enquanto que para um rio sujo, você desejaria uma cor de dispersão marrom escura e um rio quase opaco com uma pequena distância de absorção.
Há limitações para a renderização de água na versão 2022.2, algumas das quais foram abordadas na versão 2023.1 (ver a água atrás de nuvens volumétricas, linha de água precisa) ou serão na versão 2023.2 (desempenho aprimorado, suporte para renderização de superfícies transparentes sobrepostas à água).
Se você é fã, como nós, do Comandante Cousteau, vai gostar de mergulhar na água com o Water System. Ele pode detectar quando a câmera está sob o plano da água e simular a renderização subaquática de acordo com as propriedades físicas da água.
Os cáusticos podem ser gerados processualmente para simular a refração da luz das superfícies projetadas na superfície do solo. Observe que a cáustica pode ser reutilizada como projeções fora da água, usando um decalque, por exemplo, para simular a cáustica da água refletida dentro de uma caverna.
Quando a câmera fica entre a água e o exterior, é gerada uma linha de água, e a renderização subaquática é composta na parte submersa da câmera. A renderização da linha de água foi aprimorada na versão 2023.1, permitindo que você a personalize com um passe personalizado (consulte: Cena de amostra de The Water Line).
O que torna a água ainda mais atraente visualmente é a forma como ela se move. Observe que o sistema de simulação de água fornecido se concentra na deformação do plano da água e não na simulação de fluidos ou respingos.
As ondas são geradas processualmente usando uma simulação de transformada rápida de Fourier (FFT). Em termos simples, isso funciona somando várias ondas simples de diferentes frequências para formar ondas complexas. Ao controlar a faixa de frequências, você pode controlar a agitação da água.
O sistema funciona somando faixas variadas de frequências, que chamamos de bandas.

O HDRP suporta até três bandas, o que simula três efeitos do mundo real na água e abrange a maioria dos casos de uso:
- A ondulação, representando as ondas geradas pelos efeitos da lua e do vento distante. Ele é controlado exclusivamente pelo parâmetro de distância do vento e permite que você oriente a direção da ondulação.
- Agitação, representando o caos gerado pelo vento.
- Ondulações, representando correntes ou efeitos do vento local. Essa é a banda com as frequências mais altas, ou as menores ondas, e acrescenta detalhes finos à água.

Por exemplo, como as piscinas têm pequenas perturbações, eles usam apenas a banda de frequência mais alta: as ondulações. Um rio, que é um pouco mais complexo, terá ondulações e uma faixa de agitação. E um oceano tem a faixa de frequência completa para poder cobrir todos os vários tamanhos de onda que vemos na vida real. A simulação é feita em uma área quadrada que é repetida infinitamente.
Na versão 2023.1, estamos adicionando suporte a correntes que farão com que as ondulações fluam de acordo com os mapas de fluxo. A simulação é totalmente determinística, portanto, você pode obter resultados consistentes ao fazer jogos com vários participantes, simulações de física ou gravar um filme curto ou cinematográfico.
Para renderizar a deformação do plano de água, o sistema usa o deslocamento de vértices e pode ser aplicado à geometria gerada processualmente fornecida ou a uma malha personalizada que você fornecer. A geometria procedural funciona instanciando quadrantes um ao lado do outro, semelhante ao que o terreno faz para a renderização. Isso também pode ser usado ao criar um oceano infinito ou rios longos para garantir que a densidade de vértices se adapte ao local onde a câmera está.
Além disso, para ter uma densidade de vértices mais fina para renderizar pequenas ondulações, o HDRP pode contar com o GPU Tessellation, que é uma forma de subdividir triângulos usando shaders especiais. Com esse recurso, quando a câmera está a uma certa distância da superfície da água, é possível ver que mais triângulos são gerados perto do ponto de vista.
O sistema também oferece várias opções para equilibrar a qualidade visual e o desempenho da renderização. Saiba mais sobre como otimizar o desempenho em nossa documentação.
Como acabamos de explicar, a simulação é executada inteiramente na GPU para aumentar a eficiência, mas parte dela pode ser espelhada na CPU para permitir que você faça uma amostra da altura da água e das correntes (por exemplo, para fazer objetos flutuarem ao longo de um rio).
Isso tem um alto custo de CPU, pois há muitos cálculos necessários para a simulação, mas esse custo é mantido razoável com o uso de trabalhos burstificados para paralelizar as operações com mais eficiência.
Observe que, com base no feedback, a API de script evoluiu entre as versões 2022.2 e 2023.1 e pode exigir ajustes em seu código entre as duas versões.
Para começar, você pode encontrar dois exemplos de código nas cenas aquáticas: um na cena Island, aproveitando o Burst para paralelizar a amostragem de muitos objetos, e o outro na cena Glacier, mostrando como fazer os icebergs flutuarem ao longo das correntes do rio e caírem na cascata com um código mais simples e não paralelizado.
A espuma simula as bolhas geradas sobre ou sob a água pelo vento nas cristas, por ondas que quebram contra a costa ou rochas, ou por um barco ou personagem em movimento na água.
O Water System pode gerar espuma automaticamente com base na simulação do corpo d'água e na velocidade do vento à distância para rios e oceanos. Em seguida, você pode ajustar a quantidade de espuma e ajustar a aparência, escolhendo a suavidade e o revestimento da textura.

Para a versão 2023.1, foi adicionado um gerador de espuma para simular água branca para uma trilha de barco, ondas ou ao redor de rochas em águas abertas, de modo que a espuma possa ser gerada e continuar seu próprio curso de acordo com as ondas. Na cena de amostra, você verá diferentes exemplos de uso do Foam Generator: Na cena da ilha, ele é usado para gerar espuma no topo das ondas que quebram e ao redor da ilha, e na cena da geleira para gerar espuma atrás dos icebergs que flutuam pelo rio.

Usando o Shader Graph, você pode injetar espuma personalizada no nó mestre Water e usá-la para adicionar espuma procedural personalizada para coisas como bordas de rios ou redemoinhos em uma cachoeira. Por exemplo, na amostra Glacier, o redemoinho na parte inferior da cachoeira é feito simplesmente rolando e mesclando uma textura de espuma personalizada no Shader Graph. A espuma nas bordas é feita pela amostragem do Depth Buffer para aproximar a profundidade.

A espuma de simulação será injetada onde a agitação das ondas assim o exigir. Mas, para fins artísticos, você pode querer mascarar algumas regiões do recebimento da espuma usando uma máscara de espuma.
Para parecer mais realista, as superfícies e as simulações da água precisam ser modificadas localmente para se integrarem melhor ao seu mundo e aos adereços. Por exemplo, para remover a geometria da água dentro de um barco, adicionar ondas quebrando perto da costa nos lados do mar expostos à ondulação, produzir espuma ao redor das rochas, modificar as correntes locais, moldar áreas calmas dentro de baías, criar uma cachoeira no meio de um rio ou gerar pequenos redemoinhos em um rio ou um vórtice gigante no meio do oceano.
Vários componentes permitem que você personalize a simulação, a espuma e as correntes para criar essas variações locais ou efeitos mais complexos:
- O Water Mask permite atenuar ou suprimir ondulações, ondulações e espuma em uma parte específica da superfície da água.
- Decalques podem ser adicionados à água para criar espuma local, substituir a suavidade da água ou simular pequenas deformações locais, como gotículas, impactos ou ondulações personalizadas, usando um mapa normal. Eles também podem ser usados para simular umidade na areia ou nas rochas (consulte a cena de amostra da ilha) ou cáusticos nas paredes (consulte a cena de amostra da geleira), independentemente do sistema de água. Observe que a cor não pode ser alterada, pois os decalques são tratados apenas como escala de cinza.
- Os deformadores de água podem modificar localmente a simulação para criar ondas, como mostrado na amostra Island, ou uma cachoeira, como ilustrado na amostra Glacier.
Medimos o desempenho da cena Glacier, em que a maioria dos recursos é ativada em vários consoles, e traçamos o perfil do Water System com base nisso. Por meio de medições, descobrimos que o tempo de renderização da água leva aproximadamente 4 ms na GPU das gerações mais recentes, enquanto os consoles das gerações anteriores levavam cerca de 7 ms. Isso, é claro, depende muito das configurações de qualidade da água, da complexidade da simulação e da quantidade de pixels de água exibidos na tela. Mas o sistema tem desempenho suficiente para funcionar sem problemas em várias plataformas.
Além disso, o sistema está usando iluminação agrupada diferida para otimizar o sombreamento e suportar um grande número de fontes de luz. A maior parte do tempo de renderização está vindo da passagem GBuffer devido ao grande número de vértices necessários para obter ondas agradáveis, mesmo à distância. Ao ativar a tesselação da GPU na superfície, esse custo pode ser controlado alterando o nível máximo de tesselação e a distância de esmaecimento quando a câmera estiver longe da água.
Na seção Diversos de cada superfície de água, você tem acesso a vários modos de depuração para visualizar a direção da corrente, a deformação, a espuma e outras máscaras aplicadas na água.

Para ver o Water System funcionando em cenas mais complexas, criamos um projeto de demonstração com cenas de piscinas, ilhas e rios.

A cena da ilha mostra um oceano infinito com ondas costeiras chegando à praia. Ele mostra como usar as máscaras de água e criar deformadores e geradores de espuma usando texturas de renderização personalizadas. Ele também usa decalques para criar interações complexas com a superfície da água quando uma onda se aproxima da praia.
A cena da piscina mostra uma superfície de água interna com cores realistas, profundidade, subaquática e cáustica.

A cena do rio mostra o uso de quads instanciados e utiliza um mapa atual para simular o fluxo, bem como decalques, um Shader Graph personalizado e um VFX Graph para aprimorar os visuais.
Você pode baixar as demonstrações no GitHub.
Para usar o sistema de água, você deve estar trabalhando com HDRP e Unity 2022.2 ou superior.
Embora você possa usar algumas das funcionalidades iniciais na versão 2022.2, recomendamos começar com a versão 2023.1, na qual vários aprimoramentos e recursos foram adicionados, incluindo algumas alterações na API.
Você pode fazer download das amostras de água no Package Manager, a partir do qual pode começar a reutilizar o código e os sistemas de amostra. Além disso, confira nosso projeto de demonstração WaterScenes no GitHub para obter exemplos mais complexos de integração de sistemas de água.
Para saber mais, assista ao mergulho profundo do Water System de Rémi e Adrien na GDC 2023 ou leia nossa documentação.
Ainda não planejamos nenhum novo recurso nesta fase e estamos nos concentrando na estabilidade. Você pode compartilhar seus comentários conosco ou fazer perguntas em nosso tópico dedicado do fórum do Unity.
Para propor novos recursos e votar nos próximos recursos que estão sendo considerados, confira nossos roteiros públicos.
Compartilhe seu feedback sobre o novo sistema de água no fórum do HDRP. Para futuros blogs técnicos de desenvolvedores do Unity, fique atento à série Tech from the Trenches.