Que recherchez-vous ?
Engine & platform

Le nouveau système de distribution d'eau dans Unity 2022 LTS et 2023.1

ADRIEN DE TOCQUEVILLE Graphics Engineer
Jun 28, 2023|18 Min
Le nouveau système de distribution d'eau dans Unity 2022 LTS et 2023.1
Cette page a été traduite automatiquement pour faciliter votre expérience. Nous ne pouvons pas garantir l'exactitude ou la fiabilité du contenu traduit. Si vous avez des doutes quant à la qualité de cette traduction, reportez-vous à la version anglaise de la page web.

La plupart des environnements haut de gamme ont besoin d'un océan, d'un lac, d'une rivière ou même simplement d'une piscine à un moment ou à un autre. Il existe de nombreuses façons de les émuler avec quelques shaders, mais la construction d'un système complet basé sur la physique et intégré de manière cohérente dans le High Definition Render Pipeline (HDRP) a été une tâche complexe qui a pris beaucoup de temps.

Aujourd'hui, nous mettons en lumière le nouveau système Unity Water, introduit pour la première fois dans le PRDH dans le cadre du flux technologique 2022.2, en mettant l'accent sur le rendu. Le prochain Tech Stream 2023.1 étend les fonctionnalités du système pour une meilleure intégration avec les mondes et le gameplay.

Créez un océan, un lac, une rivière ou une piscine en quelques clics

Il est désormais facile pour les artistes de l'environnement de créer et de configurer des surfaces d'eau - telles que des océans, des lacs, des rivières et des piscines - qui seront intégrées à d'autres éléments du monde et du jeu, tels que des bateaux ou des bords de mer.

La première étape consiste à activer l'eau dans votre projet :

  • Activer et configurer l'eau pour chaque niveau de qualité (rendre les actifs du pipeline pour chaque niveau de qualité)
  • Activez l'eau dans les réglages de votre ou vos appareil(s) photo(s)
  • Activez l'eau dans votre scène à l'aide d'un volume de rendu de l'eau, qui vous permet d'activer le rendu de l'eau uniquement lorsque vous en avez besoin, en fonction de l'endroit où se trouve votre caméra.

Une fois l'eau activée, il vous suffit de quelques clics pour créer de magnifiques étendues d'eau à partir du menu GameObject. Le HDRP propose trois types de surface d'eau : piscine, rivière et océan.

Créer un océan en quelques clics
Démarrage rapide avec des échantillons d'eau
Trois des quatre exemples de scènes développées dans le cadre du nouveau système d'eau d'Unity pour le pipeline de rendu haute définition (HDRP).

La création d'étendues d'eau est rapide, mais le système d'eau fournit de nombreux outils et options pour personnaliser et intégrer l'eau à votre monde et à votre jeu.

