Perpsektivische shadow mapping Transformation
Verfasst: 09.02.2014, 20:50
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):
Alternativ kann man eine perspektivische Matrix benuzten, wenn die Lichtquelle nicht so weit entfernt ist:
Beides funktioniert ganz gut. Da zwei Perspektiven sehr verwirrend klingen, mache ich die neue Version mit der orthonormalen Variante. Etwa so:
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 :-)
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);
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);
Code: Alles auswählen
light_view_matrix=ortho_look_at([0,0,0], light_direction, 1.) * camera_projection_matrix * camera_view_matrix;
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 :-)