Beleuchtung

Die Beleuchtung ist bei einer Szene sehr entscheidend. Beachten Sie bitte, dass, wenn hier von einem Licht gesprochen wird, kein echtes Objekt gezeichnet wird, also Sie werden keine Glühbirne als Lichtquelle in Ihrer Szene ausmachen können, sondern die Lichter sind vielmehr als abstrakte Dinge zu verstehen, quasi als unsichtbare Punkte, von denen Licht ausgeht.

Theorie

Die Beleuchtung mittels OpenGL setzt sich aus verschiedenen Lichtarten zusammen. Als erstes wäre da ein ambientes Licht. Das ambiente Licht „beleuchtet“ jedes Objekt, egal, wie es im Raum liegt, gleich stark mit demselben Ton. Mithilfe des ambienten Lichtes lassen sich dreidimensionale Objekte maximal als zweidimensional erkennen. Es ist zu empfehlen, dass Sie dem ambienten Licht einen geringen Anteil zuordnen, maximal so, dass Sie gerade noch erkennen, dass es Objekte im Raum gibt, wenn alle anderen Lichttypen ausgeschaltet sind.

Des Weiteren gibt es die direktionalen Lichter. Das direktionale Licht beleuchtet ebenfalls alles, hat allerdings eine Quelle und einen Einfallswinkel. Als Beispiel einer direktionalen Lichtquelle sei die Sonne zu sehen. Die Sonne ist so weit von der Erde entfernt, dass man Annäherungsweise von parallelen Lichtstrahlen, die auf der Erde ankommen, ausgehen kann. Genauso ist auch direktionales Licht zu verstehen. Das direktionale Licht beleuchtet jedes Objekt unter demselben Winkel mit der selben Lichtintensität. Beachten Sie die Winkelabhängigkeit des resultierenden Farbtons.

Die letzten beiden Lichttypen, die OpenGL mitbringt sind das Punktlicht und das Spotlicht. Das Punktlicht hat eine Quelle und breitet sich dann wie von einer Glühbirne mit senkrecht austretenden Lichtstrahlen aus. Das Spotlicht ist dem Punktlicht sehr ähnlich. Im Prinzip ist das Spotlicht nichts anderes als ein Punktlicht, was sich nur in eine Richtung ausbreiten kann. Stellen Sie sich hier einen Scheinwerfer vor.

Hinweise: Wie wird das Licht berechnet?

Für Licht ist es wichtig, in welchem Winkel sich Betrachter, Lichtquelle und beleuchtetes Objekt befinden. Um das zu berechnen werden von allen Flächen normierte Normalen gebildet (eine Normale ist die Senkrechte auf der Fläche. Stichwort Kreuzprodukt. Eine normierte Normale ist damit die Senkrechte auf der Fläche mit der Länge 1). Deshalb sollten Sie, wenn Sie selbst mithilfe von glVertex3f() Objekte erstellen, grundsätzlich wenigstens eine Normale angeben. Möglich wäre es auch, eine Normale pro Punkt anzugeben, das hätte aber nur bei den wenigsten Sachverhalten einen Nutzen. So könnte ein Code aussehen, der ein Viereck zeichnet:

glColor3f( 1.0, 1.0, 1.0 );
glBegin( GL_QUADS );
  glVertex3f( 0.25, 0.25, 0.0 );
  glVertex3f( 0.75, 0.25, 0.0 );
  glVertex3f( 0.75, 0.75, 0.0 );
  glVertex3f( 0.25, 0.75, 0.0 );
glEnd();

Wollen wir nun die Normale berechnen brauchen wir beide Richtungsvektoren der Ebene. A = (0,5 ; 0 ; 0) und B = (0 ; 0,5 ; 0). Bildet man das Kreuzprodukt der beiden Vektoren erhält man als Ergebnis N = (0 ; 0 ; 0,25). Sie sehen, dass das Ergebnis des Kreuzproduktes nicht immer ein Vektor ist, der die Länge 1 hat. Es ist also notwendig den Vektor zu normieren. Hier im Beispiel genügt eine Multiplikation von N mit 4. Man erhält n = (0 ; 0 ; 1). (Die mathematischen Grundlagen finden Sie hier). Nun fügen wir den Normalenvektor zum Code hinzu:

glColor3f( 1.0, 1.0, 1.0 );
glNormal3f( 0, 0, 1);
glBegin( GL_QUADS );
  glVertex3f( 0.25, 0.25, 0.0 );
  glVertex3f( 0.75, 0.25, 0.0 );
  glVertex3f( 0.75, 0.75, 0.0 );
  glVertex3f( 0.25, 0.75, 0.0 );
glEnd();

Praxis

FIXME