CG Exercise #07
Computergraphik Übungsblatt #07
OpenGL Tutorial: Texturen
Aufgabe 7.1: Textur laden

OpenGL Vertex-Attribute
Starten Sie mit Ihrem Code aus der vorhergehenden Übung #06.
Suchen Sie sich eine beliebige Textur (d.h. ein Bild im jpg oder png Format) aus.
Laden Sie das Bild mit dem Framework mittels lglLoadQtTexture(“image.png”) (siehe Cheat Sheet → Texturing). Sie erhalten die Id eines sog. Textur-Objektes. Wenn die Textur ordnungsgemäß geladen werden konnte, ist die Id ungleich 0. Überprüfen Sie dies.
Binden bzw. aktivieren Sie das Textur-Objekt nun via lglTexture2D(tex_id). Die Id 0 ist gleichbedeutend mit der Deaktivierung der Texturierung.
Materialien:
Aufgabe 7.2: Textur-Koordinaten

Textur-Atlas
für einen Würfel
Erstellen Sie von Hand einen VBO mit dem Framework, der die 6 Seitenquader eines Würfels enthält (LGL_QUADS). Den Würfel platzieren Sie z.B. auf der Bodenplatte des Roboters.
Definieren Sie für jeden der 6 Quader entsprechende Texturkoordinaten, so dass Sie den rechts abgebildeten Texturatlas verwenden können. Der Textur-Atlas hat eine 4×4 Kachelung.
Zum besseren Verständnis skizzieren sie zuerst einmal den Würfel von Hand (oder mit Blender) und nummerieren die Vertices in der Skizze durch. Dann vollziehen Sie anhand der Zeichnung die Vertices nach, die zum Zeichnen des jeweiligen Quads benötigt werden. Dasselbe gilt für die Texturkoordinaten, d.h. fertigen Sie eine Skizze des Texturatlas an, die Sie mit den korresspondierenden Nummern der Vertices beschriften. Die jeweilige Texturkoordinate eines bestimmten Vertex ergibt sich dann anhand seiner Nummer.
Achtung: Die linke obere Ecke des Bildes entspricht der linken unteren Ecke des Texturraums, d.h die beiden Räume sind entlang der Y-Achse gespiegelt! Der Ursprung der Texturkoordinaten ist im Bild also links oben und nicht links unten!
Aufgabe 7.3: Tri-Stripping
Verwenden Sie nun Tri-Stripping (d.h. LGL_TRIANGLE_STRIP anstelle von LGL_QUADS), um denselben texturierten Würfel mit drei Strips zu definieren (Deckel, Seiten und Boden).
Zum besseren Verständnis skizzieren sie zuerst einmal den Würfel von Hand und nummerieren die Vertices durch. Dann vollziehen Sie anhand der Zeichnung die Vertices nach, die für den jeweiligen Triangle Strip benötigt werden.
Aufgabe 7.4: Backface-Culling (Optional, Bonuspunkte ++)
Verwenden Sie nun Backface-Culling → lglBackFaceCulling
.
Die Darstellung ist nun evtl. fehlerhaft. Korrigieren Sie dies, indem Sie die Reihenfolge der Vertices ändern.
Aufgabe 7.5: Code verstehen: MipMapping
In dieser Aufgabe führen wir eine Code-Recherche zum Thema MipMapping durch. D.h. wir analysieren die Funktion lglCreate2DMipMap() des Frameworks, welche eine MipMap-Hierarchie der Texturdaten erzeugt.
Vollziehen Sie die einzelnen dazu notwendigen Schritte im Quelltext des Frameworks mit Hilfe des Debuggers von QtCreator nach (RTFC)! Starten Sie als Ausgangspunkt für die Recherche mit der Funktion lglLoadQtTexture, welche nach einigen internen Schritten schließlich die Funktion lglCreate2DMipMap aufruft.
Als Ergebnis der Recherche notieren Sie bitte die Reihenfolge der OpenGL-Befehle, welche das Framework für die Erzeugung einer MipMap aufruft?
Tipps:
- Stepping mit dem Debugger → Breakpoint in lglLoadQtTexture setzen
- Taste F2 in QtCreator → Springt zur Definition der aktuellen Funktion unter dem Cursor (bzw. Right-Click auf die Funktion)
Angenommen, Sie würden das selber nachimplementieren wollen, wieviel Stunden reine Programmierarbeit würden Sie dafür ansetzen?
Optional: Implementieren Sie eine rudimentäre Version des MipMapping selber. Vergleichen Sie Ihren tatsächlichen Aufwand mit Ihrer Schätzung.
Aufgabe 7.6: UV-Koordinaten (Optional, Bonuspunkte ++)
Exportieren Sie Ihr Blender-Objekt als OBJ mit UV-Koordinaten. Stellen Sie das Objekt mit der entsprechenden Textur neben dem Roboter und dem Würfel dar. Alternativ können Sie diese OBJ und PNG Dateien verwenden, welche zusammen einen texturierten Hai darstellen.
Hinweis: Der Bildraum in Blender und der Bildraum in OpenGL unterscheiden sich (Spiegelung entlang der Y-Achse). Sollte die Textur also falsch auf dem Haifisch dargestellt werden, dann ist es notwendig die Textur vertikal zu spiegeln.
Hausaufgaben bis zum achten Praktikum
1. OpenGL / Tri-Stripping:
- Was denken Sie: Wieviele Vertices können wir im Falle eines Würfels einsparen?
- Optional: Kennen Sie eine Methode, um einen Würfel mit einem einzigen Strip darzustellen?
- Optional: Kennen Sie eine Methode, um beliebige Geometrie mit einem einzigen Strip darzustellen? Nennen Sie hier das passende Stichwort!
- Welche gl-Befehle benötigen Sie, um mit OpenGL für den Würfel ein entsprechendes Vertex-Buffer Objekt zu erzeugen und zu aktivieren (nur Reihenfolge)?
2. OpenGL / GLSL:
- Skalieren Sie die Vertex-Position (das Attribut vertex_position) im Vertex-Shader auf ein Viertel seiner ursprünglichen Größe. Wie sieht die entsprechende Zuweisung zu gl_Position aus? Achtung: homogene Koordinaten!
- Mischen Sie zwei Farben, d.h. interpolieren Sie zwischen zwei Farbwerten im Fragment-Shader. Verwenden Sie eine lineare Interpolation mit einem normalisierten Interpolationsfaktor $w\in[0,1]$. Wie sieht die allgemeine Formel der lineraren Interpolation aus? Im Ergebnis soll die interpolierte Farbe zu $w=34.5$% Weiss und der restliche Farbanteil soll Rot sein. Wie sieht die entsprechende Zuweisung zu gl_FragColor aus?
- Optional: Mischen Sie im Fragment-Shader mehrere Farbwerte: Im Ergebnis soll die Mischfarbe 25% Weiss, 55% Rot und 20% Gelb enthalten (Tipp: Linearkombination). Wie sieht die entsprechende Zuweisung zu gl_FragColor aus?
- Optional: Angenommen, die Tiefe $z$ stehe im Fragment-Shader zur Verfügung und sei auf den Bereich [0,1] normiert. Wie erzeugen Sie durch eine entsprechende lineare Farbinterpolation einen Nebeleffekt? D.h. mit welchen zwei Farben interpolieren Sie (Formel)?
- Welches Attribut enthält die per-vertex spezifizierten Normalen?
- Mit welcher speziellen Matrix werden diese Normalen transformiert?
3. GLSL / Parameter:
Für welche der folgenden Werte macht es Sinn, ein Attribut, einen uniformen Parameter oder einen varying Parameter zu verwenden?
- Normale
- Konstanter Skalierungsfaktor
- Eine Konstante für ein Beleuchtungsmodell
- Vertexfarbe
- interpolierte Vertexposition
4. Optional: GLSL / Funktionen:
Wie würden Sie die folgende GLSL-Funktion in C++ schreiben?
void swap(inout float a, inout float b) { float t; t = a; a = b; b = t; }
5. GLSL / Konstruktoren & Swizzling:
Beschreiben die folgenden Konvertierungen mit einem einzigen Swizzling; dabei sei v4 ein 4er-Vektor, v2 ein 2er-Vektor, f ein float. Benutzen Sie ausschließlich die Swizzling-Komponenten x, y, z und w! Die erste Zeile dient als Beispiel.
float a = float(v4); --> float a = v4.x; vec3 b = vec3(v4); vec3 c = vec3(v4.b, v4.g, v4.r); vec4 d = vec4(f, f, f, f); vec4 e = vec4(v2, v2);