From CoGr@Ohm
Die Macht der Mathematik lässt sich anhand von Shadertoy Beispielen gut demonstrieren:
FX | Shadertoy Beispiel | Hint |
---|---|---|
Bokeh | https://www.shadertoy.com/view/MdfBRX | DROP_DEBUG |
Schärfentiefe | https://www.shadertoy.com/view/MsG3Dz | RAY_STEPS_SECOND |
Videoartefakte | https://www.shadertoy.com/view/Md2GDw | |
Rainy Window | https://www.shadertoy.com/view/tlVGWK | USE_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.
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 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 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 Texturkoordinaten für den Textur-Lookup verwenden wir der Einfachheit halber die Vertexposition. Hinweis: Die Vertexposition muß dafür noch auf den Bereich [0–1] abgebildet werden.
Für die nachfolgenden Aufgaben ist jeweils nur dieser GLSL-Shader anzupassen.
Material und Links:
Verändern Sie nun im 2ten Pass die Fragment-Farbe, so dass deren Helligkeit $I$ mit Hilfe einer Gamma-Funktion [1] angepasst wird. Verwenden Sie ein beliebiges $\gamma$, z.B. $\gamma = 2.2$.
Tipp: $I' = I^\gamma$
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)$
Verändern Sie im 2ten Pass die Farbe so, dass die Farbe zum äußeren Bildrand verzerrt wird. Dazu wird die Textur-koordinate $t$ für den Textur-Lookup verändert → Lookup-Offset.
Tipp: Die Änderung hängt nicht-linear vom Abstand $r$ zum Bildzentrum ab → $(t-0.5)\tan(2r)+0.5$
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)
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 ++):
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.
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 umgekehrtem Vorzeichen.
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.
Verwendet einen Lookup-Offset, der von einer 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.
Es gibt noch viele weitere Einsatzmöglichkeiten für Postprocessing; manche benötigen ziemlich viel zusätzlichen Aufwand, fast alle aktuellen Spiele benutzen sie:
Zum Abschluß des Praktikums hier ein Potpourri an Shader-Effekten:
FX | Shadertoy Beispiel |
---|---|
Lens Flare | https://www.shadertoy.com/view/4sX3Rs |
Playing Marble | https://www.shadertoy.com/view/MtX3Ws |
Cloudy Terrain | https://www.shadertoy.com/view/MdlGW7 |
Blender-Movie:
Schließen Sie Ihr Blender-Projekt ab, indem Sie für die nachfolgende Präsentation einen entsprechenenden Kurzfilm rendern.
Retrieved from http://schorsch.efi.fh-nuernberg.de/cogr/index.php/CGExercises/Exercise11
Page last modified on December 22, 2020, at 02:41 PM