20

CG (Subject) / Schatten (Lesson)

-

This lesson was created by Missunderstand.

Learn lesson

This lesson is not released for learning.

Advertisement
  • Planare Schatten Das Objekt wird erneut gerendert, wobei y auf 0 skaliert wird. Es entsteht ein “Schatten” direkt unter dem Objekt. Dieses Verfahren kann erweitert werden, indem das Objekt durch eine Projektion perspektivisch auf die Ebene gerendert wird. Matrix dazu (Schatten auf y-Ebene): 
  • Shadow Volumes Vorgehensweise Es wird ein Schattenvolumen hinter dem beleuchteten Objekt konstruiert. Objekte in diesem Volumen erhalten kein Licht.- Zeichne Seiten des Schattenvolumens-Zähle Schnittpunkte von Betrachter aus mit Schattenvolumen+1 bei Eintritt, -1 bei Austritt- Ist der Wert kleiner 0, so ist der betrachtete Punkt im Schatten 
  • Silhouettenkanten Um das Schattenvolumen zu erstellen muss die Silhouette des beleuchteten Objekts erstellt werden. Dafür müssen geschlossene Polygonmodelle verwendet werden (2-manifold). Eine Silhouettenkante entsteht dort, wo ein Polygon der Lichtquelle zugewandt und das Polygon auf der anderen Seite abgewandt ist. n ° l  >0: Zur Lichtquelle gedreht.< 0: Von der Lichtquelle abgewandt. 
  • Schritte des Shadow Volumes Geometrie zeichnen  Stencilbuffer mit 0 löschen  Colorbuffer abschalten  z-Buffer auf read-only stellen  Stencilbuffer so einstellen, dass beim Zeichnen eines Polygons die sichtbaren Bereiche um eins erhöht werden  Backface-Culling aktivieren (nur Vorderseiten “zeichnen”)  Schattenvolumen zeichnen (d.h. den Stencilbuffer an den Vorderseiten inkrementieren)  Stencilbuffer so einstellen, dass beim zeichnen die sichtbaren Bereiche um  eins erniedrigt werden  Frontface-Cullung aktivieren  Schattenvolumen zeichnen (d.h. den Stencilbuffer an den Rückseiten dekrementieren)  z-Buffer deaktivieren, Colorbuffer aktivieren  Verwende Stencilbuffer als Maske und zeichne bildschirmfüllendes (Schatten-)Rechteck 
  • Warum wird der Tiefenbuffer auf read-only gestellt? damit Kanten auf z.B. Böden entstehen, jedoch die Rückseiten der Shadow-Volumes gezeichnet (ausgewertet) werden. 
  • Helle Schatten bei Shadow Volumes Die oben beschriebene Variante des Shadow-Volume-Modells erstellt einen homogonen Schatten. Möchte man zwischen Schattenstärken differenzieren gibt es zwei Möglichkeiten: 1. Es wird ein Blending aktiviert und das Schattenrechteck bekommt einen alpha-Wert. 2. Die Szene wird zuerst nur mit ambientem Licht gezeichnet und nach Generierung der Schattenmaske wird sie erneut mit diffusem und spekularem Licht gerendert, falls der Stencilwert 0 ist. 
  • Probleme des Shadow Volumes - Scharfe Schattenkanten (kein Anti-Aliasing)- Die near-clipping-Plane kann die Vorderseite eines Schattenvolumens schneiden 
  • Wie werden SpadowMaps berechnet? Die Tiefenwerte werden aus Sicht der Lichtquelle ausgelesen. Ist der Abstand eines Punktes zur Lichtquelle größer als der Tiefenwert an dieser Stelle, so ist der Punkt im Schatten. 
  • Wie ist "aus Sicht der Lichtquelle gemeint? Nach der View- und Projectionmatrix wird hier eine Viewport-Matrix verwendet, welche die Koordinaten an den Viewport anpasst (statt 0 in der Mitte, 1 in alle Richtungen muss der Ursprung in die linke obere Ecke). Es wird eine Shadowmap erstellt, die jeden Weltpunkt (x,y,z) auf den Tiefenwert (Lichtquellensicht) abbildet. Wird nun ein Punkt ausgewertet, muss dieser nur mit ambientem Licht beleuchtet werden, wenn der Tiefenwert (also r/q) des obigen Modells größer ist als der Wert in der Shadowmap. D.h.: shadowmap[s/q, t/q] < r/q => Schatten 
  • Probleme der Shadow Map Die Lichtquellen müssen als Spots behandelt werden. Die Auflösung der Shadowmap bestimmt wie genau die Schattenkanten gerendert werden. 
  • Advertisement
  • Generierung der Depth Map Der Vertex-Shader wendet nur model-, view- und projection-matrix an. Der Fragment-Shader ist leer. Dadurch werden Tiefenwerte für den aktiven FBO generiert, jedoch keine Fragmente beschrieben. 
  • Rendern der Szene Im Vertex-Shader wird neben dem normalen transformierten Vertex derselbe Punkt als Lichtquellen- Koordinate übergeben (Matrizenaufbau s.o.). Der Fragment-Shader sieht folgendermaßen aus: in vec3 passPosition; in vec4 passShadowCoord; uniform sampler2D shadowMap; out vec4 fragmentColor; void main() { float shadow = 1.0; vec3 shadowCoord = passShadowCoord.xyz / passShadowCoord; float lightDepth = texture(shadowMap, shadowCoord.xy).z if(lightDepth < shadowCoord.z)     shadow = 0.0; fragmentColor.rgb += shadow * ...; } 
  • Wie entsteht Shadow Acne Da die Oberfläche nur an einigen Punkten abgetastet wird, werden Bereiche der Oberfläche als verdeckt eingestuft. Dies führt zu “Schattenmustern” auf Oberflächen, die eigentlich beleuchtet werden. Es muss ein Offset addiert werden um den Depth-Bias zu überwinden. Dies ist aus Laufzeitgründen oft ein konstanter Wert. Ein hoher Offset führt zu Peter-Panning (fliegenden Objekten, bzw. zu kleinen Schatten). Ein zu kleiner Offset führt zu Shadow Acne auf Flächen, die steil zur Lichtquelle stehen. Um ein akkurates Bild zu erhalten muss der Offset für jedes Polygon in Abhängigkeit von der Steigung berechnet werden. 
  • Code um Shadow Acne zu vermeiden float cos_phi = max(dot(normal, lightVector), 0.0f); float bias = 0.0002 * tan(acos(cos_phi));  Um Peter-Panning zu reduzieren kann auch ein Backface-Culling bei Erstellung der Shadowmap durchgeführt werden. Es darf dann aber nur geschlossene Objekte geben. 
  • Varianten für Weiche Schatten PCF (Percentage Closer Filtering) Mulitple Shadowmaps Varianz
  • PCF (Percentage Closer Filtering) Um weiche Schattenkanten zu erzeugen werden bei Zugriff auf die Shadowmap die zwei (oder vier oder mehr) nächsten Pixel als Vergleichswerte verwendet. In Abhängigkeit von diesen wird die Schattenstärke eingestellt. Dies ist vor allem für AA sinnvoll. Für bessere Ergebnisse kann auch ein Jittering anwenden, um nicht uniforme Samples zu erhalten. 
  • Mulitple Shadowmaps Eine Alternative ist pro Lichtquelle mehrere Shadowmaps (leicht verschoben) zu berechnen. Es entsteht physikalisch korrekterer Schatten, die Laufzeit verlängert sich jedoch merklich. 
  • Varianz Pro Tiefenwert wird auch der quadrierte Wert gespeichert. Diese Werte werden beim Auslesen mit der Tschebyscheff-Ungleichung nach Varianz modelliert. Es wird nur die Wahrscheinlichkeit eines Schattens errechnet. Dies liefert (wie bei multiplen Shadowmaps) Schatten deren Kante weicher wird, wenn sie weiter vom Objekt entfernt ist. 
  • Post-Perspective Shadow Mapping Die perspektivische Projektion aus Sicht der Kamera liefert ein kanonisches Volumen. Damit sind die Objekte so groß wie sie im finalen Bild sein werden. Es wird jetzt eine Shadow-Map mit den Objekten im kanonischen Volumen berechnet. Final werden die Schatten mit einer orthografischen Projektion im Bild ausgewertet. 
  • Cascaded Shadow Mapping (CSM) Aus Sicht der Kamera wird das Frustum entlang der Blickrichtung aufgeteilt (typisch in 4 Segmente). Dies ähnelt der MipMap-Idee. Je nachdem wo die Lichtquellen positioniert sind wird die Auflösung der Shadowmap angepasst.