Freigeben über


Allgemeine Artikel zum Verbessern von Tiefenkarten für Schatten

Schattenkarten, die erstmals 1978 eingeführt wurden, sind eine gängige Technik zum Hinzufügen von Schatten zu Spielen. Drei Jahrzehnte später, trotz Fortschritten bei Hardware und Software, bleiben Schattenartefakte – nämlich schimmernde Kanten, Perspektivalias und andere Genauigkeitsprobleme – bestehen.

Dieser technische Artikel bietet einen Überblick über einige gängige Schattentiefenkartenalgorithmen und gängige Artefakte und erläutert verschiedene Techniken– von einfachen bis mittleren Schwierigkeitsgraden –, die verwendet werden können, um die Qualität von Standardschattenkarten 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 sein. Dieser technische Artikel wurde für den Grafikentwickler zwischengeschaltet, der Schatten implementiert hat, aber nicht vollständig versteht, warum bestimmte Artefakte auftreten, und ist nicht sicher, wie sie um sie herum arbeiten sollen.

Die Auswahl der richtigen Techniken zum Minimieren bestimmter Artefakte ist nichttrivial. Wenn Schattenkartenmängel behoben werden, kann der Qualitätsunterschied beeindruckend sein (Abbildung 1). Die richtige Implementierung dieser Techniken verbessert die Standardschatten drastisch. Die in diesem Artikel erläuterten Techniken werden im Beispiel CascadedShadowMaps11 im DirectX SDK implementiert.

Abbildung 1. Schatten mit schwerwiegenden Artefakten (links) und Schatten nach der Implementierung der in diesem Artikel beschriebenen Techniken (rechts)

Schatten mit schwerwiegenden Artefakten (links) und Schatten nach der Implementierung der in diesem Artikel beschriebenen Techniken (rechts)

Shadow Depth Maps Review

Der Algorithmus für schattentiefe Karten ist ein Algorithmus mit zwei Durchlaufs. Der erste Durchgang generiert eine Tiefenkarte im lichten Raum. Im zweiten Durchgang wird diese Karte verwendet, um die Tiefe jedes Pixels im Lichtraum mit der entsprechenden Tiefe in der Karte der Lichtraumtiefe zu vergleichen.

Abbildung 2. Wichtige Teile einer Schattenszene

Wichtige Teile einer Schattenszene

Bestanden 1

Die Szene ist in Abbildung 2 dargestellt. Im ersten Durchgang (Abbildung 3) wird die Geometrie aus Sicht des Lichts in einen Tiefenpuffer gerendert. Genauer gesagt transformiert der Vertex-Shader die Geometrie in einen Lichtblickraum.

Das Endergebnis dieses ersten Durchgangs ist ein Tiefenpuffer, der die Tiefeninformationen der Szene aus sicht des Lichts enthält. Dies kann nun in Durchgang 2 verwendet werden, um zu bestimmen, welche Pixel vom Licht verdeckt werden.

Abbildung 3. Erster Durchlauf der grundlegenden Schattenzuordnung

erster Durchlauf der grundlegenden Schattenzuordnung

Pass 2

Im zweiten Durchlauf (Abbildung 4) transformiert der Vertex-Shader jeden Scheitelpunkt zweimal. Jeder Scheitelpunkt wird in den Sichtraum der Kamera transformiert und als Position an den Pixel-Shader übergeben. Jeder Scheitelpunkt wird auch von der Sicht-Projektions-Texturmatrix des Lichts transformiert und als Texturkoordinate an den Pixel-Shader übergeben. Die Matrix Ansicht-Projektion-Textur ist dieselbe Matrix, die zum Rendern der Szene in Durchgang 1 mit einer zusätzlichen Transformation verwendet wird. Dabei handelt es sich um eine Transformation, die die Punkte vom Sichtraum (–1 auf 1 in X und Y) in den Texturraum (0 bis 1 in X und 1 bis 0 in Y) übersetzt.