Pour un aperçu rapide de tous les systèmes et extensions en action, jetez un coup d'œil à nos échantillons d'eau dans le package HDRP (ouvrez Package Manager > sélectionnez le package High Definition Render Pipeline dans vos actifs > choisissez les échantillons d'eau dans la section Samples).

Nous fournissons quatre exemples de scènes.

La scène de la piscine montre comment mettre en place différentes "piscines" dans la même scène, à différentes hauteurs, et comment utiliser des maillages personnalisés pour rendre les surfaces avec des formes personnalisées.

La scène de l'île met en scène le corps de l'océan et comprend un masque d'eau pour éliminer la houle autour de l'île, un déformateur d'eau pour créer des vagues, des décalcomanies pour placer de la mousse sur la plage, un générateur de mousse pour générer de la mousse derrière les vagues et autour de l'île, et un exclu d'eau pour exclure l'eau de l'intérieur d'un bateau. Il se concentre également sur l'utilisation de Burst avec l'API de requête sur l'eau pour paralléliser le calcul de plusieurs objets (par exemple, des mouettes) flottant sur l'eau.

La scène Glacier présente de nombreuses caractéristiques, notamment

  • Cours d'eau plan d'eau
  • Déformateur d'eau pour créer une cascade
  • Simulation de courant pour faire couler l'eau à travers le glacier
  • API d'interrogation de l'eau pour faire flotter les icebergs sur la rivière
  • Un générateur de mousse pour ajouter de la mousse derrière les icebergs
  • Mousse personnalisée sur les bords de la rivière et pour le tourbillon de la chute d'eau en utilisant Shader Graph et le nœud Water master.
  • Décalcomanies pour animer l'eau qui tombe en cascade
  • Échantillon de produits caustiques à projeter hors de l'eau

La scène de la ligne d'eau illustre la personnalisation du niveau de la surface de l'eau et le rendu sous-marin à l'aide d'une passe personnalisée, générant une séparation floue plus importante et simulant l'effet de l'eau sur l'objectif d'un appareil photo.

Maintenant que vous êtes bien informé, nous allons nous pencher sur chaque système.

Rendu de l'eau basé sur la physique

Le système d'eau est fourni avec un shader d'eau prêt à l'emploi, basé sur la physique et conçu à partir d'un modèle d'éclairage récemment introduit dans HDRP, également disponible pour Shader Graph à des fins de personnalisation. Vous pouvez ajuster la douceur, la réfraction, l'absorption, la diffusion et les propriétés de diffusion de la lumière d'une surface d'eau.

La couleur de dispersion fonctionne comme la couleur de base de l'eau, vous devez donc commencer par là pour définir l'impression générale. Vous pouvez ensuite modifier la distance d'absorption et la couleur de réfraction, afin de contrôler la transparence de votre eau et la teinte appliquée aux objets que vous voyez à travers la réfraction de l'eau. Pour une mer des Caraïbes propre, il faut une grande distance d'absorption associée à une couleur de diffusion et de réfraction cyan, alors que pour une rivière sale, il faut une couleur de diffusion marron foncé et une rivière quasi-opaque avec une petite distance d'absorption.

Il existe des limitations au rendu de l'eau dans 2022.2, dont certaines ont été traitées dans 2023.1 (voir l'eau derrière les nuages volumétriques, ligne d'eau précise) ou le seront dans 2023.2 (amélioration des performances, prise en charge du rendu des surfaces transparentes chevauchant l'eau).

Plongeons

Si vous êtes aussi fan que nous du Commandant Cousteau, vous aimerez plonger sous l'eau avec le Water System. Il peut détecter si la caméra se trouve sous le plan d'eau et simuler un rendu sous-marin en fonction des propriétés physiques de l'eau.

Les effets caustiques peuvent être générés de manière procédurale pour simuler la réfraction de la lumière par les surfaces projetées sur le sol. Notez que les caustiques peuvent être réutilisés comme projections en dehors de l'eau, en utilisant un décalque, par exemple, pour simuler les caustiques de l'eau reflétés à l'intérieur d'une grotte.

Lorsque la caméra se trouve entre l'eau et l'extérieur, une ligne d'eau est générée et le rendu sous-marin est composé sur la partie immergée de la caméra. Le rendu des lignes d'eau est amélioré dans la version 2023.1, ce qui vous permet de le personnaliser avec une passe personnalisée (voir : La scène de l'échantillon de la ligne d'eau).

Houle, agitation, ondulations et courants

Ce qui rend l'eau encore plus attrayante sur le plan visuel, c'est la façon dont elle se déplace. Notez que le système de simulation de l'eau fourni se concentre sur la déformation du plan d'eau et non sur la simulation des fluides ou des éclaboussures.

Paramétrage de la simulation

Les ondes sont générées de manière procédurale à l'aide d'une simulation de transformée de Fourier rapide (FFT). En termes simples, il s'agit d'additionner un grand nombre d'ondes simples de différentes fréquences pour former des ondes complexes. En contrôlant la gamme de fréquences, vous pouvez contrôler l'agitation de votre eau.

