Diese Include-Datei enthält ein kleines lite-C-Skript zur Erzeugung von PSSM-Schatten (Parallel Split Shadow Maps) in Außenbereichen. Bei diesem Algorithmus werden mehrere Shadow-Maps zum Rendern von Schatten in unterschiedlichen Auflösungen abhängig von der Entfernung zur Kamera verwendet. Das Skript verwendet fünf View-Stages und zwei Shader aus dem code-Ordner, vp_depth.fx und vp_shadow.fx. Die Shader sind einfach genug, um sie mit einigen Shader-Vorkenntnissen, zum Beispiel durch die Shader Workshops, zu verstehen. Wenn Sie das Skript oder die Shader ändern möchten, editieren Sie bitte eine Kopie in Ihrem Work-Ordner und nicht die Original-Dateien in den include- und code-Ordnern.
Stencil Schatten | PSSM Schatten |
PSSM Schatten haben einige Vorteile und einige Nachteile im Vergleich zum stencil shadow Algorithmus:
Parameter | Default | Remarks |
pssm_fbias | 0.00050 |
Schatten-Tiefe. Zu kleine Werte führen zu "Flächen-Akne", zu große Werte bewirken einen "Peter-Pan-Effekt" (schwebende Schatten). Verwenden Sie die [Tab]-Konsole, um diese Variable auf den optimalen Wert für Ihr Level anzupassen. |
pssm_splitweight | 0.5 |
Split-Aufteilung, 0 .. 1. Ein kleinerer Wert begünstigt eine lineare Aufteilung, ein höherer Wert eine logarithmische Aufteilung. Sie finden Hinweise über Split Systeme in GPU Gems 3, Kapitel 10. Verwenden Sie die [Tab]-Konsole, um diese Variable auf den optimalen Wert für Ihr Level anzupassen. |
pssm_res | 1024 |
Shadow-Map Auflösung, 512, 1024, oder 2048. Legen Sie die Auflösung fest, bevor Sie pssm_run aufrufen. |
pssm_transparency | 0.6 |
Schattendunkelheit, 0..1. |
#include <default.c> #include <shadows.c> function main() { video_mode = 8; shadow_stencil = 8; // activate external shadows shadow_lod = 2; // works also for PSSM // set up a level level_load("level.wmb"); def_move(); // all objects get the SHADOW flag for(you = ent_next(NULL); you; you = ent_next(you)) set(you,SHADOW);
// adjust camera and bias, activate PSSM camera.clip_far = 3000; camera.clip_near = 30; pssm_fbias = 0.0005; pssm_run(3); }