Der Pixel-Shader empfängt die interpolierte Position und die interpolierten Texturkoordinaten. Alles, was zum Durchführen des Tiefentests benötigt wird, befindet sich jetzt in dieser Texturkoordinate. Der Tiefentest kann nun durchgeführt werden, indem der Tiefenpuffer ab dem ersten Durchlauf mit den X- und Y-Texturkoordinaten indiziert und der resultierende Tiefenwert mit der Z-Texturkoordinate verglichen wird.

Abbildung 4. Zweiter Durchgang der grundlegenden Schattenzuordnung

Zweiter Durchgang der grundlegenden Schattenzuordnung

Schattenkartenartefakte

Der Algorithmus für schattentiefe Karten ist der am häufigsten verwendete Echtzeitschattenalgorithmus, erzeugt aber trotzdem mehrere Artefakte, die eine Entschärfung erfordern. Die Arten von Artefakten, die auftreten können, werden als Nächstes zusammengefasst.

Perspektivaliasing

Das perspektivische Aliasing, ein häufiges Artefakt, ist in Abbildung 5 dargestellt. Dies tritt auf, wenn die Zuordnung von Pixeln im Sichtraum zu Texels in der Schattenkarte kein 1:1-Verhältnis ist. Dies liegt daran, dass Pixel, die sich in der Nähe der nahen Ebene befinden, näher beieinander liegen und eine höhere Auflösung der Schattenkarte erfordern.

Abbildung 6 zeigt eine Schattenkarte und ein Ansichts frustum. In der Nähe des Auges sind die Pixel näher beieinander, und viele Pixel sind den gleichen Schatten texels zugeordnet. Die Pixel auf der far-Ebene sind verteilt, wodurch die Perspektivaliasing verringert werden.

Abbildung 5. Aliasing mit hoher Perspektive (links) im Vergleich zu Aliasing mit niedriger Perspektive (rechts)

Hochperspektivealiasing (links) im Vergleich zu Aliasing mit niedriger Perspektive (rechts)

Für das bild links ist die Perspektivaliase höher; zu viele Augenraumpixel werden derselben Schattenkarte texels zugeordnet. Im rechten Bild ist das Perspektivaliasing niedrig, da es eine 1:1-Zuordnung zwischen den Augenraumpixeln und Schattenkarten-Texels gibt.

Abbildung 6. Frustum mit Schattenkarte anzeigen

Frustum mit Schattenkarte anzeigen

Helle Pixel in der fernen Ebene stellen aliasing mit niedriger Perspektive dar, und dunkle Pixel in der nahen Ebene stellen hochperspektivenaliasing dar.

Die Auflösung der Schattenkarte kann auch zu hoch sein. Obwohl eine höhere Auflösung weniger spürbar ist, kann es dennoch zu kleinen Objekten wie Telefondrähten führen, die keine Schatten werfen. Außerdem kann eine zu hohe Auflösung aufgrund von Texturzugriffsmustern zu schwerwiegenden Leistungsproblemen führen.

Perspektivische Schattenkarten (PSMs) und Lichtraumperspektivenschattenkarten (LSPSMs) versuchen, perspektivische Aliase zu adressieren, indem die Projektionsmatrix des Lichts gedreht wird, um weitere Texel in der Nähe des Auges zu platzieren, wo sie benötigt werden. Leider ist keine technik in der Lage, das Perspektivaliasing zu lösen. Die Parametrisierung der Transformation, die zum Zuordnen von Pixeln des Blickraums zu Texeln in der Schattenkarte erforderlich ist, kann nicht durch eine lineare Abweichung 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 können einen Mittelweg zwischen zunehmender Auflösung in der Nähe des Auges und genügend Details für Objekte in der Ferne finden. Beide Techniken verkommen in einigen Szenenkonfigurationen zu orthographischen Schatten. Dieser Degeneration kann entgegengewirkt werden, indem eine separate Schattenkarte für jedes Gesicht der Ansicht Frustum erstellt wird, obwohl dies teuer ist. Logarithmische Perspektiv-Schattenkarten (LogPSMs) rendern auch eine separate Karte pro Gesicht der Ansicht frustum. Diese Technik verwendet die nichtlineare Rasterung, um weitere Texel in der Nähe des Auges zu platzieren. Die Hardware der D3D10- und D3D11-Klasse unterstützt keine nichtlineare Rasterung. Weitere Informationen zu diesen Techniken und Algorithmen finden Sie im Abschnitt Verweise.

Kaskadierte Schattenzuordnungen (Cascaded Shadow Maps, CSMs) sind die beliebteste Technik zum Umgang mit Perspektivaliasing. Obwohl CSMs mit PSMs und LSPSMs kombiniert werden können, ist dies unnötig. Die Verwendung von CSMs zum Beheben von Perspektivaliasingfehlern wird im Begleitartikel Cascaded Shadow Maps behandelt.

Projektive Aliasing

Projektive Aliasing ist schwieriger zu zeigen als Perspektivaliasing. Die in Abbildung 7 hervorgehobenen beaufsichtigten Schatten veranschaulichen projektive Aliasingfehler. Projective Aliasing tritt auf, wenn die Zuordnung zwischen Texels im Kameraraum zu Texels im lichten Raum kein 1:1-Verhältnis ist; dies liegt an der Ausrichtung der Geometrie in Bezug auf die Lichtkamera. Projektive Aliasing tritt auf, wenn die tangente Ebene der Geometrie parallel zu den Lichtstrahlen wird.

Abbildung 7. Hochprojektive Aliase im Vergleich zu niedrig projektiven Aliasen

Hochprojektive Aliase im Vergleich zu niedrig projektiven Aliasen

Techniken, die zur Behebung von Perspektivaliasingfehlern verwendet werden, mindern auch das projektive Aliasing. Projective Aliasing tritt auf, wenn die normale Oberfläche orthogonal für das Licht ist; Diese Oberflächen sollten aufgrund diffuser Beleuchtungsgleichungen weniger Licht empfangen.

Schatten akne und fehlerhafte Self-Shadowing

Schattenakne (Abbildung 8), ein Begriff, der für eine fehlerhafte Selbstschattung steht, tritt auf, wenn die Schattenkarte die Tiefe über einen gesamten Texel quantisiert. Wenn der Shader eine tatsächliche Tiefe mit diesem Wert vergleicht, ist es genauso wahrscheinlich, dass er selbst schattenlos ist.

Ein weiterer Grund für Schattenakne ist, dass der Texel im lichten Raum so nah an der Tiefe des entsprechenden Texels in der Tiefenkarte ist, dass Genauigkeitsfehler dazu führen, dass der Tiefentest fälschlicherweise fehlschlägt. Ein Grund für diesen Genauigkeitsunterschied ist, dass die Tiefenzuordnung von der Rasterungshardware mit festen Funktionen berechnet wurde, während die verglichene Tiefe vom Shader berechnet wurde. Projektive Aliase können auch Schattenakne verursachen.

Abbildung 8. Schatten-Akneartefakt

schatten akne artefakt

Wie im linken Bild gezeigt, haben einige Pixel den Tiefentest nicht bestanden und gesprenkelte Artefakte und Moirémuster erstellt. Um fehlerhafte Selbstschattierungen zu reduzieren, sollten die Grenzen auf der nahen Ebene und der fernen Ebene für das lichte Raumansichts-Frustum so eng wie möglich berechnet werden. Die auf der Steigungsskala basierende Tiefenverzerrung und andere Arten von Verzerrungen sind andere Lösungen, die zur Entschärfung von Schattenakne verwendet werden.

Peter Panning

Der Begriff Peter Panning leitet seinen Namen von einer Kinderbuchfigur ab, deren Schatten sich löste und wer fliegen konnte. Dieses Artefakt bewirkt, dass Objekte mit fehlenden Schatten getrennt von und über der Oberfläche schweben (Abbildung 9).

Abbildung 9. Peter Panning Artefakt

peter panning artefakt

Im Bild links wird der Schatten vom Objekt getrennt, sodass ein schwebender Effekt entsteht.

