From CoGr@Ohm
Lokale Beleuchtung
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 Fragment-Shader folgende Variablen zur Verfügung stehen:
v = camera_position - vertex_position
(in Weltkoordinaten)
v = vec4(0) - MV * vertex_position
(in Kamerakoordinaten)
Material und Links:
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))
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!
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:
l = licht_position - vertex_position
(in Weltkoordinaten)
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).
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.
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.
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:
3. Bilineare Interpolation:
Es sei eine 2×2 Textur mit folgenden Farbwerten von links oben nach rechts unten gegeben: Rot, Magenta, Cyan, Weiss.
4. Texturen:
Retrieved from http://schorsch.efi.fh-nuernberg.de/cogr/index.php/CGExercises/Exercise09
Page last modified on December 22, 2020, at 02:40 PM