Beleuchtung

Aus DGL Wiki
(Weitergeleitet von Lichtberechnung)
Wechseln zu: Navigation, Suche

Wie dem ein oder anderen bereits bekannt sein dürfte unterstützt OpenGL ja Lichtquellen. Ohne Beleuchtung wirkt alles platt und öde. Kugeln sehen aus wie Kreise und irgendwie kommt keine 3D Stimmung auf. Erst durch Licht wird aus dem "Na ja..." ein "Ahhh!". Dieser Artikel soll dem ein oder anderen nocheinmal nahebringen, wie die Lichteffekte (räumlicher Eindruck, Glanzpunkte) auf Oberflächen durch OpenGL berechnet werden.

Vorwissen

Wie jeder wissen sollte, haben alle Objekte in OpenGL eine Farbe. Die Lichtberechnung fügt kein Licht im eigentlichen Sinne hinzu (wie auch? Sollte OpenGL Photonenteilchen implementieren? Einen "Lichtkegel" oder "Lichtstrahl" als solchen gibt es also nicht.), sondern ändert die Farbwerte entsprechend bestimmten Bedingungen (die Formeln die später noch folgen werden) ab.

OpenGL benutzt für die Lichtberechnung das sogenannte Phong-Modell. Dieses kennt 3 verschiedene Lichtkomponenten:

  • ambientes Licht: Ein gleichmäßiges Licht, welches alle Punkte der Welt gleichmäßig ausleuchtet.
  • diffuses Licht: Ein Omnidirektionales Licht welches Punkte abhängig von ihrer Position ausleuchtet.
  • spekulares Licht: Der Lichtanteil der Glanzpunkte auf glatten Oberflächen erzeugt.

Beim letzten Punkt sieht man bereits, dass es mit dem Licht allein nicht getan ist. Auch die Eigenschaften von Oberflächen, also das Material aus dem diese bestehen wirkt sich auf die Lichtberechnung aus. OpenGL bietet in Sachen Materialen folgende Eigenschaften.

Materialien

Warnung.png Die Auswahl ist nicht komplett. Sie beschränkt sich auf die wichtigsten Parameter. Genauere Hinweise findet ihr unter glMaterial.

GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR

mit diesem Materialparametern könnt ihr einstellen, wie das Material die einzelnen Lichtkomponenten reflektieren soll. Die übergeben Werte an diese Parameter gleichen Farbwerten und entsprechen der Farbe der reflektierten Lichtkomponente.

GL_EMISSION

Material kann auch selbstleuchtend sein. Mit diesem Parameter könnt ihr einstellen, wie stark und in welcher Farbe das Material leuchten soll.

GL_SHININESS

mit diesem Parameter könnt ihr den Glanzlichtexponenten einstellen. Was das ist seht ihr in der Berechnungsformel für das Glanzlicht.


Info DGL.png Das DGL-Wiki verfügt über eine umfangreiche Materialsammlung aus der man passende Parameterwerte entnehmen kann.

Licht

Die Eigenschaften des Lichts sind ebenfalls recht vielfältig. Neben den verschiedenen Lichtanteilen kann auch die Lichtrichtung, die Position der Lichtquelle und noch einiges mehr eingestellt werden. Welche Parameter es gibt könnt ihr im Artikel glLight nachlesen.

Für die nachfolgenden Berechnung sind hauptsächlich nur die Eigenschaften

GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR

mit diesem Materialparametern könnt ihr einstellen, wie stark und in welcher Farbe die einzelnen Lichtkomponenten leuchten sollen.

und

GL_POSITION

diese Eigenschaft bestimmt wo die Lichtquelle (in Raumkkordinaten) plaziert ist.

Weiterhin kann über GL_SPOT_CUTOFF die Streuung der Lichtquelle eingestellt werden. Die nachfolgenden Formeln gehen davon aus, dass ein Punkt tatsächlich beleuchtet wird (quasi wird eine gleichmäßige Abstrahlung in alle Richtungen angenommen).

Berechnung

ambientes Licht

Ambientes Licht sorgt für eine Art Grundbeleuchtung. Das ambiente Licht wirkt sich gleichmäßig auf alle Farbwerte eines jeden Vertexes aus. Bei der „Standardbeleuchtung“ von OpenGL (wenn Licht noch ausgeschaltet ist) wirken zum Beispiel Kugeln eher wie Kreise. Ambientes Licht ändert daran nichts. Denn alle Vertexe der Kugel werden gleich beleuchtet. Ambientes Licht dient nur dazu eine bestimmte Grundhelligkeit zu erzeugen. Vergleichbar mit dem Licht im Morgengrauen.

Die Formel für ambientes Licht lautet:

Bel Amb Formel.png
Der Materialkoeffizient ist die "Farbe", die man in den Materialeigenschaften für das ambiente Licht eingestellt hat.

diffuses Licht

Auch diffuses Licht wird auf alle Vertexe angewandt. Der Unterschied zu ambienten licht ist aber, dass bei der Berechnung nun auch die Position des zu beleuchtenden Punktes eine Rolle spielt. Dadurch entsteht dann auch der räumliche Eindruck (Plastizität).Cos alpha kann über das Skalarprodukt aus Normalenvektor und Lichtquellenvektor bestimmt werden.

Die Formel für diffuses Licht ist dafür etwas komplizierter:

Bel Diff Formel.png

Als Verständinshilfe hier eine kleine Skizze:

Bel Diff Skizze.png

spekulares Licht (Glanzlicht)

Als krönender Abschluss noch die Glanzlichtberechnung. Jeder kennt die Glanzpunkte auf glatten Oberflächen (z.B. Billiardkugel). Die Formel ähnelt der für diffuses Licht. Allerdings streuen glatte Oberflächen weniger das Licht als stumpfe. Dadurch entsteht der bekannte Glanzpunkt.Cos beta kann über das Skalarprodukt zwischen Reflexionsvektor und Beobachtervektor bestimmt werden oder über das Skalarprodukt zwischen der Winkelhalbierenden H(zwischen Lichtquellenvektor und Beobachtervektor) und dem Normalenvektor.

Warnung.png In diesem Artikel wird das Phong-Modell beschrieben. OpenGL verwendet jedoch das leicht veränderte und schnellere Blinn-Phong-Modell. Weitere Details finden sich auf der Diskussionsseite.

Die "Formal für spekulares Licht":

Bel Spec Formel.png

Hier ist besonders der Exponent über dem Kosinus zu erwähnen. Dieser kann über die eingangs erwähnte Lichteigenschaft GL_SHININESS expliziet eingestellt werden. Die Wirkung des Exponenten wird an der nachfolgenden Skizze erklärt.

Bel Spec Skizze.png Beta ist also der Winkel zwischen dem direkten reflektierten Strahl und der Blickrichtung.

Je größer m wird desto kleiner und deutlicher wird der Glanzpunkt und desto glatter wirkt die Oberfläche. Die geometrische Wirkung von m kann man sich ungefähr so vorstellen:

Je größer m wird desto mehr Licht aus dem Bereich Beta wird direkt zum Auge gespiegelt und nicht gestreut.

gesamtes Licht für einen Vertex

Da alle Lichtkomponenten auf einen Vertex einwirken, ergibt sich die entgültige Färbung eines Vertex durch:

Bel Ges Formel.png

Hier tauchen dann auch die selbstleuchtenden Materialien wieder auf.

OpenGL Befehle

Folgende Befehle werden im Zusammenhang mit Licht benutzt:

glLight
glEnable mit GL_LIGHTi und GL_LIGHTING
glMaterial

Siehe Auch

Normalen