shadow_stencil
Legt den Typus des von Modellen geworfenen dynamischen Schattens fest.
Wertebereich:
-1 - Keine dynamischen Schatten
0 - Decal-Schatten (default)
1 - A7 Z-pass Stencil-Schatten. A8 Beschleunigte Z-pass-Stencil-Schatten.
2 - A7 Z-fail Stencil-Schatten. A8 Beschleunigte Z-fail Stencil-Schatten.
8 - Skript-generierte Schatten (z.B. PSSM Schatten).
Typ:
var
Bemerkungen:
Decal-Schatten sind keine ´realen´ Schatten sondern lediglich eine diffuse Dunkelheit auf der Oberfläche unterhalb des Schatten werfenden Objektes, wobei irgendwelche Lichtquellen keinerlei Bedeutung haben. Stencil-Schatten sind reale Schatten, die von der Sonne oder der nächstliegenden Lichtquelle abhängen. sie sehen aufgrund der scharfen Schattenkanten, insbesondere bei Eigenschatten, am besten in Leveln mit starken Lichtkontrasten aus. Mit einem Postprocessing-Shader lassen sie sich verwischen. Beide Schattentypen folgen der Bodenbeschaffenheit und können sich um Ecken biegen.
|
|
|
Allgemeiner Decal-Schatten |
Individueller Decal-Schatten |
Stencil-Schatten |
|
|
|
Stencil-Schatten ohne Eigenschatten |
Softer Stencil-Schatten |
PSSM-Schatten |
Einige Bemerkungen zu Decal-Schatten:
- Decal-Schatten benötigen ein im Mesh-Modus kompiliertes Level. Alte A5/A6-Level müssen neu kompiliert werden.
- Individuelle Decal-Schatten können per shadow-Parameter gesetzt werden, auch dann, wenn Stencil-Schatten aktiviert sind. Dies ermöglicht es, manchen Modellen Decal-Schatten zu geben und anderen Modellen Stencil-Schatten.
- Die Transparenz von Decal-Schatten läßt sich über mtl_shadow.alpha (default = 50) setzen.
- Mit Ausnahme von parzelliertem Terrain beeinflussen Decal-Schatten nur ein einziges Mesh auf dem Boden. Aus diesem Grund sollten Sie Bodenteile, Treppen etc. als Group zusammenfassen und die Option Single Mesh setzen. Tun Sie das nicht, werden Decal-Schatten an Blockgrenzen abgeschnitten oder sie gehen entlang der Boden-Mesh durch Wände weiter.
- Die Position von Decal-Schatten wird das Lot vom Scheitelpunkt der Entity bis hinab zum Boden bestimmt. Ist ein anderes Modell im Weg - etwa ein angebrachtes Surfbrett, eine niedrig gehaltene Waffe, ein internes Kollisionsmodell oder was auch immer - wird der Decal-Schatten nicht auf dem Boden erscheinen. Dem läßt vorbeugen, indem man shadow_mode |= IGNORE_MODELS setzt.
- Decal-Schatten ersetzen die die mit A5 eingeführten Z-Buffer-Schatten. Z-Buffer-Schatten werden nicht mehr unterstützt.
Einige Bemerkungen zu Stencil-Schatten :
- Stencil-Schatten sind normalerweise langsamer als Decal-Schatten und laufen
nur auf 3D-Hardware, die 8-Bit Stencil-Buffer unterstützt. Alle Videokarten, die nach 2000 hergestellt wurden erfüllen diese Voraussetzung. Auf älteren Videokarten, schaltet die Engine automatisch zurück zu Decal-Schatten.
- P Beschleunigte Stencil-Schatten rendern bis zu 10x schneller als normale Stencil-Schatten. Sie setzen Video-Hardware mit grundsätzlicher Vertex-Shaderunterstüzung voraus (Vertex Shader Model 1.0 oder höher). Alle Videokarten, die nach 2003 hergestellt wurden erfüllen diese Voraussetzung. Auf älteren Videokarten schaltet die Engine automatisch zurück zu nicht beschleunigten Stencil-Schatten. A7 unterstützte beschleunigte Schatten nur in der Pro Edition;
mit A8 sind Stencil-Schatten immer beschleunigt.
- P Das Rendern von Stencil-Schatten kann läßt sich durch Verwenden internal LOD steps des Modells noch weiter beschleunigen. Durch die Variable shadow_lod kann dies verändert werden. Verwendet man beide Techniken - beschleunigte Schatten und interne LOD-Schritte - rendern selbst Stencil-Schatten komplexer Modelle fast so schnell wie Decal-Schatten.
-
Um Eigenschatten einer Entity zu verhindern, setzen Sie ihren CAST-Flag zusammen mit dem SHADOW-Flag.
- Stencil-Schatten werden nur von nicht-transparenten, nicht-sichtbaren Modell-Entities geworfen. Ist die Entity-Textur transparent, d. h. sie ist 32 Bit mit Alpha-Kanal, kann die Entity keinen Stencil-Schatten werfen, es sei denn, es wird nicht-transparentes Rendering erzwungen indem ihr Material-Flag PASS_SOLID gesetzt wird.
- C Stencil-Schatten lassen sich 'verschmieren', damit man weiche Schatten bekommt. Dazu könnten Sie eine wie unter render_target gezeigte Postprocessing-Stufe benutzen. Am einfachsten weisen Sie dazu mtl_shadow.effect den Blur-Effekt zu. Letzteres hat ausserdem noch den Vorteil, Nicht-Eigenschatten zu ermöglichen, was in einer Postprocessing-Stufe nicht möglich wäre. Das Aufrufen von stencil_blur(1) aktiviert den vordefinierten Poisson-Blur-Shader (s. auch render_stencil).
- Individuelle Stencil-Schatten lassen sich durch den shadow-Pointer setzen.
-
Die Transparenz von Stencil-Schatten läßt sich über mtl_shadow.alpha (default = 50) setzen. Ihre Farbe kann über mtl_shadow.diffuse_blue, mtl_shadow.diffuse_green, und mtl_shadow.diffuse_red (default = 0,0,0 = schwarz) gesetzt werden.
- Stencil-Schatten verlangen Modelle, die aus geschlossenen Meshes bestehen. Die Meshes dürfen keine Löcher haben und es dürfen sich keine Polygone überschneiden oder mit ihrer flachen Seite berühren. Ist dies nicht gegeben, können Renderfehler (dunkle Linien, die sich vom Modell zum Schatten hiziehen) sichtbar werden. In einem geschlossenen Mesh wird jede Kante von genau zwei Dreiecken geteilt. Ist die Mesh des Modells nicht geschlossen, erstellen Sie ein geschlossenes Mesh-LOD-Modell oder ein shadow-Modell zum Schattenwerfen. Zum Bestimmen ob eine Mesh geschlossen ist oder nicht, kann der der MED mesh tester benutzt werden.
- Stencil-Schatten können durch Sonnen- oder dynamisches Licht geworfen werden. In letzterem Fall muß die Licht ausendende Entity das CAST-Flag gesetzt haben. Ein Stencil-Schatten wird vom stärksten dynamischen Licht, das den Ursprung der Entity erreicht ausgelöst. Liegt der Ursprung der Entity nicht innerhalb der Reichweite irgendeines Lichts, wird der Schattenwurf von der Sonne aus berechnet. Schatten werfende Lichter dürfen sich nicht innerhalb eines Schatten werfenden Objektes befinden.
- Stencil-Schatten werden von Wänden nicht weggeklappt. Ein Schatten
kann gleichzeitig an einer Wand, an der Rückseite der Wand und auf dem
Boden hinter der Wand zu sehen sein. Sorgen Sie dafür, dass Modelle
an unbeleuchteten Stellen dunkel sind oder verwenden Sie das Flag CAST,
um ungewollte Schatten zu verdecken oder zu unterdrücken.
- Stencil-Schatten sind auch auf Modell-Polygonen, die von der Lichtquelle
wegzeigen sichtbar, was zu unerwünschten, Schattenpolygonen führen
kann. Um dies zu vermeiden, benutzen Sie ein Material mit niedrigem Ambient
und einem hohen diffuse-Anteil.
- Auf Oberflächen mit einer exakten Senkrechten zur Lichtquelle können z-beating-Effekte
zwischen Schatten und Oberfläche vorkommen. Die Engine verwendet einen Tiefen-bias-Wert,
um z-beating zu verhindern, allerdings wird Tiefen-bias von einigen alten
3D-Karten nicht unterstützt.
- Z-pass-Stencil-Schatten sind schneller als z-fail-Schatten,
erlauben aber kein Bewegen der Kamera in einen Schattenbereich. Für
höherliegende 3rd-Person-Kameras wie in einem isometrischen Spiel
sind sie die beste Methode. Im First-Person-Modus
wird der Schatten des Players automatisch abgeschaltet, sobald
z-pass-Stencil-Schatten aktiviert werden.
- Z-fail-Stencil-Schatten sind langsamer als z-pass-Schatten
aber robuster. Sie sind von der Kameraposition unabhängig und erlauben,
daß LOD-Modelle erheblich anders sind als das Originalmodell, was
beim z-pass-Algorithmus wiederum fehlerhafte Schatten verursachen
würde.Z-fail-Schattenbereiche sind eher Säulen denn Kegel, der Unterschied
ist allerdings nur bei dicht dran liegenden Lichtern sichtbar. Zum
Verfolgen eines Strahls von einer Lichtquelle zur Kamera kann ein
Skript verwendet werden und automatisch auf z-fail-Schatten umschalten,
sobald der Strahl auf ein Hindernis trifft.
Beispiel:
#include <mtlView.c> // contains the stencil_blur() function
...
function main()
{
...
shadow_stencil = 4; // activate z-fail accelerated stencil shadows
shadow_lod = 2; // use the second LOD stage for stencil shadows
stencil_blur(1); // activate blurred shadows
...
Siehe auch:
SHADOW, CAST, shadow_lod, shadow_range, shadow_threshold, render_stencil, shadow
► Aktuelle Version Online