CGExercises

Exercise #11

Computergraphik Übungsblatt #11


OpenGL Tutorial: Postprocessing & Image FX



Motivation

Die Macht der Mathematik lässt sich anhand von Shadertoy Beispielen gut demonstrieren:

FXShadertoy BeispielHint
Bokehhttps://www.shadertoy.com/view/MdfBRXDROP_DEBUG
Schärfentiefehttps://www.shadertoy.com/view/MsG3DzRAY_STEPS_SECOND
Videoartefaktehttps://www.shadertoy.com/view/Md2GDw 
Rainy Windowhttps://www.shadertoy.com/view/tlVGWKUSE_POST_PROCESSING

Wir werden in der heutigen Übung einfache Shader selber programmieren. Schon mit wenig Mathematik lassen sich künstlerische Effekte auf den Bildschirm zaubern. Wir konzentrieren uns insbesondere auf Postprocessing-Effekte.

Aufgabe 11.1: Präliminarien

Starten Sie mit dem Basisquelltext postpro.cpp.

Dieser zeichnet die Szene nicht direkt sondern zuerst einmal in einen sog. FBO. Dieser FBO kann in einen zweiten Post-Processing Pass als Lookup-Textur verwendet werden, um die dargestellte Szene zu verfremden.

Der zweite Pass fehlt noch: Zeichnen Sie ein Viereck (LGL_QUADS), welches das ganze Fenster überdeckt (entsprechend einer orthographischen Projektion) und passende Texturkoordinaten für den Lookup besitzt (linke obere Ecke → (1,0) usw.). Verwenden Sie im zweiten Pass einen GLSL Postprocessing Shader, der im FBO zuerst nur die Farbe des 1ten Passes in der FBO-Textur mit Hilfe eines 2D Samplers nachschlägt. Für die nachfolgenden Aufgaben ist jeweils nur dieser GLSL-Shader anzupassen.

Aufgabe 11.2: Gamma-Korrektur

Verändern Sie nun im 2ten Pass die Fragment-Farbe, so dass deren Helligkeit $I$ mit Hilfe einer Gamma-Funktion angepasst wird.

Tipp: $I' = I^\gamma$


Aufgabe 11.3: Vignettierung


Post-Processing: Vignette

Verändern Sie im 2ten Pass die Farbe so, dass die Helligkeit mit zunehmendem Abstand r zum Bildzentrum mit der Texturkoordinate (0.5, 0.5) abnimmt.

Tipp: $I'(r) = I \cdot (1 - r^2)$


Aufgabe 11.4: Fish-Eye


Post-Processing: Fish-Eye

Verändern Sie im 2ten Pass die Farbe so, dass die Farbe zum äußeren Bildrand verzerrt wird. Dazu verwendet man einen Differenzvektor für den Textur-Lookup → Lookup-Offset.

Tipp: Der Offset hängt nicht-linear vom Differenzvektor zum Bildzentrum ab → tan()


Aufgabe 11.5: Time-Based Image FX

Verändern Sie im 2ten Pass die Farbe so, dass die Farbe und/oder Verzerrung von der Zeit abhängt. Zum Beispiel ergibt sich durch einen zeitabhängigen Sinus ein Welleneffekt.

Experimentieren Sie mit der Zeitabhängigkeit, d.h. experimentieren im GLSL Shader mit der uniformen Variablen time.

Tipp: sin(0.001*gl_FragPos.y + 3*time)


OpenGL Kür: Postprocessing & Image FX


Von den folgenden Aufgaben suchen Sie Sich bitte eine Aufgabe aus und implementieren einen entsprechenden GLSL Shader (zusätzliche Aufgaben sind optional und ergeben entsprechend Bonuspunkte ++):

Aufgabe 11.6: Kantendetektion


Kantendetektion

Verwendet den Mittelwert der Farbdifferenzen zu den vier Nachbarpixeln.

