Perpsektivische shadow mapping Transformation

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
dronus
Establishment
Beiträge: 114
Registriert: 11.01.2010, 01:53

Perpsektivische shadow mapping Transformation

Beitrag von dronus »

Ich habe ein einfaches shadow mapping implementiert. Für perspektivische Ansichten, bei denen der Schatten in einem sehr großen Bereich fallen muss, gibt's ja einige mehr- oder weniger komplexe Verfahren (Kaskadierung usw.).

Ein relativ einfaches Verfahren dagegen ist, die shadow map aus Sicht des Lichtes, aber mit Berücksichtigung der Perspektive der Kamera zu berechnen. Nur wie kommt man dahin?

Im Moment hab ich ein einfaches shadow mapping aus der Sicht der Lichtquelle, mit einer orthonormalen Sicht, weil die Lichtquelle sehr weit entfernt ist (Sonne). Sowas wie (pseudo-code):

Code: Alles auswählen

    position_before_camera=camera_position+camera_direction*shadow_map_width_in_view_space/2;
    light_view_matrix=ortho_look_at(position_before_camera, light_direction, shadow_map_width_in_view_space);
Alternativ kann man eine perspektivische Matrix benuzten, wenn die Lichtquelle nicht so weit entfernt ist:

Code: Alles auswählen

    position_before_camera=camera_position+camera_direction*shadow_map_width_in_view_space/2;
    light_view_matrix=look_at(position_before_camera, light_position, some_up_direction);
Beides funktioniert ganz gut. Da zwei Perspektiven sehr verwirrend klingen, mache ich die neue Version mit der orthonormalen Variante. Etwa so:

Code: Alles auswählen

    light_view_matrix=ortho_look_at([0,0,0], light_direction, 1.) * camera_projection_matrix * camera_view_matrix;
Das funktioniert leider nicht.

Im Prinzip transformiert es die Szene ja in den Bildschirm-Raum wie üblich, aber dreht das ganze danach nochmal.

Der look_at sieht auf [0,0,0], weil die Kameraposition ja mit ihrer eigenen Transformation enthalten ist. Die perpektivische Transformation ist jetzt 'mitten drin' in der Transformationskette. Aber die perspektivische Transformation ist ja erst mit der perspektivischen Division im Anschluss an die Matrixrechnung komplett. Heisst das, das eine perspektivische Matrix immer nur am Ende der Kette benutzt werden darf, und sonst nicht funktioniert? Oder müsste das im Prinzip funktionieren, der Fehler ist nur irgendwo anders? Es ist nicht ganz einfach sich vorzustellen, wo die Punkte eigentlich landen... die uns gewohnte Perspektive geht ja immer vom Auge aus :-)
dronus
Establishment
Beiträge: 114
Registriert: 11.01.2010, 01:53

Re: Perpsektivische shadow mapping Transformation

Beitrag von dronus »

Eigentlich kann man sich das sogar bildlich vorstellen, zumindest für den Fall wo die Lichtquelle unendlich weit weg ist. Dann ist es nämlich orthonormal projeziert vom Licht aus, und man hat nur die Perspektive der Kamera.

Dann kann man sich vorstellen, dass man die Polygone so wie sie gerendert würden, als was vorne ist ist ganz groß, hintern alles klein, einfach nochmal gedreht werden, so dass man jetzt aus Lichtrichtung drauf guckt. Wenn das Licht genau von der Seite kommt, dann sieht man praktisch an einer Bildkante in der Höhe ganz groß gezerrt die Kamera--Vordergrund-Objekte, und an der anderen Bildkante ganz klein die entfernten Objekte, dafür hat man da ein in der Höhe viel größeres Gesichtfeld.

Das ist wie wenn man in einem schlau gebauten Guckkasten ein Loch in die Seite bohrt und da rein guckt :-)
Benutzeravatar
Schrompf
Moderator
Beiträge: 4884
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Perpsektivische shadow mapping Transformation

Beitrag von Schrompf »

Ich habe Deinen Beitrag ehrlich gesagt nicht zu verstehen versucht, da ich perspektivische Projektionstricks beim Shadow Mapping vor Ewigkeiten zu den Akten gelegt habe. Die scheitern alle rein prinzipiell, wenn Lichteinfallsvektor und Kamera-Vorwärtsvektor allzu nah beieinander liegen. Aus Sicht der GPU ist die Projektionsmatrix ja nur ein bisschen Umskalierung und Umstapeln in eine andere Vektorkomponente. Das Perspektivische entsteht ja erst durch die Division nachher, und die kommt zumindest eingebaut immer zwangsweise erst nach allen Matrizoperationen im VertexShader.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Antworten