CG Exercise #10
Computergraphik Ãœbungsblatt #10
OpenGL Tutorial: Erweiterte Texturierung
Aufgabe 10.1: GLSL Textur-Lookup
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 die entsprechende texture id an einen Textur-Sampler.
D.h. binden Sie die 2D Textur an einen 2D Sampler “sampler”, indem Sie den Namen des Samplers und die Textur-Objekt-Id der 2D Textur an lglSampler2D("sampler", texid)
übergeben (anstelle von fixed-function-style lglTexture2D).
Im Fragment-Shader können wir nun den Sampler verwenden, um auf die Textur zuzugreifen (sog. Texture-Lookup). Wir verwenden die Textur für einen speziellen Beleuchtungseffekt. D.h. wir ändern den Fragment-Shader so ab, dass die Reflektanz $r_d$ der bisherigen Beleuchtungsberechnung (siehe auch #8 und #9) als S-Koordinate und 0.5 als T-Koordinate für den Textur-Lookup benutzt wird → GLSL: texture2D(sampler, $r_d$, 0.5). Modulieren Sie die erhaltene Texturfarbe mit dem Ergebnis der bisherigen Blinn-Phong Beleuchtungsberechnung.
Materialien:
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 der gezeichneten Objekte für den Texture-Lookup in der Palette.
Aufgabe 10.3: GLSL Texture-Mapping
Laden Sie nun eine beliebige Textur anstelle der Palette und verwenden Sie die S- und T-Koordinaten der gezeichneten Objekte für den 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
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)
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 nächsten Praktikum
Musterlösung: Bitte stellen Sie Ihre Musterlösung aus dem Praktikum kurz vor.
1. 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$ 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(1); } return((float)count / maxcount); }
In die obige Funktion soll die Weltkoordinate (nur x und y) der Vertices als Argumentwert für den Parameter $c$ eingehen. Eventuell müssen die Koordinaten noch skaliert werden. Die Funktion liefert dann die Helligkeit $I_f$ des Fraktals als Ergebnis. Modulieren Sie eine der drei Beleuchtungsintensitäten $I_a$, $I_d$ oder $I_s$ des Blinn-Phong Beleuchtungsmodells mit dieser Helligkeit $I_f$.
2. Procedural Textures Continued (Optional):
Verwenden Sie den Abstand zur Mitte des Teapots (d.h. die Länge des Weltkoordinatenvektors) als Basis für weitere prozedurale Texturierungwn. Wir erzeugen Sägezahn-Konturen auf der Oberfläche mit Hilfe des Nachkommaanteils des Abstands als Substitution einer Farbkomponente. Für ein Streifenmuster verwenden wir eine Step-Funktion, die einen kleinen Bereich des [skalierten] Nachkommaanteils auf 0 und alle anderen Werte auf 1 abbildet.
3. GLSL Compiler:
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 ohne Parameter, aber mit Erklärung)?