Eine Technik zum Entfernen von Oberflächenakne besteht darin, der Pixelposition im lichten Raum einen Mehrwert zu verleihen; Dies wird als Hinzufügen eines Tiefenoffsets bezeichnet. Peter Panning führt aus, wenn der verwendete Tiefenoffset zu groß ist. In diesem Fall führt der Tiefenoffset dazu, dass der Tiefentest fälschlicherweise bestanden wird. Peter Panning wird wie Schattenakne verschlimmert, wenn der Tiefenpuffer nicht genau ist. Die Berechnung von engen Nah- und Fernebenen hilft auch, 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 zum Funktionieren zu bringen. Die zweite besteht darin, sicherzustellen, dass alle grundlegenden Berechnungen optimal durchgeführt werden: Frusta-Anpassung so eng wie möglich, Nah-/Fernebenen eng anpassen, Neigungsskalierung verwendet wird, und so weiter. Sobald grundlegende Schatten aktiviert sind und so gut wie möglich aussehen, hat der Entwickler eine bessere Vorstellung davon, welche Algorithmen benötigt werden, um die Schatten zu einer ausreichenden Genauigkeit zu bringen. In diesem Abschnitt finden Sie grundlegende Tipps, die erforderlich sind, um grundlegende Schattenkarten zu erhalten.

Slope-Scale Tiefenverzerrung

Wie bereits erwähnt, kann Selbstschattierung zu Schattenakne führen. Das Hinzufügen von zu viel Verzerrung kann zu Peter Panning führen. Darüber hinaus leiden Polygone mit steilen Hängen (relativ zum Licht) stärker unter projektiven Aliasing als Polygone mit flachen Hängen (relativ zum Licht). Aus diesem Gründen benötigt jeder Tiefenkartenwert möglicherweise einen anderen Offset, abhängig von der Steigung des Polygons relativ zum Licht.

Direct3D 10-Hardware hat die Möglichkeit, ein Polygon basierend auf seiner Steigung in Bezug auf die Ansichtsrichtung voreinzuleiten. Dies hat den Effekt, dass eine große Verzerrung auf ein Polygon angewendet wird, das edge-on auf die Lichtrichtung angezeigt wird, aber keine Verzerrung auf ein Polygon angewendet wird, das direkt mit dem Licht zugewandt wird. Abbildung 10 veranschaulicht, wie zwei benachbarte Pixel zwischen schattierten und nicht abgeschirmten Pixeln wechseln können, wenn sie mit derselben unvoreingenommenen Steigung getestet werden.

Abbildung 10. Neigungsskalierte Tiefenverzerrung im Vergleich zu unvoreingenommener Tiefe

Neigungsskalierte Tiefenabweichung im Vergleich zu unvoreingenommener Tiefe

Berechnen einer engen Projektion

Durch die enge Anpassung der Lichtprojektion an das Ansichts frustum erhöht sich die Schattenkartenabdeckung. Abbildung 11 veranschaulicht, dass die Verwendung einer beliebigen Projektion oder das Anpassen der Projektion an die Szenengrenzen zu einem höheren Perspektivaliasing führt.

Abbildung 11. Beliebiges Schatten frustum und Schatten frustum passen zur Szene

beliebiges Schatten frustum und Schatten frustum passen zu Szene

Die Sicht ist aus der Sicht des Lichts. Das Trapez stellt das Frustum der Ansichtskamera dar. Das über das Bild gezeichnete Raster stellt die Schattenkarte dar. Das Bild auf der rechten Seite zeigt, dass die gleiche Auflösung der Schattenkarte eine größere Texelabdeckung erzeugt, wenn sie enger an die Szene angepasst ist.

Abbildung 12 zeigt Frustums, die ordnungsgemäß passen. Um die Projektion zu berechnen, werden die acht Punkte, aus denen das Sicht frustum besteht, in einen lichten Raum umgewandelt. Als Nächstes werden die minimalen und maximalen Werte in X und Y gefunden. Diese Werte bilden die Grenzen für eine orthographische Projektion.

Abbildung 12: Schattenprojektion passt zum Anzeigen von Frustum

Schattenprojektion passt zum Anzeigen von Frustum

Es ist auch möglich, das Frustum an die Szene AABB zu schneiden, um eine engere Grenze zu erhalten. Dies wird nicht in allen Fällen empfohlen, da dies die Größe der Projektion der Lichtkamera von Frame zu Frame ändern kann. Viele Techniken, z. B. die im Abschnitt Moving the Light Texel-Sized Inkremente beschriebenen, liefern bessere Ergebnisse, wenn die Größe der Lichtprojektion in jedem Frame konstant bleibt.

Berechnen der Nah- und Fernebene

Die Nah- und Fernebene sind die letzten Teile, die zum Berechnen der Projektionsmatrix erforderlich sind. Je enger die Ebenen beieinander sind, desto präziser sind die Werte im Tiefenpuffer.

Der Tiefenpuffer kann 16 Bit, 24 Bit oder 32 Bit mit Werten zwischen 0 und 1 sein. Im Allgemeinen handelt es sich bei Tiefenpuffern um einen Festen Punkt, wobei die Werte in der Nähe der nahnahen Ebene enger miteinander gruppiert sind als die Werte in der Nähe der fernen Ebene. Der Genauigkeitsgrad, der für den Tiefenpuffer verfügbar ist, wird durch das Verhältnis der Nahebene zur Fernebene bestimmt. Die Verwendung einer möglichst engen Nah-/Fernebene könnte die Verwendung eines 16-Bit-Tiefenpuffers ermöglichen. Ein 16-Bit-Tiefenpuffer könnte die Speicherauslastung reduzieren und gleichzeitig die Verarbeitungsgeschwindigkeit erhöhen.

AABB-Based in der Nähe von Ebene und Fernen Ebene

Eine einfache und naive Möglichkeit, die nahe Ebene und die ferne Ebene zu berechnen, besteht darin, das umgebende Volumen der Szene in einen hellen Raum zu transformieren. Der kleinste Z-Koordinatenwert ist die nahe Ebene, und der größte Z-Koordinatenwert ist die ferne Ebene. Für viele Konfigurationen der Szene und des Lichts ist dieser Ansatz ausreichend. Im schlimmsten Fall kann es jedoch zu einem erheblichen Genauigkeitsverlust im Tiefenpuffer führen; Abbildung 13 zeigt ein solches Szenario. Hier ist der Bereich der Nahebene bis zur fernen Ebene viermal größer als nötig.

Das Ansichts frustum in Abbildung 13 wurde absichtlich als klein ausgewählt. Eine kleine Ansicht frustum wird in einer sehr großen Szene gezeigt, die aus Säulen besteht, die sich von der Ansichtskamera heraus erstrecken. Die Verwendung des Szenen-AABB für die Nah- und Fernebene ist nicht optimal. Der im technischen Artikel Kaskadierte Schattenkarten beschriebene CSM-Algorithmus muss Nah- und Fernebenen für sehr kleine Frustums berechnen.

Abbildung 13: Nah- und Fernebenen basierend auf Szenen-AABB

Nah- und Fernebenen basierend auf Szene aabb

Frustum-Based in der Nähe von Ebene und Fernen Ebene

Eine weitere Technik zum Berechnen der Nah- und Fernebene besteht darin, das Frustum in einen leichten Raum zu transformieren und die minimalen und maximalen Werte in Z als nah und weit entfernte Ebene zu verwenden. Abbildung 14 veranschaulicht die beiden Probleme bei diesem Ansatz. Erstens ist die Berechnung zu konservativ, wie sich zeigt, wenn sich das Frustum über die Geometrie der Szene hinaus erstreckt. Zweitens könnte die nahe Ebene zu eng sein, was dazu führt, dass Schattenrollen zugeschnitten werden.

Abbildung 14. Nah- und Fernebenen, die ausschließlich auf Sicht frustum basieren

Nah- und Fernebenen, die ausschließlich auf Sicht frustum basieren

Leichtes Frustum überschneiden mit Szene zum Berechnen von Nah- und Fernebenen

