1 Punkte von GN⁺ 2024-09-29 | 1 Kommentare | Auf WhatsApp teilen

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

 
GN⁺ 2024-09-29
Hacker-News-Kommentare
  • Die beiden anderen Godot-Repositories dieser Person sind ebenfalls sehr interessant

    • Mir gefällt, wie in den Repository-Beschreibungen Details ergänzt werden
    • Besonders dieses Repository ist interessant: GodotGaussianSplatting
    • Wahrscheinlich ist es ein Student; es wird häufig auf andere Forschung verwiesen, und das Verständnis für kürzlich veröffentlichte Materialien ist hoch
  • Vor 20 Jahren hätte man Monate damit verbringen können, die Meeresoberfläche zu rendern, ohne dieses Niveau zu erreichen

    • Erstaunlich, wie gut diese Technik ist
  • Der Demo-Clip wirkt etwas übertrieben

    • Ich habe mehr als 50.000 Nm Segelerfahrung
    • So scharfe und hohe Wellen würden stärkeren Wind erfordern
    • Das ließe sich wohl durch Parameter-Tuning beheben
  • Vermutlich findet das Rendering in Godot in Echtzeit statt

    • Ich frage mich, ob dafür eine leistungsstarke GPU nötig ist
  • Solche Dinge haben mein Interesse an Computern geweckt, aber unterwegs bin ich an Bibliotheken, Endpoints und der Firmenarbeit müde geworden

    • Irgendwann würde ich das gern wieder angehen
  • Falls man sich für Wellen-/Meersimulation interessiert: Acerola hat dazu großartige Videos veröffentlicht

  • Es ist interessant, wie schwierig dieses Problem ist

    • Seit Jahrzehnten versucht man es, und es ist immer noch unvollkommen
    • Wenn man das Bild anhält, sehen die Wellen wie schneebedeckte Berge aus
    • Damit Wasser so scharfe Merkmale hat, müsste der Wind sehr stark sein
    • Die Simulation setzt die weiche Eigenschaft von Wellen gut um
  • Ich habe mehrere Jahre am Strand gelebt

    • Wenn man am Strand lebt, schaut man lange auf das Meer
    • Dieses Rendering sieht wie ein echtes Meer aus
  • Dieser Ansatz hat bei sehr großen Wellen leichte Grenzen

    • Wasserwellen sind keine Sinuswellen, aber bei kleinen Wellen funktioniert diese Methode gut
    • Große Wellen interagieren nichtlinear, daher ist ein anderer Ansatz nötig
  • Auch auf Shadertoy gibt es ein großartiges Beispiel

  • Fourier hat bei der Entwicklung der Frequenztransformation für Wellen Gezeitenwellen gemessen

    • Fast ein perfekter Kreis
    • Sehr beeindruckend
  • Sehr beeindruckend, aber mit der Weichheit der Wellen gibt es ein kleines Problem

    • Die Art, wie hochfrequente Wellen über niederfrequente Wellen laufen, unterscheidet sich vom Video