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

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 (siehe Hausaufgabe).

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


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, Bonuspunkte ++)


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 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.25, 0.625) f├╝r die folgenden Texture-Lookup-Modi:
  • GL_NEAREST
  • GL_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: