Die Licht-Engine

Für ihre Lichteffekte benutzt die Engine statische und dynamische Lichtquellen. Statische Lichtquellen erstellen Schattenmaps auf Leveloberflächen und werden in vorberechnete Strahlungsvolumina (precomputed radiance volumes - PRV) kompiliert, die die Umgebungsbeleuchtung (ambient) von Entities beeinflussen. Dynamische Lichtquellen dagegen beeinflussen Streulicht, Lichtreflexe und von Entities ausgehendes Licht. Sie generieren Enbtity-Schatten. Statische Lichter werden per WED im Level platziert. Dynamisches Licht kann zur Laufzeit von Entities ausgestrahlt werden oder (mit Version A7) auch durch Setzen des Dynamic-Flags von statischen Lichtquellen.

Statische Schattenmaps (shadow maps)

Wie der Name sagt betreffen statische Shadow Maps statische Teile des Levels: Level-Geometrie und - ab Version A7.77 - Terrain. Auch Entities werden von Shadow Maps beeinflußt, allerdings nur indirekt durch die vorberechneten Strahlungsvolumina. Die PRV leuchtet die gesamte Entity-Mesh gleichmäßig und in Abhängigkeit der statischen Shadow Map entlang der Bodenebene aus. Dynamsiches Licht beeinflußt nur die Teile der Entity, die sich in seiner Reichweite befinden, völlig unabhängig von Schatten und Bodenebenen. Statisches Licht hat keinen Einfluß auf die Renderzeit während viele dynamisch Lichter die Framerate reduzieren können. Wenn Sie wollen, dass eine Entity nur von dynamischen Lichtquellen beeinflußt wird, setzen Sie ihr Flag UNLIT, weisen Sie aber nicht das Material mat_unlit zu. Wollen Sie, dass eine Entity nur vom statischen PRV beeinflußt wird, weisen Sie das Material mat_unlit zu, setzen Sie aber nicht das Flag UNLIT.

Um die Gesamtbeleuchtung in einem Level zu beinflussen, verwenden Sie die Sun- und Ambienteinstellungen unter Map Properties in WED oder die Vektoren sun_color und ambient_color im Skript.

Dynamische Lichter

Normalerweise unterstützen Engines lediglich 8 dynamische Lichtquellen, denn das ist das Limit moderner 3D-Hardware. Ab A7 enthält die Engine allerdings einen Lichtmanager, der theoretisch eine unbegrenzte Anzahl an dynamischen Lichtquellen gleichzeitig rendern kann. Vor dem Rendern einer bestimmten Mesh oder eines speziellen Objekts werden deren bzw. dessen 8 am nächsten liegenden Lichtquellen automatisch aktiviert und alle anderen Lichtquellen abgeschaltet. Derart wird das Limit der 3D-Hardware immer noch eingehalten obwohl Hunderte von Lichtquellen zu selben Zeit sichtbar sein können. Die maximale Anzahl von Lichtern läßt sich über max_lights setzen.

