CGExercises

CG 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 (zum Ausprobieren!)
Bokehhttps://www.shadertoy.com/view/MdfBRXDROP_DEBUG: Zeile 38
Schärfentiefehttps://www.shadertoy.com/view/MsG3DzRAY_STEPS_SECOND
Bewegungsunschärfehttps://www.shadertoy.com/view/MdlGW7Buffer A: Zeile 330
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 hinein ohne dass dieser angezeigt wird. Dieser FBO kann nun in einem zweiten Post-Processing Pass als Lookup-Textur verwendet werden, um die dargestellte Szene zu verfremden.

Dieser zweite Pass fehlt in der Code-Vorlage noch: Zeichnen Sie ein Viereck (LGL_QUADS), welches das ganze Fenster überdeckt (entsprechend den Koordinaten −1 bis 1 bei einer orthographischen Projektion), so dass jeder Pixel des Fensters noch genau einmal rasterisiert wird.

Verwenden Sie im zweiten Pass einen GLSL Postprocessing Shader, der für jeden Pixel die Farbe in der FBO-Textur nachschlägt. Als Texturkoordinate $\vec{t}$ für den Textur-Lookup verwenden wir die Vertexposition. Die Vertexposition muß dafür noch auf den Bereich [0–1] abgebildet werden.

Für die nachfolgenden Aufgaben ist jeweils nur dieser zweite GLSL-Shader anzupassen.

Materialien:

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. Verwenden Sie ein beliebiges $\gamma$, z.B. $\gamma = 2.2$.

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 = |\vec{t}-\vec{t_c}|$ zum Bildzentrum mit der Texturkoordinate $\vec{t_c} = (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 wird die Texturkoordinate $\vec{t}$ für den Textur-Lookup verändert (sog. Lookup-Offset).

Tipp: Die Verzerrung hängt nicht-linear vom Abstand $r$ zum Bildzentrum ab → $\vec{t}’ = (\vec{t}-\vec{t_c})\tan(2r)+\vec{t_c}$


Aufgabe 11.5: Time-Based Image FX

Verändern Sie den 2ten Pass so, dass die Farbänderung und/oder Verzerrung zusätzlich von der Zeit abhängt, d.h. experimentieren Sie im GLSL Shader mit der uniformen Variablen time. Zum Beispiel ergibt sich durch einen zeitabhängigen Sinus ein Welleneffekt.

Tipp: sin(0.01*gl_FragCoord.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):

Aufgabe 11.6: Kantenverstärkung


Kantendetektion

Verwendet den Mittelwert der Farbdifferenzen zu den vier Nachbarpixeln als Farbverstärkung.

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 zum Bildzentrum, aber mit jeweils 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 Zentrum des nächstliegenden Punktes 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 zusätzlichen Normalen-Textur abhängig ist.

Tipp: Die Normalen (Wertebereich −1..1) sind in der Textur als Farbe (Wertebereich 0..1) codiert. D.h. die Normalen müssen zuerst wieder decodiert werden. 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 Tiefentextur 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 eine einfache Form 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 kleinem zeitlichen Versatz, und diese anschließend überlagert. Achtung: Performance!


LensFlare
  • Lens Flares: Kameraobjektive erzeugen Störungen (Flares), wenn sie direkt in die Sonne gehalten werden, da das Licht teilweise innerhalb des Objektivs 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 mit Hilfe von sich überlagernden einzelnen Flare-Texturen 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
Selfie Girl (SDF)https://www.shadertoy.com/view/WsSBzh
Perlin Noise Perlin Noise: Marble
Marble Teapot Post-Processing: Rainy Day


Hausaufgaben bis zum zwölften Praktikum


Protokoll: Bitte schließen Sie mit dem heutigen Praktikum Ihr Protokoll ab.


Blender-Projekt:


Schließen Sie bitte nun Ihr Blender-Projekt ab, indem Sie für die Präsentation einen entsprechenenden Kurzfilm rendern oder einen Screen-Cast Ihrer Projekt-Demo erstellen. Planen Sie genügend Zeit ein, um auf unerwartete Herausforderungen reagieren zu können.

Bitte schicken Sie Ihr Projekt bzw. Video per FAUBox-Link o.ä. per E-Mail an einen der Praktikumsbetreuer ein. Beachten Sie hierzu bitte die Deadline, die Ihnen bereits durch die Abgabe Ihrer Protokolle bekannt ist.

Options: