Simulations & Computations

Beschreibung

In dieser Aufgabe soll eine echtzeitfähige Wassersimulation implementiert werden. Das Rendering soll in dieser Aufgabe nur nebensächlich behandelt werden. Im Mittelpunkt wird die Simulation stehen, für die der Compute Shader genutzt werden soll.

Im Gegensatz zu den vergangenen Aufgaben, wird Euch dieses Mal ein Beispielprogramm anstelle einer Teillösung bereitgestellt. Dieses zeigt, wie der Compute Shader auf Buffer-Objekten arbeiten kann.

Nutzt am besten ein Programm aus den vergangenen Übungen oder das Beispielprogramm als Basis für Eure Implementierung. Bedenkt jedoch, dass eine Wasseroberfläche typischerweise transparent ist und deswegen nicht ohne Weiteres in einen Deferred Renderer integriert werden kann. Nutzt entweder einen vollständigen Forward-Renderer oder implementiert die Wasseroberfläche als nachträglichen Rendering-Schritt (per Forward-Rendering) in einem Deferred Renderer.

Abgabe bis (incl. 28.02.) nach Absprache.

Terrain mit Wasserfläche
Wasserfläche mit Reflexionen

Kernanforderungen

  • Nutzt Indizes für das Mesh der Wasseroberfläche. Legt diese in ein Buffer-Objekt und rendert mit dem Draw-Command glDrawElements.
  • Implementiert die Wassersimulation aus den Folien der Aufgabenvorstellung. Nutzt dafür den Compute Shader und arbeitet direkt auf dem Mesh der Wasseroberfläche. Verwendet Double Buffering, um Ergebnisse zu erzeugen, die unabhängig von der Ausführungsreihenfolge der Compute Shader Invocations sind.
  • Überschreibt einige Simulationsergebnisse im Abstand einiger Sekunden mit anderen Werten, damit die Simulation startet und am Laufen gehalten wird.
  • Berechnet nach der Simulation neue Normalen für die Vertizes.

Weitere Funktionalitätsanforderungen

  • Arbeitet auf OpenGL-Version 4.3 und der GLSL-Version 430 core

Reflexionen

  • Rendert eine Skybox, um eine Plattkarte (engl. equirectangular projection) als Umgebung der Szene darzustellen. Alternativ zur Skybox könnt Ihr auch ein Quad über den gesamten Bildschirm rendern und die Vektoren zum Zugriff auf die Plattkarte mit Zuhilfenahme der inversen Projektions- und View-Matrix berechnen. Der Zugriff auf die Plattkarte wird in den Folien der Aufgabenvorstellung näher erklärt. Hier findet Ihr ein Beispielbild.
  • Implementiert Reflexionen unter Verwendung der Plattkarte. Ermittelt dazu den Reflexionsvektor, indem Ihr den Vektor vom Betrachter zum Punkt auf der Wasseroberfläche berechnet, und nutzt die Funktion reflect oder eine eigene Implementierung, um diesen an der Normale der Wasseroberfläche zu reflektieren. Nutzt das Modell von Schlick für die Fresnel-Reflexion, um den Anteil der reflektierten Energie zu bestimmen.

Value Noise

  • Berechnet Value Noise, um die Höhenwerte für einen Untergrund zu bestimmten. Um die Frequenz und Amplitude der einzelnen Oktaven zu bestimmen, könnt Ihr die Formeln aus den Folien der Aufgabenvorstellung verwenden. Andere Ansätze sind auch zulässig, solange mehrere Oktaven verwendet werden und diese verschiedene Frequenzen und Amplituden besitzen.

Allgemein 

  • Nutzt Blending, um der Wasseroberfläche Transparenz zu verleihen. Die Implementierung von Brechungen ist nicht gefordert, auch wenn diese in den Folien der Aufgabenvorstellung erklärt wird.

Tipps

Shader Storage Buffer

  • Legt für den Anfang nur 4D-Vektoren in die Shader Storage Buffer, um Padding-Probleme (siehe Folien der Aufgabenvorstellung) zu verhindern.

Plattkarten

  • Um weitere Environment Maps zu finden, könnt Ihr nach Begriffen wie "equirectangular environment map" suchen. Beschränkt dabei die Suche auf große Bilder.
  • Man findet viele Plattkarten im hdr.-Format. Dabei handelt es sich um Bilder mit einem sehr hohen Dynamikumfang (HDR). Diese werden beispielsweise für Physically Based Renderer benötigt. Wir können mit diesen leider nicht arbeiten, da sie auch Werte größer 1 speichern.

 

 

Ideen

Für diejenigen, die mit der Aufgabe schnell fertig und noch nicht genug ausgelastet mit CG2 und anderen Übungen sind, gibt es folgende Ideen, die zum Teil das Wissen vertiefen oder einen Vorausblick auf die kommenden Aufgaben geben können.

  • In dem Foliensatz ist neben der Reflektion auch die Lichtbrechung erklärt, dies kann umgesetzt werden, indem ihr anstelle von Blending, dass Wasser Opak über die Szene rendert und aus einer vorhergerenderten Hintergrund-Textur mittels Refraktion den neuen Boden samplet. (Dieser kann mittels wassertiefenabhängigen Faktor als Pseudo-Refraktion genutzt werden)
  • In dem Original Foliensatz von Müller-Fischer wird ebenfalls die Interaktion mit Objekten erklärt. Hier könnte z.B. ein Würfel/eine Kugel in das Wasser becken fallen gelassen werden und entsprechend dynamisch die Reaktion des Wasser berechnet werden. Den Foliensatz findet ihr hier.
  • Anstelle der OpenGL Compute Shader kann auch ein Cuda oder OpenCL Kernel geschrieben und genutzt werden.
  • ....

Abnahme

Siehe Aufgabe 5