Le système fonctionne en additionnant des gammes variées de fréquences, que nous appelons bandes.

La simulation totale est réalisée en additionnant les ondes générées par un maximum de trois bandes de fréquence

Le HDRP prend en charge jusqu'à trois bandes, ce qui simule trois effets du monde réel sur l'eau et couvre la plupart des cas d'utilisation :

  • La houle, représentant les vagues générées par les effets de la lune et du vent lointain. Il est uniquement contrôlé par le paramètre de distance au vent et permet d'orienter la direction de la houle.
  • Agitation, représentant le chaos généré par le vent.
  • Les ondulations, qui représentent les courants ou les effets locaux du vent. Il s'agit de la bande avec les fréquences les plus élevées, ou les ondes les plus petites, qui ajoute de fins détails à l'eau.
Paramètres permettant de contrôler la simulation par gamme de fréquence dans l'inspecteur

Par exemple, comme les piscines présentent de petites perturbations, elles n'utilisent que la bande de fréquence la plus élevée : les ondulations. Une rivière, qui est un peu plus complexe, aura des ondulations et une bande d'agitation. De plus, un océan dispose de toute la gamme de fréquences nécessaire pour couvrir toutes les tailles de vagues que l'on peut observer dans la vie réelle. La simulation est effectuée sur une parcelle carrée qui est ensuite répétée à l'infini.

Dans la version 2023.1, nous ajoutons la prise en charge des courants qui permettent aux ondulations de s'écouler en fonction des cartes de flux. La simulation est entièrement déterministe, ce qui permet d'obtenir des résultats cohérents lors de jeux multijoueurs, de simulations physiques ou de l'enregistrement d'un court métrage ou d'une cinématique.

Rendre avec précision et à l'échelle

Pour le rendu de la déformation du plan d'eau, le système utilise le déplacement de vertex et peut s'appliquer soit à la géométrie générée de manière procédurale, soit à un maillage personnalisé que vous fournissez. La géométrie procédurale fonctionne en instanciant des quadrilatères les uns à côté des autres, comme le fait le terrain pour le rendu. Cela peut également être utilisé lors de la création d'un océan infini ou de longues rivières pour s'assurer que la densité des vertex s'adapte à l'endroit où se trouve la caméra.

En outre, afin d'obtenir une densité de vertex plus fine pour le rendu de petites ondulations, HDRP peut s'appuyer sur la tessellation GPU, qui est un moyen de subdiviser les triangles à l'aide de shaders spéciaux. Grâce à cette fonction, lorsque la caméra se trouve à une certaine distance de la surface de l'eau, vous pouvez constater que davantage de triangles sont générés à proximité du point de vue.

Le système propose également diverses options permettant de trouver un équilibre entre la qualité visuelle et les performances de rendu. Pour en savoir plus sur l'optimisation des performances, consultez notre documentation.

Échantillonnage de la simulation

Comme nous venons de l'expliquer, la simulation s'exécute entièrement sur le GPU pour des raisons d'efficacité, mais une partie peut être reproduite sur le CPU pour vous permettre d'échantillonner la hauteur de l'eau et les courants (par exemple, pour faire flotter des objets le long d'une rivière).

Le coût de l'unité centrale est élevé car de nombreux calculs sont nécessaires pour la simulation, mais ce coût reste raisonnable grâce à l'utilisation de jobs burstifiés qui permettent de paralléliser plus efficacement les opérations.

Notez que, sur la base des retours d'expérience, l'API de script a évolué entre les versions 2022.2 et 2023.1 et peut nécessiter des ajustements de votre code entre les deux versions.

Pour commencer, vous trouverez deux exemples de code dans les scènes d'eau : l'un dans la scène de l'île, qui utilise Burst pour paralléliser l'échantillonnage de nombreux objets, et l'autre dans la scène du glacier, qui montre comment faire flotter les icebergs le long des courants de la rivière et les faire tomber dans la cascade avec un code plus simple, non parallélisé.

