1 points par GN⁺ 2024-09-29 | 1 commentaires | Partager sur WhatsApp

GodotOceanWaves

Une expérience de rendu d’océan ouvert avec Godot Engine, qui génère les vagues à l’aide de la transformée de Fourier inverse d’un spectre directionnel de vagues océaniques. Le projet propose des paramètres simples permettant de modifier les propriétés des vagues en temps réel via des scripts, afin de reproduire différents environnements marins.

Introduction

Pourquoi la transformée de Fourier ?
  • Une méthode courante pour animer l’eau dans les jeux vidéo consiste à utiliser des Gerstner waves. Cela convient bien pour modéliser les détails basse fréquence d’une eau calme, mais reste insuffisant pour représenter fidèlement la surface agitée d’un océan ouvert.
  • Pour résoudre ce problème, les vagues sont simulées à l’aide de la transformée de Fourier inverse d’un spectre de vagues océaniques fondé sur des données empiriques recueillies par des océanographes.
  • L’avantage de travailler dans l’espace fréquentiel est qu’il devient facile de modifier les propriétés de l’océan. Avec les Gerstner waves, il n’est pas clair comment ajuster les vagues et leurs paramètres pour reproduire un état de mer précis.
  • Pour calculer la transformée de Fourier, le projet utilise l’algorithme de transformée de Fourier rapide (FFT). Sa complexité de calcul est inférieure à celle de l’algorithme classique de transformée de Fourier discrète, et il se prête bien à une exécution sur GPU.

Résultats

Ombrage des vagues
Modèle d’éclairage
  • Le modèle d’éclairage de l’océan suit principalement le BSDF décrit dans la conférence GDC d’"Atlas". Cependant, une distribution GGX est utilisée à la place de Beckmann pour la distribution des microfacettes.
  • Les normal maps / foam maps sont échantillonnées en mélangeant un filtrage bicubique et bilinéaire selon la densité de pixels en espace monde.
Écume océanique
  • Tessendorf propose de générer de l’écume lorsque le sommet des vagues s’enroule sur lui-même.
  • L’écume s’accumule de façon linéaire et disparaît de manière exponentielle, avec un contrôle via les paramètres « vitesse de croissance de l’écume » et « vitesse de disparition de l’écume ».
Embruns marins
  • Les embruns marins sont modélisés sous forme de particules à l’aide du nœud GPUParticles3D de Godot.
  • Les particules sont réparties uniformément à l’intérieur de la boîte englobante du nœud GPUParticles3D.
  • Chaque particule d’embrun marin utilise un sprite billboard avec une unique texture statique.
Simulation des vagues
  • La méthode de génération des vagues de surface suit Tessendorf.
  • La fonction de spectre directionnel des vagues océaniques renvoie l’énergie des vagues en fonction de la fréquence et de la direction.
Spectre des vagues océaniques
  • Le spectre Texel-Marsen-Arsloe (TMA) a été choisi comme fonction de spectre non directionnelle.
  • Un mélange de diffusion flat et Hasselmann est utilisé comme fonction de diffusion directionnelle.
Transformée de Fourier rapide
  • Une implémentation FFT personnalisée pour GPU a été écrite.
  • L’algorithme FFT de Stockham est utilisé pour éviter la permutation initiale par inversion de bits.
Cascades de vagues
  • À grande distance, les artefacts de tiling deviennent très visibles.
  • Le système de génération de vagues peut superposer plusieurs cascades de vagues simultanément.
Répartition de charge
  • Le mouvement des vagues peut rester fluide même si les déplacements ne sont pas mis à jour à chaque frame.
  • Un paramètre « vitesse de mise à jour » a été introduit pour contrôler la fréquence de mise à jour des cascades de vagues par seconde.

Références

  • Flügge, Fynn-Jorin. Realtime GPGPU FFT Ocean Water Simulation. Hamburg University of Technology. (2017).
  • Gunnell, Garrett. I Tried Simulating The Entire Ocean. (2023).
  • Horvath, Christopher J. Empirical Directional Wave Spectra for Computer Graphics. DigiPro. (2015).
  • Tessendorf, Jerry. Simulating Ocean Water. SIGGRAPH. (2004).
  • Matusiak, Robert. Implementing Fast Fourier Transform Algorithms of Real-Valued Sequences. Texas Instruments. (2001).
  • Mihelich, Mark. Wakes, Explosions and Lighting: Interactive Water Simulation in 'Atlas'. GDC. (2019).
  • Pensionerov, Ivan. FFT-Ocean. GitHub. (2020).

Mentions de droits

  • Evening Road 01 (Pure Sky) par Jarod Guest est utilisé sous licence CC0 1.0.
  • OTFFT DIT Stockham Algorithm par Takuya Okahisa est utilisé et modifié sous licence MIT.

Résumé GN⁺

  • GodotOceanWaves est une expérience de rendu d’océan ouvert avec Godot Engine, qui génère les vagues à l’aide de la transformée de Fourier inverse d’un spectre directionnel de vagues océaniques.
  • En utilisant la transformée de Fourier rapide (FFT), le projet peut s’exécuter efficacement sur GPU et reproduire différents environnements de vagues océaniques.
  • Il simule une surface océanique réaliste en combinant plusieurs éléments, dont l’ombrage des vagues, l’écume, les embruns marins et la simulation des vagues.
  • Ce projet peut être utile pour mettre en œuvre un rendu océanique réaliste dans les jeux vidéo et les simulations.

1 commentaires

 
GN⁺ 2024-09-29
Avis Hacker News
  • Les deux autres dépôts Godot de cette personne sont aussi très intéressants

    • J’aime la façon dont les détails sont ajoutés dans la description du dépôt
    • Celui-ci est particulièrement intéressant : GodotGaussianSplatting
    • C’est peut-être un étudiant, il cite souvent d’autres travaux de recherche et semble bien comprendre des publications récentes
  • Il y a 20 ans, même en passant des mois à rendre une surface océanique, on n’aurait pas atteint ce niveau

    • C’est impressionnant de voir à quel point cette technique est aboutie
  • La démo donne une impression un peu exagérée

    • J’ai plus de 50 000 milles nautiques d’expérience en navigation
    • Des vagues aussi hautes et aussi tranchantes demanderaient un vent plus fort
    • Cela devrait pouvoir se corriger en ajustant les paramètres
  • J’imagine que le rendu se fait en temps réel dans Godot

    • Je me demande s’il faut un GPU puissant
  • C’est le genre de choses qui m’a donné envie de m’intéresser à l’informatique, puis je me suis épuisé au fil du temps avec les bibliothèques, les endpoints et le travail en entreprise

    • J’aimerais m’y remettre un jour
  • Si les simulations de vagues / d’océan vous intéressent, Acerola a publié de super vidéos sur le sujet

  • C’est intéressant de voir à quel point ce problème est difficile

    • On essaie depuis des décennies et ce n’est toujours pas parfait
    • Si on fige une image, les vagues ressemblent à des montagnes enneigées
    • Pour que l’eau ait des caractéristiques aussi tranchantes, il faudrait un vent extrêmement fort
    • La simulation restitue bien le caractère fluide des vagues
  • J’ai vécu plusieurs années au bord de la mer

    • Quand on vit près de la plage, on passe beaucoup de temps à regarder l’océan
    • Ce rendu ressemble à une vraie mer
  • Cette approche a quelques limites pour des vagues très grandes

    • Les vagues d’eau ne sont pas des ondes sinusoïdales, mais pour les petites vagues cette méthode fonctionne bien
    • Les grandes vagues interagissent de manière non linéaire, donc il faut une autre approche
  • Il y a aussi un bel exemple sur Shadertoy

  • Fourier mesurait les marées lorsqu’il a conçu la transformation de fréquence des ondes

    • La boucle est presque bouclée
    • C’est très impressionnant
  • C’est très impressionnant, mais il y a un léger problème dans la douceur des vagues

    • La façon dont les vagues haute fréquence se déplacent sur les vagues basse fréquence est différente dans la vidéo