Die richtige Methode zum Berechnen der Nah- und Fernebene ist in Abbildung 15 dargestellt. Vier der Ebenen des orthographischen Licht frustums wurden unter Verwendung des Minimums und Maximums der X- und Y-Koordinaten des Sicht frustums im lichten Raum berechnet. Die letzten beiden Ebenen des orthogonalen Sicht-Frustums sind die nah und die ferne Ebene. Um diese Ebenen zu finden, werden die Grenzen der Szene an den vier bekannten lichten Frustumebenen abgeschnitten. Die kleinsten und größten Z-Werte der neu zugeschnittenen Grenze stellen die nahe Ebene bzw. die ferne 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 einen lichten Raum umgewandelt. Die Umwandlung der Punkte in einen hellen Raum vereinfacht die Beschneidungstests. Die vier bekannten Ebenen des lichten Frustums können nun als Linien dargestellt werden. Das umgebende Szenenvolumen im Lichtraum kann als sechs Vierecks dargestellt werden. Diese 6 Vierecks können dann in 12 Dreiecke für dreieckbasiertes Ausschneiden umgewandelt werden. Die Dreiecke werden gegen die bekannten Ebenen des Ansichts frustum abgeschnitten (dies sind horizontale und vertikale Linien in X und Y im hellen Raum). 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 Nah- und Fernebene. 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 die engsten und fernen Ebenen zu berechnen. Diese Techniken werden im CascadedShadowMaps-Beispiel nicht gezeigt.

  • Noch engere Nah- und Fernebenen könnten berechnet werden, indem eine Hierarchie einer Szene oder einzelner Objekte in einer Szene gegen das lichte Frustum überschneiden wird. Dies wäre rechnerisch komplexer. Dies ist zwar nicht im CascadedShadowMaps11-Beispiel dargestellt, kann aber für einige Kacheln eine gültige Technik sein.

  • Die weit entfernte Ebene kann mit dem Minimum von berechnet werden:

    • Die größte Tiefe des Sicht-Frustums im hellen Raum.
    • Die größte Tiefe der Schnittmenge des Ansichts frustum und der Szene AABB.

Dieser Ansatz kann problematisch sein, wenn er mit kaskadierten Schattenkarten verwendet wird, bei denen es möglich ist, außerhalb eines Ansichts frustums zu indizieren. In diesem Fall fehlt der Schattenzuordnung möglicherweise die Geometrie.

Abbildung 15. Nah- und Fernebenen basierend auf der Schnittmenge der vier berechneten Ebenen des Licht frustums und der umgebenden Geometrie der Szene

Nah- und Fernebenen basierend auf der Schnittmenge der vier berechneten Ebenen des Licht frustums und der umgebenden Geometrie der Szene

Bewegen des Lichts in Texel-Sized Schritten

Ein häufiges Artefakt in Schattenkarten ist der schimmernde Randeffekt. Während sich die Kamera bewegt, werden die Pixel entlang der Schattenränder heller und dunkler. Dies ist in standstehenden Bildern nicht zu sehen, aber es ist in Echtzeit sehr spürbar und ablenkend. Abbildung 16 zeigt dieses Problem, und Abbildung 17 zeigt, wie die Schattenränder aussehen sollten.

Der schimmernde Randfehler tritt auf, weil die Lichtprojektionsmatrix bei jeder Kameraverschiebung neu berechnet 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 frustum
  • Ausrichtung des Ansichts frustum
  • 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

Schimmernde Schattenränder

Die Pixel entlang des Schattenrands kommen in und aus dem Schatten, wenn sich die Kamera von links nach rechts bewegt.

Abbildung 17. Schatten ohne schimmernde Kanten

Schatten ohne schimmernde Kanten

Die Schattenränder bleiben konstant, während die Kamera von links nach rechts bewegt wird.

Bei gerichteten Lichtern besteht die Lösung für dieses Problem darin, den minimalen/maximalen Wert in X und Y (die die orthografischen Projektionsgrenzen bilden) in Pixelgrößenkremente zu runden. Dies kann mit einem Trennvorgang, einem Bodenvorgang 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 Grenze des Ansichts frustum und dividiert durch die Puffergröße verwendet wird.

        FLOAT fWorldUnitsPerTexel = fCascadeBound /
        (float)m_CopyOfCascadeConfig.m_iBufferSize;
        vWorldUnitsPerTexel = XMVectorSet( fWorldUnitsPerTexel, fWorldUnitsPerTexel,                            0.0f, 0.0f );

Die Begrenzung der maximalen Größe des Ansichts frustums führt zu einer lockereren Anpassung für die orthographische Projektion.

Es ist wichtig zu beachten, dass die Textur bei Verwendung dieser Technik 1 Pixel größer in Breite und Höhe ist. Dadurch wird verhindert, dass Schattenkoordinaten außerhalb der Schattenkarte indiziert werden.

Rückseite und Vorderseite

Schattenkarten sollten mit standardmäßiger Hintergrundkulling gerendert werden, einem Prozess, der die Rasterung von Objekten überspringt, die der Betrachter nicht sehen kann, und das Rendern der Szene beschleunigt. Eine weitere gängige Option besteht darin, Schattenkarten mit aktivierter Front-Face-Culling zu rendern, was bedeutet, dass Objekte, die dem Viewer zugewandt sind, entfernt 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 falscher Vorder- oder Rückseitengeometrie verursacht Artefakte in der Schattenkarte. Eine falsche Vorder- oder Rückseitengeometrie verursacht jedoch andere Probleme, sodass es sicher sein kann, davon auszugehen, dass die Front- und Back-Face-Geometrie korrekt ausgeführt wurde. Es kann unpraktisch sein, Rückflächen für spritebasierte Geometrien wie Laub zu erstellen.
  • Peter Panning und Schattenlücken in der Nähe der Basis von Objekten wie Wänden treten eher auf, weil die Schattentiefe zu klein ist.

Benutzerfreundliche Geometrie für Schattenzuordnungen

Die Erstellung von Geometrien, die in Schattenkarten gut funktioniert, ermöglicht mehr Flexibilität bei der Bekämpfung von Artefakten wie Peter Panning und Schattenakne.

Harte Kanten sind beim Selbstschatten problematisch. Die Tiefenunterschiede in der Nähe der Spitze des Rands sind sehr gering. 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 geringem Tiefenunterschied mit Offsets stammen

Scharfe Kanten führen zu Artefakten, die von geringem Tiefenunterschied mit Offsets stammen

Schmale Objekte wie Wände sollten auch dann Rücken haben, wenn sie nie sichtbar sind. Dies erhöht die Tiefenunterschiede.

Es ist auch wichtig, sicherzustellen, dass die Richtung der Geometrie korrekt ist. Das heißt, die Außenseite eines Objekts sollte nach hinten und die Innenseite eines Objekts nach vorne ausgerichtet sein. Dies ist wichtig für das Rendern mit aktivierter Rückwand-Kulling sowie für die Bekämpfung der Auswirkungen von Tiefenverzerrungen.

Zusammenfassung

Die in diesem Artikel beschriebenen Techniken können verwendet werden, um die Qualität von Standardschattenkarten zu erhöhen. Der nächste Schritt besteht darin, Techniken zu untersuchen, die gut mit Standardmäßigen Schattenkarten funktionieren können. CSMs werden als überlegene Technik zur Bekämpfung des Perspektivaliasings empfohlen. Prozentuelle Filterung oder Varianzschattendiagramme können verwendet werden, um Schattenränder zu weicher zu machen. Weitere Informationen finden Sie im technischen Artikel Kaskadierte Schattenkarten .

Donnelly, W., und Lauritzen, A. Variance Shadow Maps. Symposium on Interactive 3D Graphics, 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. International Conference on Computer Graphics and Interactive Techniques, Proceedings of the 29th Annual Conference on Computer Graphics and Interactive Techniques. 2002, S. 557–562.

Wimmer, M., Scherzer, D., und Purgathofer, W. Light Space Perspective Shadow Maps. Eurographics Symposium on Rendering. 2004. Überarbeitet am 10. Juni 2005. Technische Universität Wien.