CGExercises

CG 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 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).


Texture Lookup

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, v), mit v = $(r_d, 0.5)^T$. 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


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:

p = mod(8*texcoord.st, 1) - vec2(0.5)
p.x*p.y > 0 → weiss, sonst schwarz

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 (dieser wurde aus Blender inklusive seiner UV-Koordinaten exportiert) 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 bzw. Zähne des Hais sollten nun gefährlich blitzen.


Hausaufgaben bis zum nächsten Praktikum


Musterlösung: Bitte stellen Sie Ihre Lösung aus dem Praktikum kurz vor.


Mandelbrot Menge

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)
{
   int count = 0;
   vec2 z = vec2(0,0);
   while (norm(z) < 4)
   {
      z = add(mul(z, z), c);
      if (++count >= max_count) return(0);
   }
   return(float(count) / max_count);
}

In die obige Funktion soll die Weltkoordinate (nur x und y) der Vertices als Argumentwert für den Parameter $c$ eingehen und z.B. 20 für max_count. 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$.


Konturierter Teapot (leicht psychedelisch)

2. Procedural Textures Continued:

Verwenden Sie als weiteres Beispiel für prozedurale Texturen z.B. den Abstand zur Mitte des Teapots (d.h. die Länge des Objektkoordinatenvektors) als Basis für weitere prozedurale Texturierungen. Damit können wir z.B. eine Sägezahn-Kontur erzeugen, indem der Nachkommaanteil des [skalierten] Abstands verwendet wird. Für ein Streifenmuster können wir auch eine Step-Funktion verwenden oder auch ganz andere prozedurale Erzeugungsmuster wie z.B. Perlin-Noise verwenden. Bitte lassen Sie Ihrer künstlerischen Ader freien Lauf!

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)?

Hinweis zum Protokoll:

Laden Sie Ihr Protokoll bitte bis zur üblichen Deadline hoch. Bitte beachten Sie, dass zur Deadline der nächsten Übungsaufgabe das Protokoll komplett abzugeben ist!

Options: