FFT-basierte Ozeanwellen-Renderung in Godot
(github.com/2Retr0)GodotOceanWaves
Ein Rendering-Experiment für den offenen Ozean mit der Godot Engine, das Wellen mithilfe der inversen Fourier-Transformation eines gerichteten Ozeanwellen-Spektrums erzeugt. Es bietet einfache Parameter, mit denen sich Welleneigenschaften per Skript in Echtzeit anpassen lassen, um verschiedene Ozeanwellen-Umgebungen nachzubilden.
Einführung
Warum Fourier-Transformation?
- Eine gängige Methode, Wasser in Videospielen zu animieren, ist die Verwendung von Gerstner-Wellen. Diese eignen sich jedoch gut zur Modellierung niederfrequenter Details von ruhigem Wasser, reichen aber nicht aus, um die raue Oberfläche des offenen Ozeans präzise darzustellen.
- Um das zu lösen, werden Wellen mithilfe der inversen Fourier-Transformation eines Ozeanwellen-Spektrums simuliert, das auf empirischen Daten basiert, die von Ozeanografen gesammelt wurden.
- Der Vorteil der Arbeit im Frequenzraum besteht darin, dass sich Ozeaneigenschaften leicht anpassen lassen. Bei der Verwendung von Gerstner-Wellen ist unklar, wie die Wellen und ihre Parameter verändert werden müssen, um einen bestimmten Seegang nachzubilden.
- Zur Berechnung der Fourier-Transformation wird der Algorithmus der Fast Fourier Transform (FFT) verwendet. Er hat eine geringere Rechenkomplexität als der klassische Algorithmus der diskreten Fourier-Transformation und eignet sich für die Ausführung auf der GPU.
Ergebnisse
Wellenschattierung
Beleuchtungsmodell
- Das Beleuchtungsmodell des Ozeans folgt hauptsächlich dem in dem GDC-Vortrag zu 'Atlas' beschriebenen BSDF. Für die Mikrofacettenverteilung wird jedoch statt der Beckmann-Verteilung die GGX-Verteilung verwendet.
- Normal-/Foam-Maps werden gesampelt, indem bicubische und bilineare Filterung abhängig von der Pixeldichte im Weltraum gemischt werden.
Meerschaum
- Tessendorf schlägt eine Methode vor, bei der Schaum entsteht, wenn die Spitzen der Wellen in sich selbst einrollen.
- Schaum wird linear akkumuliert und exponentiell abgebaut und über die Parameter „Schaumwachstumsrate“ und „Schaumzerfallsrate“ gesteuert.
Meeresspray
- Meeresspray wird mithilfe des GPUParticles3D-Knotens von Godot als Partikel modelliert.
- Die Partikel sind gleichmäßig innerhalb der Bounding Box des GPUParticles3D-Knotens verteilt.
- Jedes Meeresspray-Partikel verwendet ein Billboard-Sprite mit einer einzelnen statischen Textur.
Wellensimulation
- Die Methode zur Erzeugung von Oberflächenwellen folgt Tessendorf.
- Die Funktion des gerichteten Ozeanwellen-Spektrums liefert die Energie der Wellen in Abhängigkeit von Frequenz und Richtung.
Ozeanwellen-Spektrum
- Als nichtgerichtete Spektrumsfunktion wurde das Texel-Marsen-Arsloe-Spektrum (TMA) gewählt.
- Als gerichtete Streufunktion wird eine Mischung aus flat- und Hasselmann-Streuung verwendet.
Fast Fourier Transform
- Es wurde eine benutzerdefinierte FFT-Implementierung für die GPU geschrieben.
- Es wird der Stockham-FFT-Algorithmus verwendet, um die anfängliche Bit-Reversal-Permutation zu vermeiden.
Wellen-Kaskaden
- Auf große Entfernungen werden Tiling-Artefakte sehr deutlich sichtbar.
- Das Wellenerzeugungssystem kann mehrere Wellen-Kaskaden gleichzeitig schichten.
Lastverteilung
- Die Bewegung der Wellen kann auch dann noch glatt wirken, wenn die Verschiebung nicht in jedem Frame aktualisiert wird.
- Es wurde der Parameter „Aktualisierungsrate“ eingeführt, um zu steuern, wie häufig Wellen-Kaskaden pro Sekunde aktualisiert werden.
Literaturhinweise
- 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).
Urheberrechtshinweise
- Evening Road 01 (Pure Sky) von Jarod Guest wird unter der Lizenz CC0 1.0 verwendet.
- OTFFT DIT Stockham Algorithm von Takuya Okahisa wird unter der MIT-Lizenz verwendet und modifiziert.
Zusammenfassung von GN⁺
- GodotOceanWaves ist ein Rendering-Experiment für den offenen Ozean mit der Godot Engine, das Wellen mithilfe der inversen Fourier-Transformation eines gerichteten Ozeanwellen-Spektrums erzeugt.
- Durch die Verwendung der Fast Fourier Transform (FFT) kann es effizient auf der GPU ausgeführt werden und verschiedene Ozeanwellen-Umgebungen nachbilden.
- Es simuliert eine realistische Ozeanoberfläche mit verschiedenen Elementen wie Wellenschattierung, Meerschaum, Meeresspray und Wellensimulation.
- Dieses Projekt kann nützlich sein, um realistische Ozean-Renderings in Videospielen und Simulationen zu implementieren.
1 Kommentare
Hacker-News-Kommentare
Die beiden anderen Godot-Repositories dieser Person sind ebenfalls sehr interessant
Vor 20 Jahren hätte man Monate damit verbringen können, die Meeresoberfläche zu rendern, ohne dieses Niveau zu erreichen
Der Demo-Clip wirkt etwas übertrieben
Vermutlich findet das Rendering in Godot in Echtzeit statt
Solche Dinge haben mein Interesse an Computern geweckt, aber unterwegs bin ich an Bibliotheken, Endpoints und der Firmenarbeit müde geworden
Falls man sich für Wellen-/Meersimulation interessiert: Acerola hat dazu großartige Videos veröffentlicht
Es ist interessant, wie schwierig dieses Problem ist
Ich habe mehrere Jahre am Strand gelebt
Dieser Ansatz hat bei sehr großen Wellen leichte Grenzen
Auch auf Shadertoy gibt es ein großartiges Beispiel
Fourier hat bei der Entwicklung der Frequenztransformation für Wellen Gezeitenwellen gemessen
Sehr beeindruckend, aber mit der Weichheit der Wellen gibt es ein kleines Problem