CGExercises

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

Wir werden im Folgenden die Beleuchtung 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 Fragment-Shader folgende Variablen zur Verfügung stehen:

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

Aufgabe 9.2: Blinn-Phong


Ambiente Beleuchtung

Diffuse Beleuchtung

Spekulare 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:

  • h = normalize(l + normalize(v))
  • $I_s = (\vec{n} \cdot \vec{h})^e$

Spekulares Glanzlicht

Blinn-Phong Beleuchtung

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 multiplizieren, bevor Sie ihn für die Beleuchtungsberechnung verwenden können. Achtung: Dies führen wir nicht im GLSL Shader durch, sondern im Hauptprogramm und setzen dort den transformierten Lichtrichtungsvektor $\vec{l}$ per lglUniformfv(vec3f(l)), so dass er im Fragment-Shader als uniform vec3 l zur Verfügung steht!

Aufgabe 9.4: Beleuchtung mit Positionaler Lichtquelle


Positionale Lichtquelle

Wir verwenden nun anstelle eines direktionalen Lichts eine positionale Lichtquelle. Diese positionale Lichtquelle soll außerdem einen Abfall der Helligkeit in Bezug auf den Abstand zur Lichtquelle aufweisen.

Definieren Sie zuerst eine beliebige Position der Lichtquelle in Weltkoordinaten bevor irgendeine Geometrie gezeichnet wird und stellen Sie diese testweise mit einem Koordinatenkreuz dar. Dann transformieren Sie diese Position in Augenkoordinaten und setzen diese per lglUniformfv, bevor Sie sie schließlich im Fragment-Shader zur Berechnung des positionalen Lichtvektors $\vec{l}$ verwenden können:

  • positionaler Lichtvektor $\vec{l}$ mit
    • l = licht_position - vertex_position (in Weltkoordinaten)
    • bzw. l = V * licht_position - MV * vertex_position (in Kamerakoordinaten)

Der normalisierte Lichtvektor wird nun wie üblich für die Blinn-Phong Beleuchtungsberechnung verwendet. Zusätzlich kommt ein Abschwächungsfaktor hinzu, der invers proportional zu $|\vec{l}|$ ist (siehe Hausaufgabe).

Aufgabe 9.5: Roboterhand mit Positionaler Lichtquelle (Optional, Bonuspunkte ++)


Positionale 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 Matrizen vor dem ersten Aufruf von lglRender berechnet worden sein. Ansonsten verwenden wir denselben Ansatz wie in der vorhergehenden Aufgabe.

Aufgabe 9.6: Lichtkegel (Optional, Bonuspunkte ++)


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 zehnten Praktikum


1. 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?

2. Alpha-Blending:

  1. Es sein ein Alpha-Wert von 25% für den Over-Operator gegeben. Mischen Sie damit die folgende Farbe: Cyan over Magenta.
  2. Was ergibt sich für einen Alpha-Wert von 75%?
  3. Ist der Over-Operator kommutativ? Was ergibt sich also für einen Alpha-Wert von 25% für Magenta over Cyan?

3. Bilineare Interpolation:
Es sei eine 2×2 Textur mit folgenden Farbwerten von links oben nach rechts unten gegeben: Rot, Magenta, Cyan, Weiss.

  1. Welche vier Texturkoordinaten entsprechen den vier Texeln mit diesen Farbwerten?
  2. Bestimmen Sie die Farbe an der Texturkoordinate (0.5, 0.625) für die folgenden Texture-Lookup-Modi:
  • NEAREST
  • LINEAR

4. Texturen:

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

Options: