OpenGL stellt zwei Arten von Lichtquellen zur Verfügung: Richtungslichtquellen (directional) und Positionslichtquellen (positional). Bei einer gerichteten (directional) Lichtquelle geht man davon aus, daß ein unendlicher Abstand zu den Objekten der Szene besteht. So betrachtet, sind die Strahlen des Lichts parallel, wenn sie die Objekte erreichen. Ein Positionslicht ist nahe, oder innerhalb der Szene und die Richtung seiner Strahlen werden bei Beleuchtungberechnungen berücksichtigt. Wegen dieser zusätzlichen Berechnungen erfordern Positionslichtquellen eine grössere Rechenleistung als Richtungslichtquellen.
Der Befehl glLightfv() wird immer verwendet, um die Position eine Lichtquelle zu spezifizieren, sowohl bei Richtungs- als auch bei Posititionslichtquellen. Er wird auch verwendet, um die Werte der Farbbestandteile der Lichtquelle wie umgebende Farbe, verbreitete Farbe, spiegelnde Farbe, ausstrahlende Farbe und Glanz zu spezifizieren.
Sobald Lichtquellen definiert werden, müssen auch normale Vektoren und die Materialeigenschaften der Objekte innerhalb der Szene definiert werden. Die normalen Vektoren eines Objekts definieren seine Lage in Bezug zu den Lichtquellen. Normale Vektoren können für jeden Scheitelpunkt spezifiziert werden und/oder von Scheitelpunkten gemeinsam verwendet werden. Der Befehl glNormal() wird verwendet, um diese Anweisung auszuführen.
Die Farbkomponenten die für die Lichter spezifiziert werden, haben eine andere Bedeutung als die für Materialien spezifizierten. Für Lichter entsprechen die Zahlen dem Prozentsatz der vollen Intensität jeder Farbe. Folglich hat das hellste mögliche weiße Licht RGB-Werte von (1.0, 1.0, 1.0). Für Materialien entsprechen die Zahlen den reflektierten Anteilen jener Farben. Der Befehl glMaterialfv()wird verwendet um Materialeigenschaften zu definieren, indem man die Werte der Farbkomponenten der Materialien spezifiziert.
Der Befehl glColorMaterial() wird verwendet, um die benötigte Rechenleistung herabzusetzen, die mit dem Ändern der Materialeigenschaften verbunden ist. Dieser Befehl sollte immer dann verwendet werden, wenn eine einzelne Materialeigenschaft, z.B. verbreitete Farbe, für die meisten Scheitelpunkte in der Szene geändert werden muß. Jede mögliche Änderung der aktuellen Farbe, die durch einen Aufruf von glColor()erreicht wird, erneuert die Materialeigenschaften, die durchglColorMaterial() spezifiziert sind. Die Zustandsvariable GL_COLOR_MATERIAL muß durch den Aufruf glEnable(GL_COLOR_MATERIAL)aktiviert werden.
Zuletzt muß das Beleuchten durch einen Aufruf von glEnable(GL_LIGHTING) aktiviert werden und jedes Licht in der Szene muß durch Aufrufe von glEnable(GL_LIGHT i) aktiviert werden, wobei GL_LIGHT i der symbolische Name der Lichtquelle ist.
Dieses Beispiel ist eine Änderung von Polygons_List.c, das Beleuchtung verwendet. Die dreiseitige Pyramide wurde zu einer Pyramide mit vier Seiten geändert, um die Berechnung der normalen Vektoren zu vereinfachen.
Im Quellcode ist die Reihenfolge, in der die Normalen für GL_QUAD_STRIP definiert werden wichtig. Im GL_QUAD_STRIP-Kapitel trifft Normale A auf die Scheitelpunkte 1, 2, 3 und 4 zu; Normale B trifft auf die Scheitelpunkte 3, 4, 5 und 6 zu; Normale C trifft auf die Scheitelpunkte 5, 6, 7 und 8 zu; und Normale D trifft auf die Scheitelpunkte 7, 8, 9 und 10 zu. Wegen der Art, in der OpenGL Objekte berechnet, muß der korrekte Wert für die Normale gesetzt werden, bevor der letzte Scheitelpunkt des aktuellen Objekts spezifiziert wird, damit der korrekte Wert der Normalen diesem Objekt zugewiesen wird.