Mousse

La mousse simule les bulles générées sur ou sous l'eau par le vent lors des crêtes, par les vagues se brisant contre le rivage ou les rochers, ou par un bateau ou un personnage en mouvement dans l'eau.

Le système de gestion de l'eau peut générer automatiquement de la mousse en fonction de la simulation du plan d'eau et de la vitesse du vent à distance pour les rivières et les océans. Il vous permet ensuite d'ajuster la quantité de mousse et d'en modifier l'aspect, en choisissant sa douceur et le carrelage de la texture.

Mousse générée par la simulation de l'eau

Pour la version 2023.1, un générateur de mousse a été ajouté pour simuler des eaux vives pour une piste de bateau, des vagues ou autour de rochers en eau libre, de sorte que la mousse puisse être produite et poursuivre sa propre trajectoire en fonction des vagues. Dans la scène d'exemple, vous verrez différents exemples d'utilisation du générateur de mousse : Dans la scène de l'île, il est utilisé pour générer de la mousse au sommet des vagues déferlantes et autour de l'île, et dans la scène du glacier pour générer de la mousse derrière les icebergs qui flottent le long de la rivière.

Mousse placée manuellement autour des rochers et sur les vagues de rive à l'aide de générateurs de mousse

À l'aide de Shader Graph, vous pouvez injecter de la mousse personnalisée dans le nœud principal Eau et l'utiliser pour ajouter de la mousse procédurale personnalisée, par exemple pour les bords d'une rivière ou pour faire tourbillonner une chute d'eau. Par exemple, dans l'échantillon Glacier, le tourbillon au bas de la chute d'eau est obtenu en faisant simplement défiler et en mélangeant une texture de mousse personnalisée dans Shader Graph. La mousse sur les bordures est obtenue en échantillonnant le tampon de profondeur pour obtenir une profondeur approximative.

Écume générée par la lecture du tampon de profondeur dans l'eau Graphique Shader

De la mousse de simulation sera injectée là où l'agitation des vagues l'exige. Toutefois, à des fins artistiques, vous pouvez masquer certaines zones de la mousse réceptrice à l'aide d'un masque en mousse.

Intégration avec les mondes

Pour plus de réalisme, les surfaces et les simulations de l'eau doivent être modifiées localement pour mieux s'intégrer à votre monde et à vos accessoires. Par exemple, pour supprimer la géométrie de l'eau à l'intérieur d'un bateau, ajouter des vagues déferlantes près du rivage sur les bords de mer exposés à la houle, produire de l'écume autour des rochers, modifier les courants locaux, façonner des zones calmes à l'intérieur des baies, créer une cascade au milieu d'une rivière, ou encore générer de petits tourbillons dans une rivière ou un vortex géant au milieu de l'océan.

Des composants multiples vous permettent de personnaliser la simulation, la mousse et les courants pour créer ces variations locales ou des effets plus complexes :

  • Le Water Mask vous permet d'atténuer ou de supprimer les ondulations, la houle et l'écume sur une partie spécifique de la surface de l'eau.
  • Des décalcomanies peuvent être ajoutées à l'eau pour créer une mousse locale, modifier la fluidité de l'eau ou simuler de petites déformations locales telles que des gouttelettes, des impacts ou des ondulations personnalisées à l'aide d'une carte de normalité. Ils peuvent également être utilisés pour simuler l'humidité sur le sable ou les rochers (voir : la scène d'exemple de l'île) ou les caustiques sur les murs (voir : la scène d'exemple du glacier) indépendamment du système d'eau. Notez que la couleur ne peut pas être modifiée car les décalcomanies sont traitées en niveaux de gris.
  • Les déformateurs d'eau peuvent modifier localement la simulation pour créer des vagues, comme le montre l'exemple de l'île, ou une chute d'eau, comme le montre l'exemple du glacier.
Performance et débogage

