Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Schattenkarten, die 1978 erstmals eingeführt wurden, sind eine gängige Technik zum Hinzufügen von Schatten zu Spielen. Drei Jahrzehnte später, trotz fortschritten in Hardware und Software, Schattenartefakten – nämlich schimmernde Kanten, perspektivische Aliasing und andere Genauigkeitsprobleme – bleiben erhalten.
In diesem technischen Artikel finden Sie eine Übersicht über einige gängige Schatten-Tiefenkartenalgorithmen und allgemeine Artefakte und erläutert verschiedene Techniken , die in Schwierigkeitsgraden von grundlegender bis zwischengeschalteter Art sind, die verwendet werden können, um die Qualität von Standard-Schattenkarten zu erhöhen. Das Hinzufügen grundlegender Schattenkarten zu einem Titel ist in der Regel einfach, aber das Verständnis der Nuancen von Schattenartefakten kann eine Herausforderung darstellen. Dieser technische Artikel wurde für den Entwickler von Zwischengrafiken geschrieben, der Schatten implementiert hat, aber nicht vollständig versteht, warum bestimmte Artefakte angezeigt werden und nicht sicher sind, wie sie umgehen können.
Die Auswahl der richtigen Techniken zur Entschärfung bestimmter Artefakte ist nichttrivial. Wenn Schattenkarten-Mängel behoben werden, kann der Unterschied in der Qualität beeindruckend sein (Abbildung 1). Durch die ordnungsgemäße Implementierung dieser Techniken werden Standardschatten erheblich verbessert. Die in diesem Artikel erläuterten Techniken werden im Beispiel CascadedShadowMaps11 im DirectX SDK implementiert.
Abbildung 1. Schatten mit schweren Artefakten (links) und Schatten nach der Implementierung der in diesem Artikel beschriebenen Techniken (rechts)
Überprüfung der Schattentiefe-Karten
Der Algorithmus für die Schattentiefekarte ist ein Zweidurchlaufalgorithmus. Der erste Durchgang generiert eine Tiefenkarte im Lichtraum. Im zweiten Durchgang wird diese Karte verwendet, um die Tiefe jedes Pixels im Lichtraum mit seiner entsprechenden Tiefe in der Tiefenkarte des Lichtraums zu vergleichen.
Abbildung 2. Wichtige Teile einer Schattenszene
Pass 1
Die Szene ist in Abbildung 2 dargestellt. Im ersten Durchlauf (Abbildung 3) wird die Geometrie aus sicht des Lichts in einen Tiefenpuffer gerendert. Genauer gesagt transformiert der Vertex-Shader die Geometrie in den Lichtansichtsbereich.
Das Endergebnis dieses ersten Durchlaufs ist ein Tiefenpuffer, der die Tiefeninformationen der Szene aus sicht des Lichts enthält. Dies kann jetzt in Pass 2 verwendet werden, um zu bestimmen, welche Pixel vom Licht verdeckt werden.
Abbildung 3. First pass of basic shadow mapping
Pass 2
Im zweiten Durchlauf (Abbildung 4) transformiert der Vertex-Shader jeden Vertex zweimal. Jeder Scheitelpunkt wird in den Ansichtsbereich der Kamera umgewandelt und als Position an den Pixelshader übergeben. Jeder Scheitelpunkt wird auch von der Ansichtsprojektionstexturmatrix des Lichts transformiert und als Texturkoordinate an den Pixelshader übergeben. Die Texturmatrix für die Ansichtsprojektion ist dieselbe Matrix, die zum Rendern der Szene in Pass 1 mit einer zusätzlichen Transformation verwendet wird. Es ist eine Transformation, die die Punkte vom Ansichtsbereich (–1 bis 1 in X und Y) in den Texturraum skaliert und übersetzt (0 bis 1 in X und 1 bis 0 in Y).
Der Pixelshader empfängt die interpolierte Position und die interpolierten Texturkoordinaten. Alles, was zum Durchführen des Tiefentests erforderlich ist, befindet sich jetzt in dieser Texturkoordinate. Der Tiefentest kann jetzt durchgeführt werden, indem der Tiefenpuffer aus dem ersten Durchgang mit den X- und Y-Texturkoordinaten indiziert und der resultierende Tiefenwert mit der Z-Texturkoordinate verglichen wird.
Abbildung 4. Second pass of basic shadow mapping
Schattenkartenartefakte
Der Algorithmus für die Schattentiefekarte ist der am häufigsten verwendete Echtzeitschattierungsalgorithmus, erzeugt aber dennoch mehrere Artefakte, die eine Entschärfung erfordern. Die Arten von Artefakten, die auftreten können, werden als Nächstes zusammengefasst.
Perspektivische Aliasierung
Perspektivische Aliasing, ein allgemeines Artefakt, wird in Abbildung 5 dargestellt. Es tritt auf, wenn die Zuordnung von Pixeln im Ansichtsbereich zu Texeln in der Schattenkarte kein 1:1-Verhältnis ist. Dies liegt daran, dass Pixel in der Nähe der Ebene näher zusammen sind und eine höhere Schattenkartenauflösung erfordern.
Abbildung 6 zeigt eine Schattenkarte und ein Ansichts-Frustum. In der Nähe des Auges sind die Pixel näher zusammen und viele Pixel werden den gleichen Schatten texeln zugeordnet. Die Pixel der weit entfernten Ebene werden ausgebreitet, wodurch die Perspektivaliasierung reduziert wird.
Abbildung 5. Aliasing mit hoher Perspektive (links) und Aliasing mit niedriger Perspektive (rechts)
Für das Bild links ist die Perspektivaliasierung höher; zu viele Augenraumpixel sind den gleichen Schattenkarten-Texeln zugeordnet. Im Bild rechts ist die Perspektivaliasierung niedrig, da zwischen den Augenraumpixeln und Schattenkarten-Texeln eine Zuordnung von 1:1 vorhanden ist.
Abbildung 6. Frustum mit Schattenkarte anzeigen
Helle Pixel in der weit entfernten Ebene stellen Aliasing mit niedriger Perspektive dar, und dunkle Pixel in der Nahen Ebene stellen aliasing mit hoher Perspektive dar.
Schattenkartenauflösung kann auch zu hoch sein. Obwohl eine höhere Auflösung weniger spürbar ist, kann sie trotzdem zu kleinen Objekten führen, z. B. Telefonkabel, keine Schatten umwandeln. Außerdem kann aufgrund von Texturzugriffsmustern aufgrund einer zu hohen Auflösung schwerwiegende Leistungsprobleme auftreten.
Perspektivische Schattenkarten (PSMs) und Lichtraum-Perspektivische Schattenkarten (LSPSMs) versuchen, perspektivische Aliase zu adressieren, indem die Projektionsmatrix des Lichts gedreht wird, um mehr Texel in der Nähe des Auges zu platzieren, wo sie benötigt werden. Leider ist keine Technik in der Lage, die perspektivische Aliasierung zu lösen. Die Parametrisierung der transformation, die zum Zuordnen von Augenraumpixeln zu Texeln in der Schattenkarte erforderlich ist, kann nicht durch eine lineare Schiefe gebunden werden. Eine logarithmische Parametrisierung ist erforderlich. PSMs setzen zu viele Details in die Nähe des Auges, wodurch entfernte Schatten von geringer Qualität sind oder sogar verschwinden. LSPSMs machen eine bessere Aufgabe, einen Mittleren Boden zwischen zunehmender Auflösung in der Nähe des Auges zu finden und genügend Details für Objekte weit entfernt zu lassen. Beide Techniken werden in einigen Szenenkonfigurationen auf orthografische Schatten degeneriert. Diese Degeneration kann durch Rendern einer separaten Schattenkarte für jedes Gesicht des Ansichtsfrstums bekämpft werden, obwohl dies teuer ist. Logarithmische Perspektivische Schattenkarten (LogPSMs) rendern auch eine separate Karte pro Gesicht des Ansichts-Frustums. Diese Technik verwendet nichtlineare Rasterung, um weitere Texel in der Nähe des Auges zu platzieren. D3D10- und D3D11-Klassenhardware unterstützen keine nichtlineare Rasterung. Weitere Informationen zu diesen Techniken und Algorithmen finden Sie im Abschnitt "Verweise".
Kaskadierte Schattenkarten (Cascaded Shadow Maps, CSMs) sind die am häufigsten verwendete Technik für den Umgang mit perspektivischem Aliasing. Obwohl CSMs mit PSMs und LSPSMs kombiniert werden können, ist es unnötig. Die Verwendung von CSMs zum Beheben von Perspektiv-Aliasing-Fehlern wird im Begleitartikel " Cascaded Shadow Maps" behandelt.
Projective Aliasing
Projective Aliasing ist schwieriger zu zeigen als perspektivische Aliase. Die in Abbildung 7 hervorgehobenen unbeaufsichtigten Schatten veranschaulichen projektive Aliasingfehler. Projective Aliasing tritt auf, wenn die Zuordnung zwischen Texeln im Kameraraum zu Texeln im Lichtraum kein 1:1-Verhältnis ist; Dies liegt an der Ausrichtung der Geometrie in Bezug auf die Lichtkamera. Projective Aliasing tritt auf, wenn die Tangensebene der Geometrie parallel zu den Lichtstrahlen wird.
Abbildung 7. High-projective Aliasing vs. low-projective aliasing
Techniken, die verwendet werden, um perspektivische Aliasingfehler zu verringern, mindern auch projektive Aliasing. Projective Aliasing tritt auf, wenn die Oberfläche normal für das Licht ist; Diese Oberflächen sollten weniger Licht erhalten, basierend auf diffusen Beleuchtungsgleichungen.
Schatten Akne und irrtümliche Selbstschattierung
Schatten-Akne (Abbildung 8), ein Begriff, der gleichbedeutend mit irrtümlichen Selbstschatten ist, tritt auf, wenn die Schattenkarte die Tiefe über einem gesamten Texel quantisiert. Wenn der Shader eine tatsächliche Tiefe mit diesem Wert vergleicht, ist es wahrscheinlich selbstschattet, da er nicht abgeschattet werden soll.
Ein weiterer Grund für Schatten-Akne ist, dass der Texel im Lichtraum so nah an der Tiefe des entsprechenden Texels in der Tiefenkarte ist, dass Genauigkeitsfehler den Tiefentest fälschlicherweise fehlschlagen. Ein Grund für diesen Genauigkeitsunterschied ist, dass die Tiefenzuordnung von der Hardware für die Rasterung mit fester Funktion berechnet wurde, während die vom Shader verglichene Tiefe berechnet wurde. Projective Aliasing kann auch Schatten akne verursachen.
Abbildung 8. Schatten-Akneartefakt
Wie im linken Bild gezeigt, haben einige Pixel den Tiefentest fehlgeschlagen und gesprenkelte Artefakte und Moiré-Muster erstellt. Um die fehlerhafte Selbstschattierung zu reduzieren, sollten die Grenzen auf der nahen Ebene und die weit entfernte Ebene für das Lichtraum-Frustum so eng wie möglich berechnet werden. Die skalierungsbasierte Tiefenneigung und andere Arten von Verzerrungen sind andere Lösungen, die verwendet werden, um Schatten akne zu mindern.
Peter Panning
Der Begriff Peter Panning leitet seinen Namen von einem Kinderbuch-Charakter ab, dessen Schatten getrennt wurde und wer fliegen konnte. Dieses Artefakt macht Objekte mit fehlenden Schatten scheinbar getrennt und über der Oberfläche schweben (Abbildung 9).
Abbildung 9. Peter Panning Artefakt
In dem Bild links wird der Schatten vom Objekt getrennt, wodurch ein schwebender Effekt entsteht.
Eine Technik zum Entfernen von Oberflächen-Akne ist das Hinzufügen eines Werts zur Pixelposition im Lichtraum; Dies wird als Hinzufügen eines Tiefenoffsets bezeichnet. Peter Panning ergibt sich, wenn der verwendete Tiefenoffset zu groß ist. In diesem Fall bewirkt der Tiefenversatz, dass der Tiefentest fälschlicherweise bestanden wird. Wie Schatten-Akne wird Peter Panning verschlimmert, wenn im Tiefenpuffer nicht genügend Präzision vorhanden ist. Das Berechnen enger Flugebenen und weit entfernter Flugzeuge trägt auch dazu bei, Peter Panning zu vermeiden.
Techniken zur Verbesserung von Schattenkarten
Das Hinzufügen von Schatten zu einem Titel ist ein Prozess. Der erste Schritt besteht darin, grundlegende Schattenkarten zu erhalten, die funktionieren. Die zweite besteht darin, sicherzustellen, dass alle grundlegenden Berechnungen optimal durchgeführt werden: Frusta passen so eng wie möglich, nahe/weit Ebenen passen eng an, hangskalierte Verzerrungen werden verwendet usw. Sobald grundlegende Schatten aktiviert sind und so gut wie möglich aussehen, hat der Entwickler eine bessere Vorstellung davon, welche Algorithmen erforderlich sind, um die Schatten auf ausreichende Genauigkeit zu bringen. Grundlegende Tipps, die möglicherweise erforderlich sind, um grundlegende Schattenkarten zu erhalten, die sich am besten ansehen, finden Sie in diesem Abschnitt.
Steigungs-Tiefenneigung
Wie bereits erwähnt, kann selbstschattend zu Schatten akne führen. Das Hinzufügen zu viel Voreingenommenheit kann zu Peter Panning führen. Darüber hinaus leiden Polygone mit steilen Hängen (relativ zum Licht) mehr von projektiven Aliasen als Polygone mit flachen Hängen (relativ zum Licht). Aus diesem Grund benötigt jeder Tiefenkartenwert je nach Steigung des Polygons relativ zum Licht möglicherweise einen anderen Offset.
Direct3D 10-Hardware hat die Möglichkeit, ein Polygon basierend auf seiner Steigung in Bezug auf die Ansichtsrichtung voreingenommen zu haben. Dies hat die Auswirkung, eine große Verzerrung auf ein Polygon anzuwenden, das am Rand auf die Lichtrichtung angezeigt wird, aber keine Verzerrungen auf ein Polygon anwenden, das direkt auf das Licht gerichtet ist. In Abbildung 10 wird veranschaulicht, wie zwei benachbarte Pixel zwischen schattierten und ungeschatteten Pixeln beim Testen mit derselben unvoreingenommenen Steigung wechseln können.
Abbildung 10. Steigung skalierte Tiefenverzerrung im Vergleich zu unvoreingenommener Tiefe
Berechnen einer engen Projektion
Eng an die Projektion des Lichts an das Ansichtsfrstum anpassen, erhöht die Schattenkartenabdeckung. Abbildung 11 veranschaulicht, dass die Verwendung einer beliebigen Projektion oder das Anpassen der Projektion an die Grenzen der Szene zu einer höheren Perspektivasierung führt.
Abbildung 11. Beliebiges Schatten-Frustum und Schatten-Frustum passen in Szene
Die Sicht liegt aus der Sicht des Lichts. Das Trapezoid stellt das Frustum der Ansichtskamera dar. Das über dem Bild gezeichnete Raster stellt die Schattenkarte dar. Das Bild auf der rechten Seite zeigt, dass die gleiche Auflösung Schattenkarte mehr Texelabdeckung erzeugt, wenn sie enger an die Szene passt.
Abbildung 12 zeigt Frustums, die richtig passen. Um die Projektion zu berechnen, werden die acht Punkte, aus denen das Ansichtsfrstum besteht, in den Lichtraum umgewandelt. Als Nächstes werden die Mindest- und Höchstwerte in X und Y gefunden. Diese Werte bilden die Grenzen für eine orthografische Projektion.
Abbildung 12. Schattenprojektion passt zum Anzeigen von Frustum
Es ist auch möglich, das Frustum in die Szene AABB zu schneiden, um eine engere Grenze zu erhalten. Dies wird in allen Fällen nicht empfohlen, da dies die Größe der Projektion der Lichtkamera von Frame zu Frame ändern kann. Viele Techniken, z. B. die im Abschnitt "Verschieben der Licht texelgroßen Inkremente" beschriebenen, geben bessere Ergebnisse, wenn die Größe der Lichtprojektion in jedem Frame konstant bleibt.
Berechnen der Nahebene und der weit entfernten Ebene
Die nahe Ebene und die weit entfernte Ebene sind die endgültigen Teile, die zum Berechnen der Projektionsmatrix erforderlich sind. Je enger die Ebenen zusammen sind, desto präziser sind die Werte im Tiefenpuffer.
Der Tiefenpuffer kann 16-Bit-, 24-Bit- oder 32-Bit-Werte mit Werten zwischen 0 und 1 sein. Im Allgemeinen sind Tiefenpuffer fester Punkt, wobei die Werte nahe der nahe gelegenen Ebene enger gruppiert sind als die Werte nahe der weit entfernten Ebene. Die für den Tiefenpuffer verfügbare Genauigkeit wird durch das Verhältnis der nahe Ebene zur weit entfernten Ebene bestimmt. Die Verwendung eines 16-Bit-Tiefenpuffers mit möglichst knapper/weit möglicher Nähe/Weit-Ebene kann die Verwendung eines 16-Bit-Tiefenpuffers ermöglichen. Ein 16-Bit-Tiefenpuffer könnte die Arbeitsspeichernutzung reduzieren und gleichzeitig die Verarbeitungsgeschwindigkeit erhöhen.
AABB-basierte Nah- und Fernebene
Eine einfache und naive Möglichkeit, die nahe Ebene und die ferne Ebene zu berechnen, besteht darin, das Begrenzungsvolumen der Szene in den Lichtraum umzuwandeln. Der kleinste Z-Koordinatenwert ist die nahe Ebene und der größte Z-Koordinatenwert ist die weit entfernte Ebene. Für viele Konfigurationen der Szene und des Lichts reicht dieser Ansatz aus. Das schlimmsten Fallszenario kann jedoch zu einem erheblichen Genauigkeitsverlust im Tiefenpuffer führen; Abbildung 13 zeigt ein solches Szenario. Hier ist der Bereich der nahen Ebene bis zur weit entfernten Ebene viermal größer als nötig.
Das Ansichts-Frustum in Abbildung 13 wurde absichtlich als klein ausgewählt. Ein kleines Ansichts-Frustum wird in einer sehr großen Szene gezeigt, die aus Säulen besteht, die sich von der Ansichtskamera erstrecken. Die Verwendung der Scene AABB für die Nahe- und Weitebenen ist nicht optimal. Der im technischen Artikel "Cascaded Shadow Maps " beschriebene CSM-Algorithmus muss nahe und weit entfernte Ebenen für sehr kleine Frustums berechnen.
Abbildung 13. Nah- und Weitebenen basierend auf Scene AABB
Frustum-basierte Nahebene und Weitebene
Eine weitere Technik für die Berechnung der Nahe- und Fernebenen ist die Umwandlung des Frustums in den Lichtraum und die Verwendung der minimalen und maximal zulässigen Werte in Z als nah und weit. In Abbildung 14 sind die beiden Probleme mit diesem Ansatz dargestellt. Erstens ist die Berechnung zu konservativer, wie gezeigt, wenn sich das Frustum über die Geometrie der Szene erstreckt. Zweitens könnte die nahe Ebene zu eng sein, was dazu führt, dass Schatten casters zugeschnitten werden.
Abbildung 14: Nah- und Weitebenen, die ausschließlich auf Sicht frustum basieren
Licht-Frustum mit Szene, um Nahe- und Weitebenen zu berechnen
Die richtige Methode zum Berechnen der Nahe- und Fernebenen ist in Abbildung 15 dargestellt. Vier der Ebenen des orthografischen Licht-Frustums wurden mit den Minimal- und Höchstwerte der X- und Y-Koordinaten des Ansichts-Frustums im Lichtraum berechnet. Die letzten beiden Ebenen des orthogonalen Sicht-Frustums sind die nahe und die weit entfernten Ebenen. Um diese Ebenen zu finden, werden die Grenzen der Szene an die vier bekannten Licht-Frustumsebenen abgeschnitten. Die kleinsten und größten Z-Werte aus der neu abgeschnittenen Grenze stellen die nahe ebene bzw. weit entfernte Ebene dar.
Der Code, der diesen Vorgang ausführt, befindet sich im CascadedShadowMaps11-Beispiel. Die acht Punkte, aus denen die AABB der Welt besteht, werden in den Lichtraum umgewandelt. Das Transformieren der Punkte in den Lichtraum vereinfacht die Beschneidungstests. Die vier bekannten Ebenen des Licht-Frustums können nun als Linien dargestellt werden. Die Szenen, die die Begrenzungslautstärke im Lichtraum aufweisen, können als sechs Vierecks dargestellt werden. Diese 6 Quadrilaterale können dann in 12 Dreiecke für dreieckbasierte Beschneidungen umgewandelt werden. Die Dreiecke werden mit den bekannten Ebenen des Ansichtsfrstums abgeschnitten (dies sind horizontale und vertikale Linien in X und Y im Lichtraum). Wenn ein Schnittpunkt in X und Y gefunden wird, wird das 3D-Dreieck an diesem Punkt abgeschnitten. Die minimalen und maximalen Z-Werte aller beschnittenen Dreiecke sind die nahe Ebene und weit. Das CascadedShadowMaps11-Beispiel zeigt, wie Sie diesen Clipping in der ComputeNearAndFar-Funktion ausführen.
Es gibt zwei weitere Techniken, die verwendet werden könnten, um möglichst nahe und weit entfernte Flugzeuge zu berechnen. Diese Techniken werden im CascadedShadowMaps-Beispiel nicht angezeigt.
Sogar engere nahe und weit entfernte Ebenen könnten berechnet werden, indem eine Hierarchie einer Szene oder einzelner Objekte in einer Szene gegen das Licht frustum überschneiden. Dies wäre rechenintensiver. Im Beispiel "CascadedShadowMaps11" ist dies zwar keine gültige Technik für einige Kacheln.
Die weit entfernte Ebene könnte berechnet werden, indem sie das Minimum von:
- Die größte Tiefe des Ansichts-Frustums im Lichtraum.
- Die größte Tiefe der Schnittmenge des Ansichtsfrstums und der Szene AABB.
Dieser Ansatz kann problematisch sein, wenn er mit kaskadierten Schattenkarten verwendet wird, wo es möglich ist, außerhalb eines Ansichts-Frustums indiziert zu werden. In diesem Fall fehlt möglicherweise die Schattenkarte geometrie.
Abbildung 15: Nah- und Weitebenen basierend auf der Schnittmenge der vier berechneten Ebenen des Licht frustums und der Begrenzungsgeometrie der Szene
Bewegen des Lichts in Texel-Größenschritten
Ein gängiges Artefakt in Schattenkarten ist der schimmernde Randeffekt. Während sich die Kamera bewegt, werden die Pixel entlang der Schattenränder aufgehellt und dunkler. Dies kann nicht in stillen Bildern gesehen werden, aber es ist sehr wahrnehmbar und ablenkend in Echtzeit. In Abbildung 16 wird dieses Problem hervorgehoben, und Abbildung 17 zeigt, wie die Schattenränder aussehen sollen.
Der schimmernde Randfehler tritt auf, da die Lichtprojektionsmatrix jedes Mal neu berechnet wird, wenn die Kamera bewegt wird. Dadurch entstehen subtile Unterschiede in den generierten Schattenkarten. Alle folgenden Faktoren können die Matrix beeinflussen, die erstellt wurde, um die Szene zu binden.
- Größe des Ansichts-Frustums
- Ausrichtung des Ansichts-Frustums
- Position des Lichts
- Position der Kamera
Jedes Mal, wenn sich diese Matrix ändert, können sich die Schattenränder ändern.
Abbildung 16: Schimmernde Schattenränder
Die Pixel entlang des Rahmens des Schattens kommen in und außerhalb des Schattens, während die Kamera von links nach rechts bewegt wird.
Abbildung 17: Schatten ohne schimmernde Kanten
Die Schattenränder bleiben konstant, wenn die Kamera von links nach rechts bewegt wird.
Bei richtungsgerichteten Lichten besteht die Lösung für dieses Problem darin, den Minimal-/Höchstwert in X und Y (die die orthografischen Projektionsgrenzen bilden) auf Pixelgrößenschritte zu runden. Dies kann mit einem Trennvorgang, einem Bodenbetrieb und einer Multiplikation erfolgen.
vLightCameraOrthographicMin /= vWorldUnitsPerTexel;
vLightCameraOrthographicMin = XMVectorFloor( vLightCameraOrthographicMin );
vLightCameraOrthographicMin *= vWorldUnitsPerTexel;
vLightCameraOrthographicMax /= vWorldUnitsPerTexel;
vLightCameraOrthographicMax = XMVectorFloor( vLightCameraOrthographicMax );
vLightCameraOrthographicMax *= vWorldUnitsPerTexel;
Der vWorldUnitsPerTexel-Wert wird berechnet, indem eine Begrenzung des Ansichts frustums und die Puffergröße dividiert wird.
FLOAT fWorldUnitsPerTexel = fCascadeBound /
(float)m_CopyOfCascadeConfig.m_iBufferSize;
vWorldUnitsPerTexel = XMVectorSet( fWorldUnitsPerTexel, fWorldUnitsPerTexel, 0.0f, 0.0f );
Das Einschränken der maximalen Größe des Ansichts-Frustums führt zu einer lockereren Anpassung für die orthografische Projektion.
Beachten Sie, dass die Textur bei Verwendung dieser Technik um 1 Pixel größer ist. Dadurch werden Schattenkoordinaten außerhalb der Schattenkarte nicht indiziert.
Vorder- und Rückseite
Schattenkarten sollten mit standardmäßigem Hintergrund-Culling gerendert werden, ein Prozess, der die Rasterung von Objekten überspringt, die der Betrachter nicht sehen kann, und beschleunigt das Rendern der Szene. Eine weitere gängige Option ist das Rendern von Schattenkarten mit aktivierter Front-Face-Culling, was bedeutet, dass Objekte, die dem Viewer gegenüber stehen, eliminiert werden. Das Argument dafür ist, dass es bei der Selbstschattierung hilft, da die Geometrie, die die Rückseite von Objekten bildet, leicht versetzt ist. Es gibt zwei Probleme mit dieser Idee.
- Jedes Objekt mit unsachgemäßer Front- oder Rückseitengeometrie verursacht Artefakte in der Schattenkarte. Wenn Sie jedoch falsche Front- oder Back-Face-Geometrie haben, können andere Probleme auftreten, sodass es möglicherweise sicher ist, dass die Geometrie von Front-Face und Back-Face korrekt ausgeführt wird. Es kann unpraktisch sein, Umgesichtsflächen für spritebasierte Geometrie wie z. B. Laub zu erstellen.
- Peter Panning und Schattenlücken in der Nähe der Basis von Objekten wie Wänden sind wahrscheinlicher, weil die Schattentiefe zu klein ist.
Schattenkarte – Benutzerfreundliche Geometrie
Das Erstellen von Geometrien, die gut in Schattenkarten funktioniert, ermöglicht mehr Flexibilität bei der Bekämpfung von Artefakten wie Peter Panning und Schatten akne.
Harte Kanten sind für die Selbstschattierung problematisch. Die Tiefenunterschiede in der Nähe der Spitze des Rands sind sehr klein. Selbst ein kleiner Offset kann dazu führen, dass Objekte ihre Schatten verlieren (Abbildung 18).
Abbildung 18: Scharfe Kanten führen zu Artefakten, die von geringen Tiefenunterschieden mit Offsets stammen
Schmale Objekte wie Wände sollten auch dann über Rücken verfügen, wenn sie nie sichtbar sind. Dadurch wird die Tiefenunterschiede erhöht.
Es ist auch wichtig, sicherzustellen, dass die Richtung der Geometrie korrekt ist; d. h., die Außenseite eines Objekts sollte nach hinten gerichtet sein, und die Innenseite eines Objekts sollte nach vorne gerichtet sein. Dies ist wichtig für das Rendern mit aktivierter Back-Face-Culling sowie für die Bekämpfung der Auswirkungen von Tiefenverzerrungen.
Überlappende Schattenkarten
Siehe auch kaskadierte Schattenkarten und die CascadedShadowMaps11-Beispiel-App. Im Beispiel wird der Algorithmus für kaskadierte Schattenkarte (CSM) sowie mehrere Techniken veranschaulicht, die verwendet werden können, um die Schattenkarte effizient zu nutzen.
Das Beispiel finden Sie im DirectX Software Development Kit (SDK). Oder Sie können eine Websuche durchführen, um sie auf GitHub zu finden.
Zusammenfassung
Die in diesem Artikel beschriebenen Techniken können verwendet werden, um die Qualität von Standard-Schattenkarten zu erhöhen. Der nächste Schritt besteht darin, Techniken zu betrachten, die gut mit standardmäßigen Schattenkarten funktionieren können. CSMs werden als überlegene Technik zur Bekämpfung der Perspektivaliasierung empfohlen. Die Prozentuale Näherung der Filterung oder Varianzschattenzuordnungen kann verwendet werden, um Schattenränder zu weichmachen. Weitere Informationen finden Sie im technischen Artikel "Cascaded Shadow Maps ".
Donnelly, W., und Lauritzen, A. Varianzschattenzuordnungen. Symposium zu interaktiven 3D-Grafiken, Proceedings of the 2006 Symposium on Interactive 3D Graphics and Games. 2006, S. 161–165.
Engel, Woflgang F. Abschnitt 4. Kaskadierte Schattenkarten. ShaderX5, Advanced Rendering Techniques, Wolfgang F. Engel, Ed. Charles River Media, Boston, Massachusetts. 2006. S. 197–206.
Stamminger, Marc und Drettakis, George. Perspektivische Schattenkarten. Internationale Konferenz über Computergrafiken und interaktive Techniken, Proceedings of the 29th Annual Conference on Computer Graphics and Interactive Techniques. 2002, S. 557–562.
Wimmer, M., Scherzer, D., und Purgathofer, W. Lichtraumperspektive Schattenkarten. Eurographics Symposium on Rendering. 2004. Überarbeitet am 10. Juni 2005. Technische Universität Wien.