Simulation of Light Refraction on modern Graphics Hardware
















































- Slides: 48
Simulation of Light Refraction on modern Graphics Hardware (or: Rendering really pretty pools) Florian Hänel
Übliche Verfahren • Mehrere Renderbuffer • Originalszene rendern • Tiefe des Wassers rendern
Übliche Verfahren II • Für Spiegelung – Szene an Wasseroberfläche spiegeln • Blickstrahl an der Wasseroberfläche brechen • Normale aus Wasseroberfläche für Wellen • „gebrochener“ Sehstrahl zum auslesen aus Textur
Übliche Verfahren III • Pro: – Effizient – Geringe Hardwareanforderungen – Implementierung einfach • Aber: – Nicht physikalisch korrekt – Keine Wellen – kein Wasser?
Zum Vergleich
Brechungseindruck • Je flacher man auf die Oberfläche blickt, desto seichter wirkt das Wasser • Teile Unterwasser Sichtbar, die ohne Brechung nicht sichtbar sind
Brechungsgesetz • Begründet im Brechungsgesetz • Snell’s Law (rechts) • Nicht linear
Umkehrung möglich. . ? • Einfache Formel • Idee: Umkehrung auf Vertices in Vertex Shader anwenden • „Gegeben die Wasseroberfläche und Punkte Unterwasser, berechne Eintrittspunkt des Sichtstrahls in die Wasseroberfläche“
…nicht trivial • Verschiedene Ansätze – z. B. Pfadminimierung (Fermat) • Mathematica: 5 Seiten • Physiker: ohne Erfolg
nicht sinnvoll • Brechung ist nicht linear • Linien werden je nach Blickwinkel gekrümmt • Resultat – keine Dreiecke – Konkav
Wellen • beeinflussen die Blickstrahlen • Visuelle Fragmentierung • Reine Projektion also ohnehin unzureichend
Lösung: „Brute Force“ • Raycasting im Fragment Shader • Zum Beispiel in eine Heightmap: – Baboud, Lionel and D'ecoret, Xavier: Realistic Water Volumes in Real-Time
Geometrie erwünscht • Einsatzgebiet von Heightmaps begrenzt – Auflösung? – Interaktivität? – Animation? – Tiefe? • Idee: Hybrides Verfahren – Raycasting + Geometrie
Ansatz: Sichtstrahlen Quantisieren • Quantisierung: Unterteilung der Blickrichtungen in Quanten • Für jeden Richtungsabschnitt Geometrie erzeugen • Geometry Shader
Richtungsbereich • • Durch Brechungsindex bestimmt Anschaulich: „Snell‘s Window“ Schränkt zu quantisierenden Bereich ein Spielraum für Wellen beachten
Analyse • Effektiv: visueller Eindruck überzeugt • Effizient? – Erzeugte Geometrie überlappt stark – Viel Overdraw mit teurem Fragment Shader – Für jedes Dreieck n-Durchgänge
Ansatz: Single-Pass • • Ein Dreieck pro Unterwasserdreieck Sichtbarkeit des gebr. Dreiecks abdecken Je tiefer unter Wasser desto größer „Inkreis-Expansion“
„Inkreis Expansion“ • Verschiebung aus Richtung des Mittelpunkts des Inkreises des Dreiecks verschoben
Inkreis-Expansion II • Vertikale Dreiecke erzeugen degenerierte Dreiecke • Projektion aller Punkte auf eine Linie
Quads statt Dreiecke • Statt eines Dreiecks ein Quad pro Dreieck Unterwasser • Geringerer Overdraw
Abschätzung der Sichtbarkeit • Licht nimmt den schnellsten Weg (Fermat‘s Principle) • Es gibt einfache Oberund Untergrenzen
Abschätzung der Sichtbarkeit II • Keine Brechung – Licht nimmt direkten Weg • Sehr dichtes Medium – Licht nimmt kürzesten Weg zur Oberfläche • Wasser dazwischen • 3 Eckpunkte • 6 Vergleichspunkte
Abschätzung der Sichtbarkeit III • bessere Abschätzung in Screenspace
Probleme • Screenspace + Geometry Shader – Kein Hardware Clipping – Eigener Clipping Algorithmus • Depth-buffer – Erzeugte Geometrie liegt in Wasseroberfläche – Z-Wert muss in Fragment Shader geschrieben werden – Was ist der richtige Z-Wert nach Brechung?
Depth-Buffer: Probleme • Original Z-Wert des ungebrochenen Dreiecks? • Kann zu Unstimmigkeiten führen
Ergebnis sa_final. avi
Ergebnis
Erweiterung auf Kaustiken (nicht Teil der Studienarbeit)
Licht, bitte! • Bisher noch etwas steril • Kaustiken können den visuellen Eindruck verbessern
Kaustik – erster Versuch • Neuer Kaustik-Pass aus Licht-Perspektive • Statt in den Frontbuffer, in einen Renderbuffer • Statt Farbwert, Weltkoordinate • Entspricht „Auftreffpunkt eines Photons“ • =>„Photon-Map“
Kaustik – erster Versuch • Weiterer Pass und weiterer Renderbuffer • Aus Kamerasicht • Darin die Weltkoordinaten als Punktmenge splatten • Man erhält die Kaustik ohne Brechung =>“Kaustik-Map“
Kaustik – erster Versuch • Frontbuffer-Pass: – Position auf original-Dreieck Projizieren – Man erhält Bildschirmkoordinate ohne Brechung – Darüber in Kaustik-Map zugreifen und Kaustik auslesen
• Ergebnisse vielversprechend • Videos – refractrioncaustic. avi – refractioncaustic_filtered_specular. avi
Kaustik – erster Versuch • Probleme: Alle die das Ursprüngliche Verfahren lösen wollte, insbesondere:
Kaustik - zweiter Versuch • Statt Weltkkordinaten im ersten Pass, Texturkoordinaten • Erfordert Geometrie die eindeutig auf eine Lightmap „abgerollt“ ist (UV-mapping) • Splatten der Photonen in eine Lightmap • Beim Frontbuffer-Pass Zugriff darin über Texturkoordinaten
Kaustik – zweiter Versuch • Es klappt… fast – Bisher unerklärliche Verschiebung – Strange. avi • Offene Fragen: – Objektgröße beim Splatten in die Lightmap berücksichtigen – Kleine Objekte können unverhältnismäßig große Lightmap besitzen
Vielen Dank für Ihre Aufmerksamkeit