Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

28.08.2014, 22:36

Matrizen für Directional Shadow Maps

Hallo zusammen,

bin schon seit geraumer Zeit damit beschäftigt Shadow-Maps für directional lights hinzubekommen, dabei verzweifle ich an der View-Matrix vom Licht. Die Projektions-Matrix vom Licht lässt sich ja anhand des Kamera-Frustums berechnen. Nur wie wähle ich eine geeignete View-Matrix? Alle Quellen zu Shadow Mapping sprechen immer nur über die orthographische Projektion, aber erwähnen nicht, wie man das Licht positionieren soll. Klar, directional lights haben ja auch keine Position, aber ich brauch doch eine um die Shadow Map zu rendern, oder habe ich einen Denkfehler?

Quellen:
http://http.developer.nvidia.com/GPUGems3/gpugems3_ch10.html
http://msdn.microsoft.com/en-us/library/…4(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/…7(v=vs.85).aspx

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

2

28.08.2014, 23:16

Ich beschäftige mich im Moment gerade mit dem selben Problem. Die Position spielt keine Rolle, solange kein Objekt aus dem Frustum ausgeschlossen wird, welches einen Schatten wirft. Das Frustum muss nur groß genug sein um auch das erste Objekt von der Lichtrichtung kommend zu beinhalten.

Eine optimale Lösung für die Kameraeinstellung gibt es sowieso nicht. Eine einfache sehr eingeschränkt geeignete Lösung ist es, die View Matrix der Shadow-Kamera einfach der Position der richtigen Kamera zu platzieren, in die Lichtrichtung auszurichten und diesen Quader dann einfach soweit zu vergrößern das sowohl das Schattenwerfende als auch auch empfangende Objekt im Frustum liegt und nach Möglichkeit die gesamte von der "echten" Kamera sichtbare Fläche abdeckt.

Weil das besonders bei Szenen im offenen Bereich sehr schlecht wie überhaupt nicht funktioniert(Immer zu wenig Auflösung oder Bereiche liegen außerhalb des Lichtfrustums und werden deshalb nicht richtig schattiert) gibt es verschiedene Ansätze die Auflösung nahe der Kamera zu verbessern und die entfernt liegenden Bereiche mit geringerer Shadow Map-Auflösung zu rendern. Zum einen gibt es das perspektivische Shadow Mapping, das darauf abzielt das ShadowMap-Frustum so zu verzerren, dass mehr Pixel nahe der Kamera fallen als weiter entfernt. Dazu gehört wohl auch die verbesserte Version die sich dann Trapezoidal Shadow Mappings. Diese Shadow Maps gibt es im Vergleich zur komplett unoptimierten Variante praktisch umsonst, weil einfach nur anders transforimiert wird was keine zusätzlichen Kosten auf der GPU verursacht werden. Leider gibt es jedoch bestimmte Kamerastellungen(Parallel zur Lichtrichtung) in dem es im Vergleich zu ohne der Technik keine Verbesserungen bringt weil das Frustum nicht verkleinert werden kann. Ein komplett anderer Ansatz ist es mehrere Shadow Maps zu nehmen die unterschiedliche genau und groß sind. Das nennt sich dann Cascaded Shadow Mapping und hat den Nachteil das es in der Regel ein Multipass Verfahren ist, weil es mehreren unabhänigen Maps besteht.

Ich habe mich im Moment für die Trapezoidal Shadow Mapping Variante entschieden.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Spiele Programmierer« (28.08.2014, 23:28)


Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

3

28.08.2014, 23:25

Jo, da ist ein Denkfehler, glaube ich. Du vermutest nämlich große Kunst, wo was ganz Einfaches waltet. Bau Deine Projektionsmatrix so, dass sie die Größe des Licht-Frustums auf Clip Space zurechtskaliert. Und bau Deine View Matrix so, dass sie vom Fußpunkt des Frustums aus in die richtige Richtung schaut.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

4

28.08.2014, 23:26

Danke für eure Antworten :)
Jetzt ist es mir um einiges klarer. Ich hatte alles zu diesem Thema verstanden, also PSSM oder CSM und die ganze Theorie, aber nicht diese eine kleine Sache :dash:

EDIT: Habs jetzt mehr oder weniger hinbekommen, muss noch schauen wie ich die Near und Far Z Werte berechne.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Batzer« (01.09.2014, 04:39)


5

29.08.2014, 00:40

Zitat

Habs jetzt mehr oder weniger hinbekommen, muss noch schauen wie ich die Near und Far Z Werte berechne.


Für die Far Z wird gerne ein gefixeter Wert (in Abhängigkeit von den user-defined specs) genutzt. Für die Near Z gibt es verschiedene Möglichkeiten. Entweder auch auf der CPU mithilfe der BBs die minimalste Tiefe errechnen oder (wie im Original Shadowmapping Paper beschrieben) ein Scan über eine Depthmap, um minimalsten Wert zu finden. Letzteres ist sehr Readback lastig und kann daher auf der CPU ausgeführt werden.
Ich persönliche nutze ersteren Ansatz, projiziere die Eckpunkte der Boundboxes zum Licht und schau dann einfach, welcher am nächsten ist.
Für weitere Methoden, einfach mal googlen ;)

Hinweise auch auf http://http.developer.nvidia.com/GPUGems/gpugems_ch14.html unter der Überschrift 14.2.2
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »iSmokiieZz« (29.08.2014, 00:51)


6

01.09.2014, 01:19

Mal ein kleines Update, habe jetzt alles so hinbekommen, wie ich es möchte :)
Als nächstes wage ich mich an PSSM und VSM. Vielen Dank für eure Hilfe!

Werbeanzeige