Das Sortieren des Lichts ist, auch wenn es sehr schnell geschieht, ein zusätzlicher Renderprozess, der, je nach Anzahl und Reichweite aktiver Lichter, die Framerate beeinträchtigen kann. Level und Map-Entities müssen im Mesh-Modus (mit aktiviertem (Create Mesh) kompiliert werden. Terrain sollte parzelliert sein: je kleiner die Parzellen, je weniger sichtbar sind die Effekte beim Austauschen wenn sich mehr als 8 Lichter in oder aus dem Bereich einer Parzelle bewegen.

 !!  Ist ein Objekt im Bereich von mehr als 8 dynamischen Lichtern, wird die Lichtsortierung die Lichter, die am weitesten vom Zentrum des Objektes weg sind, entfernen. Dies kann, bensonders unter Verwendung von Shadern zu Artifakten führen. Lichter, die sich im Bereich eines bestimten Vertex´ der Objekt-Mesh befinden, werden von Lichtern, die näher am Objektzentrum, aber außerhalb des Bereiches des Vertex´ liegen ´entfernt´. Das ergibt den Effekt scharfer Helligkeitsunterschiede entlang der Meshkanten. Aus diesem Grund verwenden Sie zum Abstimmen dynamischer Lichter den Shader light count shader und sorgen Sie dafür, dass sich keine Mesh im Bereich von mehr als 8 dynamischen Lichtern befindet. Wenn Shader benutzt werden kann die unterstützte Anzahl von Lichtern sogar niedriger sein.

Die Licht-Formel

Statische und dynamische Lichter bieten genug Spielraum zum Abdecken eines weiten Bereichs an Beleuchtungssituationen, selbst ohne die Verwendung von Shadern. Mithilfe von Shadern läßt sich eine iindividuell angepasste Beleuchtungsengine programmieren; ansonsten wird die Gesamtmenge des Lichts eines jeden Vertex´ durch folgende Gleichung berechnet:

Gesamtlicht = Ambient-Licht + Streulicht + Glanzlicht + ausgestrahltes Licht

Ambient-Licht

Ambient-Licht versieht eine Szenerie mit einer konstanten Beleuchtung. Es beleuchtet alle Objektvertices gleichermassen und ist von anderen Beleuchtungsfaktoren, wie Vertex-Normale, Lichtrichtung oder Kameraposition unabhängig. Die Ambientbeleuchtung einer Szenerie wird durch folgende Gleichung beschrieben:

Ambient-Licht = AmbientMtl * ( PRV + EntRGB )

Wobei:

Parameter
Beschreibung
AmbientMtl Material-Ambientfarbe
EntRGB Rot-, Grün-, Blau-Farbwerte der Entity, wenn ihr Lichtflag (light) gesetzt ist.
PRV Vorberechntete Ausstrahlungsfarbe (Positionsabhängig, s. u.)

Strahlungsvolumina (PRV) beinhalten die vorberechneten Lichtwerte für ein Gitter aus Positionen im Level. Sie werden vom Map-Compiler aus statischen Lichtquellen und der Levelgeometrie berechnet. Die Lichtwerte werden in Strahlungsebenen entlang der Level-Flächen gespeichert. Alle Entities erhalten ihre Strahlungsfarbwerte von der unter ihrem jeweiligen Nullpunkt am nächsten gelegenen Strahlungsebene. Auf diese Weise werden Entities in hellen Regionen automatisch erleuchtet und im Schatten abgedunkelt. Beachten Sie, dass Sie falsches PRV-Licht bekommen, wenn sich der Nullpunkt der Entity unterhalb des Bodens oder innerhalb eines soliden Blocks befindet. Zu Testzwecken werden die PRV-Werte der watched Entity am Bildschirm angezeigt.

Streulicht

Streulicht hängt sowohl von der Lichtrichtung als auch von der Oberflächennormalen des Objekts ab. Aufgrund wechselnder Lichtrichtung und der Veränderung des Vektors der Oberflächennormalen variiert es quer über die Oberfläche eines Objekts hinweg. Mithilfe eines Gouraud-Shading-Algorithmus schattiert es Objekte und gibt ihnen dreidimensionale (3-D) Tiefe.

Nach Einstellen der Lichtintensität berechnet die Beleuchtungs-Engine für eventuelle Dimmungseffekte aus dem Winkel der Vertex-Normalen und der Richtung des einfallenden Lichts wie viel des Restlichts von einem Vertex reflektiert wird. Im Falle von Sonnenlicht wird dieser Schritt übergangen, denn dieses dämpft nicht über Entfernungen hinweg. Das System berücksichtigt zwei Reflexionstypen, Streuung und Spiegelung und verwendet eine unterschiedliche Formel zum Bestimmen wieviel Licht für das Jeweilige reflektiert wird. Nach Berechnung der reflektierten Lichtmenge wendet die Engine diese neuen Werte auf die streuenden und spiegelnden Reflexionseigenschaften des Materials an. Die sich ergebenden Farbwerte sind die Streu- und Spiegelkomponenten die der Rasterer zum Erstellen von Gouraud-Shading und Spiegelreflexen verwendet.

Das Sonnenlicht wird mit dem PRV-Helligkeitswert multipliziert. Auf diese Weise ist reflektiertes Sonnenlicht innerhalb von Räumen oder innerhalb statischer Schatten gedimmt und draussen hell.

Streulicht wird durch folgende Gleichung beschrieben:

Streulicht = DiffuseMtl * (SunRGB * (N . SunDir) * (PRV + AlbedoMtl) + Sum( Light[n] * (N . Ldir[n]) * Atten[n] * Spot[n] ))

Parameter
Beschreibung
DiffuseMtl Streuende Materialfarbe
PRV Vorberechnetes Ausstrahlungsvolumen
SunRGB Farbe des Sonnenlichts
SunDir Richtungsvektor vom Objektvertex zur Sonne
AlbedoMtl Albedowert des Materials
Sum Summe aller dynamischen Lichter (bis zu 7)
Light[n] Farbe des n-ten Lichts
N Vektor der Vertex-Normalen
Ldir[n] Richtungsvektor vom Objektvertex zum n-ten Licht
Atten[n] Lichtdämpfung des n-ten Lichts (entfernungsabhängig)
Spot[n] Spotlichtfaktor des n-ten Lichts (entfernungs- und winkelabhängig)

Glanzlicht

Glanzlicht bezeichnet die hellen glänzenden Lichtreflexe, die entstehen, wenn Licht auf die Oberfläche eines Objekts trifft und zur Kamera zurückreflektiert wird. Es ist intensiver als Streulicht und streicht schneller über die Oberfläche eines Objekts hinweg. Das Berechnen von Glanzlichtern dauert länger, als das von Streulicht, der Vorteil einer Verwendung liegt allerdings darin, dass es eine Oberfläche merklich detaillierter erscheinen lässt.

Voraussetzung zum Gestalten von Glanzreflexen ist es, dass das System nicht nur weiss in welche Richtung das Licht strahlt, sondern auch die Richtung der Kamera kennt. Das System verwendet eine vereinfachte Version des Phong-Glanzreflexmodells, welches einen halben Vektor zur Näherung von Glanzreflexion benutzt.

Glanzlicht wird durch folgende Gleichung beschrieben:

Glanzlicht = SpecularMtl * (SunRGB * (N . H)^p * (PRV + AlbedoMtl) + Sum( Light[n] * (N . H)^p * Atten[n] * Spot[n] )

Parameter
Beschreibung
SpecularMtl Spiegelnde Materialfarbe.
PRV Vorberechnetes Ausstrahlungsvolumen.
SunRGB Farbe des Sonnenlichts.
AlbedoMtl Albedowert des Materials.
Sum Summe aller dynamischen Lichter (bis zu 7).
N Vektor der Vertex-Normalen
H halber Vektor.
p Stärke des Glanzreflexes Wertebereich ist 0 bis +unendlich.
Light[n] Farbe des n-ten Lichts.
Atten[n] Lichtdämpfung des n-ten Lichts (entfernungsabhängig).
Spot[n] Spotlichtfaktor des n-ten Lichts (entfernungs- und winkelabhängig).

Ausgestrahltes Licht

Ausgestrahltes Licht sieht aus, als werde es von der Entity ausgesandt; z.B. ein Glühen (allerdings beeinflusst es keine nahegelegenen Oberflächen im Gegensatz zu dynamischem Licht, das tatsächlich ausgestrahlt wird!), es wird lediglich von der betreffenden Materialfarbe gesetzt.

Ausgestrahltes Licht = EmissiveMtl► Aktuelle Version Online