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 :-)