Beleuchtung: Unterschied zwischen den Versionen
Flo (Diskussion | Beiträge) K (→Materialien: Nutzung des Hinweis Templates) |
K (→ambientes Licht: rs) |
||
(9 dazwischenliegende Versionen von 7 Benutzern werden nicht angezeigt) | |||
Zeile 3: | Zeile 3: | ||
==Vorwissen== | ==Vorwissen== | ||
− | Wie jeder | + | 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: | OpenGL benutzt für die Lichtberechnung das sogenannte Phong-Modell. Dieses kennt 3 verschiedene Lichtkomponenten: | ||
Zeile 10: | Zeile 10: | ||
* spekulares Licht: Der Lichtanteil der Glanzpunkte auf glatten Oberflächen erzeugt. | * 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 | + | 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=== | ===Materialien=== | ||
− | {{ | + | {{Warnung|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''' | '''GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR''' | ||
Zeile 23: | Zeile 23: | ||
'''GL_SHININESS''' | '''GL_SHININESS''' | ||
: mit diesem Parameter könnt ihr den Glanzlichtexponenten einstellen. Was das ist seht ihr in der Berechnungsformel für das Glanzlicht. | : mit diesem Parameter könnt ihr den Glanzlichtexponenten einstellen. Was das ist seht ihr in der Berechnungsformel für das Glanzlicht. | ||
+ | |||
+ | |||
+ | {{Hinweis|Das DGL-Wiki verfügt über eine umfangreiche '''[[Materialsammlung]]''' aus der man passende Parameterwerte entnehmen kann.}} | ||
===Licht=== | ===Licht=== | ||
Zeile 41: | Zeile 44: | ||
==Berechnung== | ==Berechnung== | ||
===ambientes Licht=== | ===ambientes Licht=== | ||
− | Ambientes | + | 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: | Die '''Formel für ambientes Licht''' lautet: | ||
Zeile 49: | Zeile 52: | ||
===diffuses Licht=== | ===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). | + | 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: | Die '''Formel für diffuses Licht''' ist dafür etwas komplizierter: | ||
Zeile 60: | Zeile 63: | ||
===spekulares Licht (Glanzlicht)=== | ===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. | + | 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|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 [[Diskussion:Beleuchtung|Diskussionsseite]].}} | ||
Die "Formal für spekulares Licht": | Die "Formal für spekulares Licht": | ||
Zeile 71: | Zeile 76: | ||
Beta ist also der Winkel zwischen dem direkten reflektierten Strahl und der Blickrichtung. | 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: | 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. | : Je größer '''m''' wird desto mehr Licht aus dem Bereich ''Beta'' wird direkt zum Auge gespiegelt und nicht gestreut. | ||
Zeile 86: | Zeile 91: | ||
[[glLight]]<br> | [[glLight]]<br> | ||
− | [[glEnable]] mit ''' | + | [[glEnable]] mit '''GL_LIGHT'''i und '''GL_LIGHTING'''<br> |
[[glMaterial]] | [[glMaterial]] | ||
==Siehe Auch== | ==Siehe Auch== | ||
[[Normalen]] | [[Normalen]] |
Aktuelle Version vom 22. Januar 2010, 16:40 Uhr
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.
Inhaltsverzeichnis
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
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.
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:
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:
Als Verständinshilfe hier eine kleine Skizze:
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.
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":
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.
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:
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