Matrix von ModelSpace->ShadowTextureSpace korrigieren

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Eisflamme
Establishment
Beiträge: 412
Registriert: 26.05.2002, 17:42
Wohnort: Köln

Matrix von ModelSpace->ShadowTextureSpace korrigieren

Beitrag von Eisflamme »

Hi,

mein Shadowmapping im Shader funktionierte gut fürs Terrain, jedoch nicht korrekt für andere Objekte. Nach langem Untersuchen habe ich nun festgestellt, woran es liegt: Die Texturematrix, die ich zum Erstellen der Schattenkoordinaten nutze, transformiert Vertices vom ModelSpace direkt in den TextureCoordinate-Space der Shadowmap.

Bisher sah die so aus:

T = lightProjectionMatrix * lightModelViewMatrix * biasMatrix;

Das Problem ist aber, dass das nicht funktioniert, wenn einzelne Objekte nach Setzen der jeweiligen ModelViewMatrix noch verschoben werden. Nehmen wir z.B. mein Terrain, wo alles klappt. Da wird keine Matrix mehr angefasst. Wenn ich aber meine Objekte rendere, wird jedes Objekt anhand seiner Position verschoben. Diese Verschiebung ist aber nicht in der TextureMatrix drin. Die normale ModelView-Matrix (für die Model->World-Space-Transformation) hat das jedoch schon drin.

Jetzt habe ich irgendwie im Kopf, dass es ok ist, wenn man im Shader einfach noch die ViewMatrix (also für Model->View-Space-Transformation) mit in die Rechnung packt und dann wird der Vertex korrekt transformiert. Ich weiß aber gerade nicht wie und bin wie so oft mit der Projektions-Mathematik überfordert.

Die TexturMatrix projeziert ja anscheinend von ObjectSpace zu ShadowTexture-Space unter der Voraussetzung, dass LightModelViewMatrix eben schon alle Transformationen enthält. Wenn die eigentliche ModelViewMatrix (Model->World) jetzt aber z.B. eine Bewegung des Objektes enthält und die lightModelViewMatrix das nicht tut, wie kann ich dann denn mit Hilfe der ViewMatrix (Model->View) meine Formel im Shader nachkorrigieren?

Edit: Ich könnte natürlich auch vorher die Nachberechnungen nochmal separat nutzen, um LightViewMatrix zu manipulieren... habe nur im Kopf, dass man das lieber in den Shader auslagert, daher die Frage. Das klappt dann mittlerweile auch.

Edit2: Ich habe überhaupt keinen Mehraufwandung, wenn ich die auf der CPU berechneten Dinge weiterleite... dann bleibt nur noch die theoretische Frage der Berechnung, da mich das jetzt trotzdem noch interessiert.
Antworten