Licht soll mehr als nur Dekoration und Atmosphäre sein in Buddler Joe.
Je tiefer Joe buddelt, desto dunkler wird es. Nach einer Weile schaltet er seine Stirnlampe ein um mehr zu sehen. Noch weiter unten muss er Gebrauch von Fackeln machen um weiter entfernte Blöcke zu sehen.
Falls zwei Bildschirme weiter ein Dynamit explodiert, ist der Lichtblitz bis hier sichtbar.
Auf Deutsch "Dämpfung", ist eine Funktion welche beschreibt, wie die Helligkeit eines Lichtes mit der Distanz abnimmt. In unserem Modell wird eine Dämpfung des Lichtes mit der Distanz im Quadrat und der Distanz im Kubik berechnet. So können wir verschiedene Licht Typen erzeugen, wie etwa eine "Sonne" welche keine Lichtintensität verliert mit der Distanz oder eine Fackel, welche nur mit der Distanz im Kubik abnimmt.
Einen weiteren Effekt, welchen wir für unser Spiel benötigten, war der "Spotlight" Effekt. Ein Licht, das nur in einem definierten Kegel leuchtet, wie etwa eine Taschenlampe. Ein solches Licht ist definiert durch einen Richtungsvektor und durch einen Winkel. Damit der Rand des Spotlights nicht allzu scharf ist, verwenden wir einen zweiten, etwas grösseren Winkel und skalieren die Intensität des Lichtes fliessend zwischen diesen beiden Winkeln.
Die Umsetzung erfolgt fast gänzlich im Terrain und Entity Fragment Shader. Dort werden mit Hilfe der Normalvektoren der Vertices und dem Kameravektor die Intensität der Beleuchtung für jedes Pixel berechnet.
Ein Nachteil unserer Methode ist, dass die Shader nur eine bestimmte Anzahl von Lichtquellen auf einmal Berücksichtigen können. Je höher diese Anzahl, desto mehr Performance wird von der Grafikkarte gebraucht.
Zur Zeit werden bis zu 8 Lichtquellen gerendert. Sortiert nach Priorität (Ambient und Explosionen werden zum Beispiel immer vor Fackeln gerendert) und nach Distanz zur Kamera. Die nahen Lichter werden bevorzugt. Für den nächsten Milestone planen wir die Anzahl langsam auf 16 Lichtquellen zu erhöhen und dabei die Performance im Auge zu behalten.
Jeder Spieler erhält seine eigene Farbe für das Licht in seiner Helm Lampe, wobei der aktive Spieler sein eigenes Licht aus fairness Gründen immer weiss sieht.
Mit diesem Effekt lässt sich anhand der Lichteinfälle von den Seiten des Bildschirms sehr intuitiv erkennen, wo sich die anderen Spieler befinden, ohne dass wir das HUD mit Markierungen überladen müssen.