Exercise #10
Computergraphik Übungsblatt #10
OpenGL Tutorial: Erweiterte Texturierung
Aufgabe 10.1: GLSL Textur-Lookup

Farbspektrum
Starten Sie wieder mit dem Programm aus der vorhergehenden Übung #09. Um die folgenden Übungen besser nachvollziehen zu können, fügen Sie am besten noch eine große Kugel hinzu (lglSphere).
Laden Sie das rechts abgebildete Regenbogenspektrum als Textur-Objekt (lglLoadQtTexture) und binden Sie dieses an einen Textur-Sampler (lglSampler2D).

Texture Lookup
Verwenden Sie die geladene Palette als Lookup-Tabelle fürs Shading. D.h. ändern Sie Ihren Fragment-Shader so ab, dass zusätzlich zur bisherigen Beleuchtungsberechnung die Helligkeit $h_d$ als S-Koordinate und 0.5 als T-Koordinate für einen Textur-Lookup im Textur-Sampler benutzt wird (GLSL: texture2D). Modulieren Sie die erhaltene Texturfarbe mit dem Ergebnis der bisherigen Blinn-Phong Beleuchtungsberechnung.
Material und Links:
- Relevante Vorlesungsdemos: X, Y, Z
Aufgabe 10.2: GLSL Textur-Koordinaten
Reichen Sie die Texturkoordinaten (vec4 attribute vertex_texcoord
) der dargestellten Objekte mittels einer Varying-Variablen in den Fragment-Shader weiter. Verwenden Sie nun die tatsächliche S-Koordinate für den Texture-Lookup in der Palette. Achtung: der Teapot hat keine Texturkoordinaten.
Aufgabe 10.3: GLSL Texture-Mapping
Laden Sie nun eine beliebige Textur anstelle der Palette und verwenden Sie die S- und T-Koordinaten für einen 2D Textur-Lookup. Vervielfachen Sie die Textur, indem Sie die Texturkoordinaten mit einem Faktor>1 multiplizieren. Was passiert, wenn Sie etwas dazuaddieren?
Aufgabe 10.4: Prozedurale Texturen

Procedural Texturing
Verwenden Sie die S- und T-Koordinaten, um ein Schachbrettmuster zu erzeugen (Procedural Texturing). Multiplizieren Sie dazu die Texturkoordinaten mit dem Faktor 8 und verwenden Sie davon den sich wiederholenden Nachkommaanteil für die prozedurale Erzeugung des sich wiederholenden Schwarz/Weiss-Musters des Schachbretts:
Modulieren Sie das Schachbrettmuster mit der bereits vorhandenen 2D Textur (Multi-Texturing) und der Beleuchtungsberechnung.
Aufgabe 10.5: Specular Mapping (Optional, Bonuspunkte ++)
Laden Sie den Hai, den Sie mit Blender modelliert haben. Exportieren Sie entsprechende UV-Koordinaten und modifizieren Sie die dazugehörige Textur so, dass die Augen und/oder die Zähne des Hais rot sind. Dies wirkt auf den ersten Blick etwas blutrünstig, erfüllt aber den folgenden Zweck:
Verwenden Sie den Rot-Kanal der Textur, um den spekularen Anteil $k_s$ der Blinn-Phong Beleuchtungsberechnung zu definieren. Die Augen und Zähne des Hais sollten nun gefährlich blitzen.
Hausaufgaben bis zum elften Praktikum

Mandelbrot Menge
Procedural Textures:
Erzeugen Sie im GLSL Shader eine prozedurale fraktale Textur wie z.B. die Mandelbrot-Menge. Sie können auf folgende Funktionen (für das Rechnen mit imaginären Zahlen) zurückgreifen:
vec2 add(vec2 a, vec2 b) { return(vec2(a.x+b.x, a.y+b.y)); } vec2 mul(vec2 a, vec2 b) { return(vec2(a.x*b.x-a.y*b.y, a.x*b.y+a.y*b.x)); } float norm(vec2 c) { return(dot(c, c)); }
Damit schreibt sich der Mandelbrot Pseudo-Code für eine Iteration für ein bestimmtes variables $c$, welches den (vervielfachten) Texturkoordinaten entspricht, wie folgt:
float fractal(vec2 c, int max_count = 100) { int count = 0; vec2 z = vec2(0); while (norm(z) < 4) { z = add(mul(z, z), c); if (count++ > max_count) return(0); } return((float)count / maxcount); }
Welche gl-Befehle würden Sie benötigen, um mit OpenGL einen GLSL Shader (wie z.B. den obigen Fraktal-Shader) zu übersetzen, zu linken und zu aktivieren (nur Reihenfolge)?