Tipp: Verwenden Sie einen Lookup-Offset der jeweils der Größe eines Pixels im normierten Bildraum entspricht.


Aufgabe 11.7: Chromatische Aberration


Chromatic Aberration

Verwendet einen Lookup-Offset, der farbkanalabhängig ist.

Tipp: Der Lookup-Offset für den Rot- und Blau-Kanal ist proportional zum Differenzvektor Bildzentrum, aber mit umgekehrtem Vorzeichen.


Aufgabe 11.8: Halftoning


Halftoning

Verwendet ein prozedurales Punktmuster als Basis für eine Threshold-Operation.

Tipp: Berechnen Sie den normierten Abstand zum Punktzentrum und verwenden Sie diesen als Threshold für jeden Farbkanal.


Aufgabe 11.9: Cracked Lens FX


Cracked Lens

Normalentextur

Verwendet einen Lookup-Offset, der von einer Normalen-Textur abhängig ist.

Tipp: Die Normalen sind in der Textur als Farbe codiert, die zuerst wieder decodiert werden müssen. Nach der Decodierung wird der Rot- und Grün-Kanal als Lookup-Offset verwendet.


OpenGL Ausblick: Postprocessing, Perlin Noise, 3D Textures etc.


FoggyForest

Es gibt noch viele weitere Einsatzmöglichkeiten für Postprocessing; manche benötigen ziemlich viel zusätzlichen Aufwand, fast alle aktuellen Spiele benutzen sie:

  • Fog: Auch Nebel kann als Postprocessing-Effect dargestellt werden. Dazu benötigt man die Tiefeninformation, also muss diese auch in einer Textur bereit gestellt werden.


BloomFX
  • Bloom-Effekt: Überstrahlen heller Bildanteile; dafür muss in einen Floating Point Renderbuffer gezeichnet werden, damit Beleuchtungswerte >1 erhalten bleiben und auf die Überstrahlung ein Blur-Effekt gelegt werden; das ganze ist ein Teil von HDR (High Dynamic Range) Rendering.


MotionBlur
  • Motion Blur: Bewegte Szenen sollten unscharf sein, da das Auge keine Momentaufnahme macht sondern eine gewisse Trägheit hat. Ohne Motion Blur können Bewegungen abgehackt wirken. Dazu wird die Szene mehrmals gezeichnet, jeweils mit kleinen zeitlichen Änderungen, und diese anschließend überlagert. Achtung: Performance!


LensFlare
  • Lens Flares: Kameraobjektive erzeugen Störungen (Flares), wenn sie direkt in die Sonne gehalten werden, da sich das Licht teilweise im Objektiv reflektiert wird. Diese Lens Flares sind eigentlich ein störender Effekt, sind in der Computergrafik aber ein “willkommener” Seiteneffekt, um die Lichtquelle glaubwürdiger erscheinen zu lassen. Lens-Flare wird nicht physikalisch simuliert sondern gefakt!


Stroking
  • Stroking: Man kann auch künstlerische Zeicheneffekte (Strichzeichnungen, Wasserfarben, Impressionismus, Expressionismus, …) mit Hilfe von entsprechenden Texturen und aufwändigeren Berechnungen nachbilden.
  • … und noch unendlich viel mehr

Zum Abschluß des Praktikums hier ein Potpourri an Shader-Effekten:

FXShadertoy Beispiel
Lens Flarehttps://www.shadertoy.com/view/4sX3Rs
Playing Marblehttps://www.shadertoy.com/view/MtX3Ws
Cloudy Terrainhttps://www.shadertoy.com/view/MdlGW7
Perlin Noise Perlin Noise: Marble
Marble Teapot Post-Processing: Rainy Day


Hausaufgaben


Blender-Movie:
Schließen Sie Ihr Blender-Projekt ab, indem Sie für die nachfolgende Präsentation einen entsprechenenden Kurzfilm rendern.

Options: