Beleuchtung: Unterschied zwischen den Versionen
(→Licht) |
Flo (Diskussion | Beiträge) K (→Materialien: Nutzung des Hinweis Templates) |
||
Zeile 13: | Zeile 13: | ||
===Materialien=== | ===Materialien=== | ||
− | + | {{Hinweis|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''' |
Version vom 2. Dezember 2004, 14:23 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 folgene 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.
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).
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.
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.
Jeh 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_LIGHi und GL_LIGHTING
glMaterial