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, $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


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, 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


Musterlösung: Bitte stellen Sie Ihre Musterlö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 = 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$.


Konturierter Teapot (etwas psychedelisiert)

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

Options: