Aufgabe 5: Depth of Field

Aus Nettundfroh
Wechseln zu: Navigation, Suche
Abbildung 1: Screenshot aus der WebGL-Implementierung

Inhaltsverzeichnis

Einleitung

Im Rahmen der fünften und letzten Aufgabe war es Ziel Multipass-Rendering-Verfahren zu untersuchen, beispielhaft zu implementieren, zu dokumentieren und die Ergebnisse in einer Präsentation vorzustellen. Dabei konnte jede Arbeitsgruppe ein Thema wählen. Wir haben uns für den Depth of Field Effekt entschieden.

Grundlagen

Depth of Field (DOF) bezeichnet in der Fotografie die Zone, die sich aus den Bereichen vor und hinter einem fokussierten Objekt ergibt, in denen akzeptabel scharf abgebildet wird. DOF ist abhängig vom Typ der Kamera, der Blendenöffnung und der Fokussierung. Bereiche direkt vor und hinter der fokussierten Entfernung verlieren sofort, wenn auch nicht wahrnehmbar, an Schärfe. Der Übergang von scharf zu unscharf ist graduell. Der Circle of Confusion (CoC) definiert, die Schärfe eines Punktes bei einer bestimmten Tiefe. Wenn der CoC sichtbar wird, ist diese Region außerhalb des DOF und somit nicht mehr scharf in einem akzeptablen Rahmen.

Implementierung

Abbildung 2: Depth Discontinuity Artefakte im Übergangsbereich zwischen Würfel und Kugel, sowie weichgezeichnete Ränder an Objekten, die scharf dargestellt werden sollten (Würfel)

Die Grundlage für die Implementierung ist erneut eine Erweiterung der Anwendung, die für die Lösung der Aufgabe 3 und 4 verwendet wurde und auf der TDL-Bibliothek basiert. Um den Effekt zu erreichen wurde von unserer Gruppe ein Lösungsansatz gewählt, der sich an der Technik des Reverse-Mapping Z-Buffer Depth of Field orientiert. Charakteristiken und Probleme der einzelnen Techniken werden in der Ausarbeitung gegenübergestellt.

Die Idee war zunächst das Bild einer Szene klar und weichgezeichnet in entsprechenden Buffern zu speichern. Darüber hinaus wurden die Tiefeninformationen am jeweiligen Punkt in einer 32Bit-Textur über die Erweiterung OES_texture_float mittels eines tdl.framebuffers.Float32Framebuffer-Objektes als normalisierter Wert zwischen 0 und 1 gespeichert. Die Farbwerte für den jeweiligen Pixel wurden daraufhin unter Einbeziehung des Tiefenwertes aus den Bufferobjekten die das klare und weichgezeichnete Objekt der Szene enthalten vermischt. Für den Weichzeichner wurde eine Gaußsche Verteilung in zwei Rendering-Passes (horizontal und vertikal) genutzt. Bei der Implementierung zeigten sich jedoch deutliche Fragmente an Punkten mit unendlicher Tiefe (weichgezeichnete Ränder bei Objekten im Schärfebereich).

Um dieses Verfahren weiter zu verfeinern wurde ein dynamischer Weichzeichner implementiert, der Farbwerte in Abhängigkeit des CoC interpolieren. In Folge entstanden in der Implementierung 5 Passes, die für sich genommen die einzelnen Verarbeitungsschritte des implementierten Algorithmus repräsentieren.

Abbildung 3: Schema zur Ermittlung der Farbe anhand der CoC-Werte in der Nachbarschaft
  1. Color Post Processor: Hier wird ein klares Bild der Szene in einem Framebuffer abgelegt.
  2. Depth Post Processor: Die Z-Werte der Punkte werden zu Tiefenwerten zwischen 0 und 1 normalisiert und als 32Bit-Fließkommazahl in einer Textur gespeichert. Sie bildet die Grundlage für die Berechnung des CoC im Folgeschritt. Die Tiefenwerte könnten auch im Alphakanal der 1. Textur gespeichert und so ein Durchlauf gespart werden. Dann könnte man innerhalb der Szene aber keine Transparenzen nutzen.
  3. Color with Circle of Confusion Post Processor: Um in anschließenden Durchläufen Texturlookups zu sparen, wird eine weitere Textur mit dem Ergebnis des ersten Durchlaufs befüllt, wobei der aus der Tiefe berechnete CoC normiert in den Alphakanal jedes Texels geschrieben wird. Dies könnte ebenfalls bereits in Pass 2 geschehen und so weiterer Pass gespart werden, wurde aber zur besseren Demonstration des Gesamtablaufs als einzelner Schritt belassen.
  4. Circle of Confusion masked Blur Post Processor: Erzeugt ein Bild der Szene, das in Abhängigkeit des CoC am jeweiligen Punkt weichgezeichnet ist. Innerhalb des Weichzeichnungsradius werden benachbarte Pixel betrachtet, um den Farbwert des aktuellen Pixels zu ermitteln. Dabei bestimmt der CoC-Wert wie viel ein Texel auf seine Nachbarn abfärbt. Jeder Farbwert wird mit seinem Alphakanal bzw. seinem CoC-Faktor multipliziert, bevor er in den durchschnittlichen Farbwert des betrachteten Pixel eingeht. Dadurch färben fokussierte Objekte nicht auf den Hintergrund ab.
  5. DOF Post Processor: Die Klare Textur mit CoC im Alphakanal aus Pass 3 und die Textur, die als Ergebnis von Pass 4 entsteht, werden für Lookups verwendet. Sie werden abhängig vom CoC für jeden Pixel interpoliert.

Lösung

WebGL Implementierung

Downloads

Depth of Field Ausarbeitung

Depth of Field Präsentation

Quellen

Devmaster.net Shader Effects: Depth of Field by (Nathaniel Meyer)

Nutty Software WebGL Depth of Field Example (Nathaniel Meyer)

GPU Gems Chapter 23. Depth of Field: A Survey of Techniques (Joe Demers)

Gpu Gems 3 Chapter 28. Practical Post-Process Depth of Field (Earl Hammon, Jr.)

wikipedia.org - Depth of Field (diverse Autoren)

Gamerendering.com – Gaussian Blur Filter Shader (diverse Autoren)




Zurück zur Real-Time Rendering Hauptseite

Master Semester 2