CGExercises

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 Blinn-Phong Beleuchtungsberechnung die Intensität $I_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.

Aufgabe 10.2: GLSL Textur-Koordinaten

Reichen Sie die Texturkoordinaten 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.

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.

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, 1) - vec3(0.5)
p.x*p.y > 0 → weiss, sonst schwarz

Modulieren Sie das Schachbrettmuster mit der bereits vorhandenen 2D Textur (Multi-Texturing).

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 $I_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:

int 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(count);
}

Welche gl-Befehle würden Sie benötigen, um mit OpenGL den obigen Shader zu übersetzen, zu linken und zu aktivieren (nur Reihenfolge)?

Options: