Aufgabe 3: Light it up!

(Neue) Techniken:

Deferred Rendering, Multi-Render Targets, G-Buffer, Framebuffer, Post Processing, Blooming

Beschreibung:

In dieser Aufgabe soll Deferred Shading implementiert werden. Ebenfalls behandelt die Aufgabe verschiedene, in der Vorlesung vorgestellte Post-Processing Effekte. Im Gegensatz zu dem bisher verwendeten Forward-Rendering werden in einem ersten Renderdurchlauf Geometrie-Daten je nach Tiefe & Clipping mittels Multi Render Target Technik in den G-Buffer gerendert. Im 2. Schritt können wir mittels Lightvolumen mit einer größeren Anzahl an Lichtquellen unsere Szene beleuchten, auf Grundlage der bereits vorgerenderten Geometrie-Daten. Ebenfalls nutzen wir HDR, um ein besser ausbalanciertes Bild zu bekommen und mittels Tone Mapping wird dies am Ende in einen entsprechenden Farbbereich gebracht.

Es soll die in Aufgabe 1 & 2 angefertigte Lösung weiterverwendet werden.

Für die Bearbeitung dieser AufgDue Date: 16.12.abe sollte OpenGL 4.0 und GLSL 4.0 (oder höher) verwendet werden.

Due Date: 16.12.

Finales Rendering

Kernanforderungen

  • Mindestens ein Framebuffer Object wird erstellt und die Attachments mit Texturen versehen.
  • Mehrere G-Buffer Layer/Textur-Attachments (Position, Normale...) werden unter Verwendung eines Framebuffer Objects auf unterschiedliche Texturen geschrieben.
  • Die G-Buffer-(Geometrie-)Layer/Textur-Attachments werden zu einem Bild kombiniert.

Weitere Funktionalitätsanforderungen

  • Es soll (min.) die Texturattachments: Position, Normal, AlbedoSpec, Emission & Final geben.
    Der Tiefenbuffer soll in dieser Aufgabe explizit ein Render-Buffer-Objekt sein, da dies in dieser Aufgabe nicht gesampelt werden muss.
  • Die im Geometry-Render-Pass in den G-Buffer gerenderten "deferred Textures" (Albedo, Normal, Position) können auf dem Screen (nebeneinander/untereinander) angezeigt werden. Der 4. verbleibende Platz kann schwarz bleiben, kann die gefiltere Emission Textur s.u. oder kann den spekularen Anteil anzeigen (letzteres wird etwas schwerer, wenn der spekulare Anteil in dem Alpha-Channel der Albedo-Spec Textur gespeichert ist).
  • Die in A1 und A2 geforderten Shading Stages sind nicht mehr gefordert, anstelle dessen soll zwischen dem finalen Ausgabebild und der oben beschriebenen Kachelansicht umgeschaltet werden.
  • Es gibt ein Directional Light (Grundlicht), hierbei wird die Szene auf ein Quad gerendert mit der Beleuchtungsberechnung abhängig von dem Directional Light. (Ein Directional Light besitzt keine "Bounding" Körper, da es infinitiv ist). Diese ist per Tastendruck an-/ausschaltbar.
  • Für die Lichtberechnung werden Light-Volumes verwendet, um den nicht sichtbaren Overhead möglichst gering zu halten. Für die Punktlichtquellen wird die Szene jeweils eine Sphere (der Radius ist abhängig von den Lichteigenschaften) mit Licht Berechnung dieser Lichtquelle gerendert. Hierbei ist darauf zu achten, dass der Depth- & Stencil-Test (Stencil Pre-Rendering!) korrekt ist. Die Ergebnisbilder der einzelnen Renderdurchläufe werden mittels Blending übereinandergelegt. Die Lichtquellen müssen nicht mehr visualisiert werden, da die Visualisierung aus dem Emissionbuffer resultiert.
  • Die Punktlichtquellen-Attribute sollen aus der bereitgestellten JSON Datei eingelesen werden, diese enthält die Positionen passend zu den Geometrien in der Szene.
  • Es wird eine korrekte Blinn-Phong Beleuchtung für die Punktlichtquelle sowie für die Directionale Lichtquelle implementiert (aus Effizenzgründen jeweils in einem eigenen Shader).
  • Die Szene wird in (fast) allen Rendervorgängen als HDR Framebuffer(n) [16 Bit & Gleitkommaformat] gerendert, erst im letzten Schritt vor der Ausgabe auf den Bildschirm, wird es mittels Tone Mapping (Exposure Tone Mapping) in den Low Dynamic Range-Farbraum transformiert, hierbei soll der Exposure-Wert per Tastatur steuerbar sein. (Achtung: Texturen müssen beim Laden in den linear Space transformiert werden!)
  • Es findet eine Gamma-Korrektur statt, der Gamma-Wert liegt per Default bei 2.2, kann aber verändert werden.
  • Mittels Bloom sollen die Lichtquellen (EmissionBuffer) zum "Leuchten"/"Glühen" gebracht werden. Hierbei wird der Blur-Shader-mehrfach (PingPong-Buffer) gefiltert um später mit dem Gerenderten Bild zusammengefügt zu werden. Das Anzeigen der Lichtquellen incl. Blooming soll per Tastatur umschaltbar sein. Es soll explizit ein two-pass Gaussian Blur verwendet werden.
  • Die Framebuffer und Texture-Attachments sollen auch bei veränderter Fenstergröße funktionieren.

Weiter Beispiel Renderer

debugMode
Ansicht Zentral
Ansicht Hinten
Ansicht Grid (+ [optional] Random PtLights) LOW EXPOSURE
Alternative Ansicht 1
Alternative Ansicht 2
TASTEFUNKTIONBeschreibung
ESCBeenden des Programms-
F1Toggle Fullscreen-
F2Tangent Space anzeigen an/aus [Optional]Der Geometry Shader wird genutzt, um die Basisvektoren der Tangent Spaces anzuzeigen.
F3Toggle Wireframe [Optional]Rendern der Szene im Wireframe Modus
F10Reload ShaderNeuladen der Shader (Bei Fehlern soll das Programm nicht abstürzen)
1Toggle NormalmappingUmschalten der Nutzung des Normalmapping, ansonsten wird die interpolierte Geometrie-Normale verwendet
2Toggle ParallaxmappingUmschalten Parallaxmapping, anonsten wird die Texturkoordinate verwendet
3Toggle TessellationUmschalten Tessellation incl. Displacement, wenn eine Heightmap vorhanden ist
H/hToggle HilfeAnzeige der Hilfe auf dem Bildschirm
F/fToggle FPSAnzeige der Framerate auf dem Bildschirm
G/gToggle Grid/SceneUmschalten zwischen Szene und Grid
D/dToggle Directional LightUmschaltend der Beleuchtung mit einer Richtungslichtquelle
L/lToggle Licht VisualisierungUmschalten der Visualsierung der Lichtquelle
N/nGrid Auflösung erhöhenErhöhen der Auflösung des Grids in der Hostanwendung (VBO)
M/mGrid Auflösung verringernVerringern der Auflösung des Grids in der Hostanwendung (VBO)
Q/q

Gamma-Wert erhöhen

 
Wert für die Gamma-Korrektur erhöhen.
W/wGamma-Wert verrringernWert für die Gamma-Korrektur verringern.
E/eExposure erhöhenWert für das Exposure Tone Mapping erhöhen.
R/rExposure verringernWert für das Exposure Tone Mapping verringern.
U/uDisplacement erhöhenDer Versatz der Vertices entlang der Normale wird erhöht
I/iDisplacement verringernDer Versatz der Vertices entlang der Normale wird verringert.
P/pPausierenZeitabhängige Animation pausieren
S/sShading UmschaltenShading Umschalten
STRG+LMBKamera Rotation(Absicherung für Gimbal Lock)
STRG+MMBKamera Pan
STRG+RMB (ggf. Mouse Wheel)Zoom Kamera (ggf. Versetzung entlang Orientierung)

Shader

Shader Komponenten Beschreibung
GBufferShader Vertex & TessellationControl & TessellationEvaluate & Fragment Rendert das Modell bzw. das Grid (die Geometrie & Material Informationen) in den G-Buffer (MRT). Ggf. mit Tessellation & Displacement. *
DirLightShader Vertex & Fragment Directional Light-Beleuchtung
PointLightShader Vertex & Fragment Point Light-Beleuchtung
NullShader Vertex & Fragment Für den Stencil Test
SkyShader (Aufg 1) Vertex % Fragment Zeichnet die Skymap im Hintergrund
BlurShader Vertex & Fragment Shader, für den Blureffekt (mit advanced 2-Pass Filter; es reicht ein Shader mit einer entsprechenden Abzweigung)
PostProcessShader Vertex & Fragment Shader, dient zum Zusammenführen der Ausgabe-Textur mit der Textur der Punktlichtquellen, die mittels Blur (mehrfach) gefiltert wurde sowie der Gamma-Korrektur und dem Tone-Mapping
TangentShader (Aufg 2) [Optional] Vertex; Geometrie ; Fragment Zeichnet die 3 Achsen des Tangent Spaces, es ist darauf zu beachten, dieselbe Berechnung wie beim ModelShader zu nutzen.
TextShader (Aufg 1) Vertex; Fragment Kann Text auf dem Display ausgeben
LightVisShader [optional] Vertex & Fragment Zeichnet die Punkt-Lichtquelle als Primitive Geometrie (Cube oder Sphere)


* Hier findet das Normalmapping und Parallaxmapping statt. 

Tipps

  • Zum einlesen von JSON Dateien, kann der in dem Material bereitgestellte JSON Parser verwendet werden. Es können aber bei Bedarf auch andere 3rd Party APIs oder eigene genutzt werden.
  • Die Funktion texelFetch arbeitet nicht mit Texturkoordinaten im Interval [0,1] auf beiden Achsen, sondern mit Texelkoordinaten in den Intervallen [0, Texturbreite] und [0, Texturhöhe]. Die Variable gl_FragCoord enthält die Position des Fragments im Screen Space. Diese kann direkt für den Zugriff verwendet werden.
  • glBlitFramebuffer(...) kopiert Pixel von einem (Read) Framebuffer in einen anderen (Draw) Framebuffer. Es können die Source- und Destination Rectangles mit den Parametern angegeben werden, eine Filtermethode sowie ein Filter was passieren soll, sollten die Framebuffer nicht dieselbe Größe besitzt. Ebenfalls muss mit der Maske angegeben werden, was wir eigentlich kopieren wollen. (Hat ein FB mehr Targets (Color-Attachments), muss hier auch der Richtige aktiviert sein!). Es können mit dieser Operation auch Depth- oder Stencil-Buffer kopiert werden.
  • Wenn mittels glBlitFramebuffer Teile eines Buffers in einen anderen kopiert werden sollen, muss neben dem Binden des FBO das Attachment als Buffer gewählt werden (glReadBuffer(GL_COLOR_ATTACHMENTX)). Wenn das Attachment eine Textur ist, kann diese als mittels der ID (generiert bei glGenTexture(1, &id)) als Textur gesetzt werden. (glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, id);)
  • Die Unit light.h enthält bereits Structs für verschiedene Lichtquellen, um den Code gut modularisiert & kompakt zu halten, können hier Methoden wie das setzen von Uniformvariablen etc. ergänzt werden. Dieser befindet sich ebenfalls im Abschnitt Material. In diesem befinden sich auch die in der Musterlösung verwendeten Attentuation Werte.
  • Die weiteren Parameter aus der Unit material.h wie shininess oder der Diffus/Albedo vec3 sowie die Shininess müssen nicht verwendet werden und dürfen in der Beleuchtungsberechnung im entsprechenden Shader Konstant gesetzt werden.
  • Die Unit gBuffer.h enthält ein Aufzählungstyp für die G-Buffer Texturen, sowie ein Struct für den G-Buffer und Methoden Deklarationen sowie Beschreibungen zu diesen. Um die Aufgabe incl. aller weiteren Anforderungen umzusetzen, muss ggf. das Strukt angepasst werden und oder die Methoden verändert/ergänzt werden. Die Methoden und Beschreibungen dienen zu Hife um die Kernanforderungen hinzubekommen. (Etwas Denkarbeit ist gerade beim Bloom-Effekt gefordert)
  • Tessellation muss für die Szene aufgrund der fehlenden Heightmap und aus Effizienzgründen nicht durchgeführt werden. Für das Quad jedoch weiterhin.
  • Zur Einfachheit muss der Wireframe-Modus nicht umgesetzt werden. (Kann jedoch als Herausforderung gerne umgesetzt werden)! Ebenfalls muss der mit dem Geometrieshader visualisierte Tangentspace nicht mehr angezeigt werden.
  • Die Textur Transformation in den linear Space kann beim einlesen der Textur als sRGB durchgeführt werden oder im GBuffer Shader manuell.

 

 

Ideen

Für diejenigen, die mit der Aufgabe schnell fertig und noch nicht genug ausgelastet mit CG2 und anderen Übungen sind, gibt es folgende Ideen, die zum Teil das Wissen vertiefen oder einen Vorausblick auf die kommenden Aufgaben geben können.

  • Es können weitere Post-Processing Effekte (z.B. Kernelfilter-Effekt/Negativ) auf die finale Ausgabe im Fenster angewendet werden. Hierbei kann mittels Filterung das Bild manipuliert werden (Blur) oder Farbkorrekturen (Schwarz-Weiß, Farbbereich Anpassung/LUT) durchgeführt werden (Welche Effekte Ihr implementiert, ist euch überlassen. Es sollte jedoch die Theorie dazu verstanden sein, sowie die Sinnhaftigkeit in Spielen/Simulationen erklärt werden können). Diese sollen jeweils per Tastendruck umschaltbar sein.
  • Es kann per Tastendruck ein Look-Up Table als Post Processing Effekt verwendet werden.
  • Erstellen einer/mehrerer Spotlichtquelle(n) mit entsprechenden Bounding-Volumen. (Cylinder [oder Hemisphere mit Orientierung])
  • Wireframe, hier muss überlegt werden, welche Teile als Wireframe gerendert werden sollen und welche nicht (da man bei kompletter Aktivierung ggf. nur ein Wireframe-Rechteck am Ende erhält).
  • Der Szene kann etwas mehr "Leben" eingehaucht werden, indem pro Frame die Positionen der Punktlichtquellen um einen zufälligen normierten Offset-Vektor versetzt werden.
  • Es können weitere Modelle in die Szene geladen werden.
  • Es können per Tastendruck zufällige in der Szene verteilte Lichtquellen erzeugt werden. Die Anzahl ist per Tastendruck variabel.
  • ....

Abnahme

UhrzeitJonasDennisEduard
8:00
8:306513
9:007112
9:30
10:00324
10:30