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.
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.
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.
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 = 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.
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) |
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 = EmissiveMtl► Aktuelle Version Online