CGExercises

CG Exercise #09

Computergraphik Ãœbungsblatt #09


OpenGL Tutorial: Beleuchtungsmodelle




Lokale Beleuchtung

Aufgabe 9.1: Präliminarien:

Starten Sie mit Ihrem Programm aus der vorhergehenden Übung #08. Um die folgenden Übungen besser nachvollziehen zu können, fügen Sie am besten noch eine große Kugel hinzu (lglSphere). Kontrollieren Sie auch, dass die diffuse Beleuchtung auf dieser Kugel wie in dieser Musterlösung funktioniert:

Wir werden im Folgenden die Beleuchtung nun komplettieren, so dass es laut Blinn-Phong-Beleuchtungsmodell nicht nur einen ambienten und diffusen, sondern auch einen spekularen Beleuchtungsanteil gibt.

Im Fragment-Shader werden alle Beleuchtungsberechnungen in Kamerakoordinaten durchgeführt, daher müssen alle dafür benötigten Größen bzw. Vektoren zuerst in Kamerakoordinaten vorliegen. Dafür benötigen wir die folgenden Vorbereitungen:

Ändern Sie Ihr GLSL Programm ab, so dass im GLSL Shader folgende Variablen zur Verfügung stehen:

  • normalisierter Normalenvektor $\vec{n}$ (in Kamerakoordinaten)
  • normalisierter Lichtrichtungsvektor $\vec{l}$ (in Kamerakoordinaten)
  • View-Vektor $\vec{v}$ mit
    • v = camera_position - vertex_position (in Weltkoordinaten)
  • bzw.
    • v = vec4(0) - MV * vertex_position (in Kamerakoordinaten)
  • spekularer Exponent $e = 100$

Materialien:

Aufgabe 9.2: Blinn-Phong


Spekulare Beleuchtung

Diffuse Beleuchtung

Ambiente Beleuchtung

Implementieren Sie im GLSL Shader nun zusätzlich zu einem ambienten und diffusen Anteil $I_a$ und $I_d$ ein spekulares Highlight, wie es im Blinn-Phong Modell definiert wird. D.h. berechnen Sie den spekularen Beleuchtungsanteil $I_s$ mit Hilfe des Halfway-Vektors:


Spekulares Glanzlicht

Blinn-Phong Beleuchtung
  • h = normalize(l + normalize(v))
  • $I_s = (\vec{n} \cdot \vec{h})^eI_L$

Tipp: Halfway-Vektor = varying

Aufgabe 9.3: Transformation des Lichtrichtungsvektors

Spezifizieren Sie den Lichtrichtungsvektor nun in Weltkoordinaten und nicht in Augenkoordinaten. D.h. Sie müssen den Vektor erst mit der invers-transponierten View-Matrix transformieren (bzw. multiplizieren), bevor Sie ihn für die Beleuchtungsberechnung verwenden können. Dies führen wir aus Effizienzgründen nicht im GLSL Shader durch, sondern im Hauptprogramm und setzen dort anschließend den transformierten und normalisierten Lichtrichtungsvektor $\vec{l}$ per lglUniformfv("l", vec3f(l)), so dass er im Fragment-Shader als uniform vec3 l zur Verfügung steht!

Achtung: Für die Transformation des Lichtrichtungsvektors casten wir zuerst die Matrix auf 3×3 und multiplizieren dann mit dem Lichtrichtungsvektor!

Aufgabe 9.4: Beleuchtung mit Positionaler Lichtquelle (Optional)

Wir verwenden nun anstelle eines direktionalen Lichts eine positionale Lichtquelle.

Definieren Sie zuerst eine beliebige Position der Lichtquelle in Weltkoordinaten und stellen Sie diese mit einer gelben Kugel dar. Zusätzlich übergeben Sie die Position an den Shader als Uniform mit dem Namen “light_position”, d.h. die Lichtposition setzen wir per lglUniformfv noch bevor irgendeine Geometrie gezeichnet wird.

Der Lichtvektor $\vec{l}$ berechnet sich nun in Weltkoordinaten wie folgt:

l = light_position - vertex_position

Für eine Berechnung in Kamerakoordinaten transformieren (bzw. multiplizieren) wir die Lichtposition mit der View-Matrix V (im Hauptprogramm). Schließlich können wir im GLSL Shader den Lichtvektor $\vec{l}$ in Kamerakoordinaten wie folgt berechnen:

l = light_position - MV * vertex_position

Tipp: Lichtvektor = varying

Der normalisierte Lichtvektor kann nun wie üblich für die Beleuchtungsberechnung verwendet werden.

Frage: Wie wird die Lichtquelle dargestellt und wieso?

Optional: Zusätzlich kann man einen Abschwächungsfaktor verwenden, der invers proportional zum Abstand $d = |\vec{l}|$ der Lichtquelle ist.

Aufgabe 9.5: Roboterhand mit Positionaler Lichtquelle (Optional)


Roboterhand mit pos. Lichtquelle

Die einzige Lichtquelle soll jetzt eine Lampe sein, die am Ende des Roboterarms positioniert ist.

Berechnen Sie zuerst wieder die tatsächliche Position der Lichtquelle in Weltkoordinaten. Achtung: Dazu müssen sämtliche ModelView-Matrizen bereits vor dem ersten Aufruf von lglRender berechnet worden sein! Dann verwenden wir denselben Ansatz wie in der vorhergehenden Aufgabe, d.h. wir transformieren die Position der Lichtquelle in Kamerakoordinaten usw.

Aufgabe 9.6: Lichtkegel (Optional)


Arbeitstischlampe mit Lichtkegel

Modifizieren Sie Ihren Shader so, dass nur ein kegelförmiger Lichtraum beleuchtet wird, der in Richtung des letzten Segments des Roboterams zeigt! Der Einfachheit halber soll der Lichtkegel einen Öffnungswinkel von 60 Grad besitzen → cos(60°/2)=0.5.


Hausaufgaben bis zum nächsten Praktikum


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

1. Lokale Beleuchtung:

  1. Zeichnen Sie den Lichtweg für die lokale Beleuchtung mittels Blinn-Phong. Tragen Sie alle relevanten Vektoren bzw. Größen ein und beschreiben Sie diese stichwortartig.
  2. Was ist der Unterschied zwischen Gouraud, Phong und Blinn-Phong?
  3. Beim Würfel werden die einzelnen Seiten ja flach dargestellt. Können Sie die Seiten auch einfach mit Hilfe von Flat Shading korrekt wiedergeben? Warum? Und unter welchen Bedingungen?

2. Lichtquellen:
Eine Lichtquelle wird in OpenGL per se nicht gezeichnet - dazu muss eine Proxy-Geometrie spezifiziert werden, die an der Stelle der Lichtquelle (bzw. um die Punktlichtquelle herum) gezeichnet wird. In der Regel wird man diese Geometrie der Einfachheit halber als emissiv darstellen - man könnte aber auch auf die Idee kommen, sie einfach von der Punktlichtquelle beleuchten zu lassen! Wenn man das macht, wird die Geometrie i.d.R. schwarz erscheinen. Was ist hier passiert, und wie kann man das beheben?

3. OpenGL / Baryzentrische Koordinaten:
Ein Dreieck mit den folgenden Koordinaten und dazugehörigen Farbattributen soll rasterisiert werden:

$v_1 = (0, 1)^T$, $C_1 = (1, 1, 0)$ (gelb)
$v_2 = (2, 3)^T$, $C_2 = (0, \frac12, 0)$ (dunkelgrün)
$v_3 = (4, 0)^T$, $C_3 = (0, 0, 1)$ (blau)
Bestimmen Sie die baryzentrisch interpolierte Farbe an der Position v = $(2, 1)^T$

4. Texturen:

  1. Welche drei Haupt-Anwendungsgebiete für Texturen kennen Sie schon? Wie wird im Shader dabei prinzipiell verfahren (in Prosa beschreiben, kein Code nötig)?
  2. Kennen Sie weitere spezielle Anwendungsgebiete?

Options: