Was ist eine Schattenkarte? Eine Schattenkarte ist eine Textur, deren Texel eine einfache Frage beantworten: In welcher Entfernung vom Licht, entlang der durch das Texel dargestellten Richtung, ist das Licht verdeckt? Texturkoordinaten werden unter Verwendung verschiedener projektiver Texturierungsmittel erzeugt, abhängig von dem speziellen Schattenabbildungsalgorithmus.
Projektive Texturierung ist einfach eine Möglichkeit, ein Objekt in den Raum der Textur zu verwandeln (und ja, ich weiß, das klingt rückwärts. Aber so funktioniert es). Shadow-Mapping-Algorithmen verwenden verschiedene Arten von Transformationen. Aber letztendlich sind dies nur Transformationen von einem Raum in einen anderen.
Beim Rendern der Schattenkarte nehmen Sie die Scheitelpunkte Ihrer Geometrie und transformieren sie durch eine Standard-Rendering-Pipeline. Die Kamera- und Projektionsmatrizen sind jedoch für Ihre Lichtposition und -richtung ausgelegt, nicht für die Ansichtsposition und -ausrichtung.
Wenn Sie mit einer Schattenkarte vorwärts rendern, rendern Sie das Objekt wie gewohnt und transformieren die Scheitelpunkte in den Ansichtskameraraum und durch die Betrachtungsprojektionsmatrix. Sie transformieren die Scheitelpunkte jedoch auch durch Ihre Lichtkamera- und Projektionsmatrizen und übergeben sie als Scheitelpunktdaten an den Fragment-Shader. Sie werden über eine projektive Texturierung verwendet, um auf die Schattentextur zuzugreifen.
Hier ist der wichtige Punkt. Der projektive Texturzugriff ist so konzipiert, dass die Position, auf die auf die Textur zugegriffen wird, die Richtung zwischen diesem Punkt auf der Oberfläche (dem Punkt, den Sie im Fragment-Shader rendern) und dem Licht darstellt. Daher wird das Texel abgerufen, das die Tiefe darstellt, in der die Okklusion für das gerenderte Fragment erfolgt.
Aber diese Pipeline hat nichts Besonderes . Sie müssen die Scheitelpunktpositionen nicht in die Schattentextur umwandeln und diese an den Fragment-Shader übergeben. Sie können die Scheitelpunktpositionen des Weltraums an den Fragment-Shader übergeben und dann vom Fragment-Shader in den projektiven Raum der Schattentextur umwandeln lassen. Zugegeben, Sie würden viel Leistung wegwerfen, da Sie genau die gleichen Texturkoordinaten erhalten. Aber es ist mathematisch machbar.
In der Tat können Sie die Scheitelpunktpositionen des Ansichtskameraraums an den Fragment-Shader übergeben. Es könnte sie dann in eine Welt verwandeln, dann in einen hellen Kameraraum, dann in den projektiven Schattentexturraum. Sie können all diese Transformationen in einer Matrix zusammenfassen (abhängig von Ihrem Schattenprojektionsalgorithmus). Auch dies gibt Ihnen genau das, was Sie zuvor hatten. Wenn Sie also vorwärts rendern, gibt es keinen Grund, dies zu tun.
Beim verzögerten Rendern haben Sie jedoch bereits die Scheitelpunktpositionen des Ansichtskameraraums. Sie müssen, sonst können Sie nicht beleuchten. Sie haben entweder viel Speicher und Bandbreite verschwendet, indem Sie sie in einen Puffer geschrieben haben, oder Sie waren schlau und haben sie mithilfe des Tiefenpuffers und verschiedener mathematischer Berechnungen neu berechnet (auf die ich hier nicht näher eingehen werde, die aber online behandelt werden).
In beiden Fällen können Sie die Positionen des Kameraraums anzeigen. Und wie oben erwähnt, können wir eine Matrix anwenden, um sie vom Ansichtskameraraum in einen schattenprojektiven Texturraum umzuwandeln. Also ... mach das. Greifen Sie dann auf Ihre Schattenkarte zu.
Problem gelöst.