Nous avons mesuré les performances de la scène Glacier, où la plupart des fonctionnalités sont activées sur différentes consoles, et nous avons établi le profil du système de distribution d'eau sur cette base. Grâce aux mesures, nous avons appris que le temps de rendu de l'eau est d'environ 4 ms sur le GPU des dernières générations, alors qu'il était d'environ 7 ms sur les consoles des générations précédentes. Bien entendu, cela dépend fortement des paramètres de qualité de l'eau, de la complexité de la simulation et de la quantité de pixels d'eau affichés à l'écran. Mais le système est suffisamment performant pour fonctionner sans problème sur différentes plateformes.

En outre, le système utilise un éclairage groupé différé pour optimiser l'ombrage et prendre en charge un grand nombre de sources lumineuses. La majeure partie du temps de rendu provient de la passe GBuffer en raison du nombre important de vertices nécessaires pour obtenir de belles vagues, même au loin. Lorsque la tessellation par le GPU est activée sur la surface, ce coût peut être contrôlé en modifiant le niveau maximal de tessellation et la distance d'évanouissement lorsque la caméra est éloignée de l'eau.

Dans la section Divers de chaque surface d'eau, vous avez accès à différents modes de débogage pour visualiser la direction du courant, la déformation, la mousse et d'autres masques appliqués sur l'eau.

Modes de débogage montrant le courant, la déformation, le masque d'eau et la mousse
Démonstration de l'eau

Pour voir le système de gestion de l'eau fonctionner sur des scènes plus complexes, nous avons créé un projet de démonstration présentant des scènes de piscine, d'île et de rivière.

Scène de démonstration sur l'île

La scène de l'île montre un océan infini avec des vagues de rivage arrivant sur la plage. Il montre comment utiliser les masques d'eau et créer des déformateurs et des générateurs de mousse à l'aide de textures de rendu personnalisées. Il utilise également des décalcomanies pour créer des interactions complexes avec la surface de l'eau lorsqu'une vague s'approche de la plage.

La scène de la piscine présente une surface d'eau intérieure avec des couleurs réalistes, de la profondeur, des effets sous-marins et des caustiques.

Scène de démonstration de la rivière

La scène de la rivière illustre l'utilisation de quads instanciés et tire parti d'une carte de courant pour simuler le flux, ainsi que de décalcomanies, d'un graphique de shaders personnalisé et d'un graphique VFX pour améliorer les visuels.

Vous pouvez télécharger les démos sur GitHub.

Comment démarrer

Pour utiliser le système d'eau, vous devez travailler avec le HDRP et Unity 2022.2 ou plus.

Bien que vous puissiez utiliser certaines des fonctionnalités initiales de la version 2022.2, nous vous recommandons de commencer par la version 2023.1, qui contient de nombreuses améliorations et fonctionnalités, y compris des modifications de l'API.

Vous pouvez télécharger les échantillons d'eau dans le gestionnaire de paquets, à partir desquels vous pouvez commencer à réutiliser le code et les systèmes des échantillons. Consultez également notre projet de démonstration WaterScenes sur GitHub pour des exemples plus complexes d'intégration de systèmes d'eau.

Pour en savoir plus, regardez la plongée profonde de Rémi et Adrien sur le système d'eau lors de la GDC 2023 ou lisez notre documentation.

Prochaines étapes

Nous n'avons pas encore prévu de nouvelles fonctionnalités à ce stade et nous nous concentrons actuellement sur la stabilité. Vous pouvez nous faire part de vos commentaires ou poser des questions sur notre fil de discussion dédié au forum Unity.

Pour proposer de nouvelles fonctionnalités et voter pour celles qui sont à l'étude, consultez nos feuilles de route publiques.

N'hésitez pas à nous faire part de vos commentaires sur le nouveau système d'approvisionnement en eau dans le forum du PRDH. Pour connaître les prochains blogs techniques des développeurs Unity, restez à l'écoute de la série permanente Tech from the Trenches.