Hallo, habe eine eher mathematische Frage, wie genau die Transformationen für das Shadowmapping funktioniert. Dazu erstmal eine Skizze der nötigen Transformationen:
Das ganze soll zunächst möglich allgemein gehalten werden, damit ich mir später verschiedene Schattenprojektionen definieren kann. Zunächst definiere ich mir ein paar Matrizen: MC - Modelviewmatrix für die Kamera PC - Projektionsmatrix für die Kamera ML - Modelviewmatrix für das Licht PL - Projektionsmatrix für das Licht
Für den grünen Pfeil (Skizze) ergibt sich durch ablaufen der Pfeile folgene Matrix T: T*MC=PL*ML --> T=PL*ML*inv(MC)
In meinen Shader bekomme ich ja zunächst mittels gl_Vertex die Koordinaten aus dem Objectspace. Will ich nun die Szene aus Sicht des Lichts zeichnen muss ich folgendes rechnen: gl_Position = PL*ML*gl_Vertex; Um die Szene aus sicht der Kamera zu zeichnen muss ich gl_Position = PC*MC*gl_Vertex;
Um nun einen Tiefentest (Schattentest) durchführen zu können muss ich zunächst beim Rendern der Kamera meine Texturkoordinaten in die Light´s Clip Space Transformieren. Logisch. Jetzt habe ich folgende Transformation gefunden: T*gl_Vertex = PL*ML*inv(MC) *gl_Vertex ; (Also grünen Pfeil abgehen) Ist das nicht falsch??? Müsste ich nicht gl_Vertex erst vom ObjectSpace in den Cameras Eyedspace Transformieren,also
PL*ML*inv(MC) *MC*gl_Vertex=PL*ML*gl_Vertex.
Die Modelviewmatrix der Kamera MC fällt somit bei der Trafo komplett weg. Das find ich iwie unlogisch, da ich nun keine Information der Vertexposition aus sich der Kamera für den Tiefenvergleich weiter gebe????
Iwie hab ich da wohl noch einen kleinen Denkfehler drinne?
Iwie hab ich da wohl noch einen kleinen Denkfehler drinne?
Für die Tatsache ob irgendwo Schatten ist oder nicht ist es unerheblich wo sich der Betrachter befindet (*). Ist so ähnlich wie die Frage ob das Licht im Kühlschrank auch an ist wenn du nicht hinschaust.
Ich würde sagen
Code:
PL*ML*gl_Vertex.
ist richtig.
(*) Unter der hier zutreffenden Annahme das der Betrachter selbst keinen Schatten wirft
Ok, also wir sind also beim Rendern aus Kamerasicht: Um nun den Tiefenwert aus dem vorherigen Rendervorgang zu bekommen, brauch ich logischerweise die st-Texturkoordinaten der Shadowmap. Ich jag mein Vertex also erstmal durch die Lichttransformationen, also st = PL*ML*gl_Vertex
(ok ich weiß hier muss man noch den unterschied zwischen den Bereichen [-1,1] und [0,1] beachten. Lassen wir das der einfachheithalber mal weg).
Um den Tiefenwert jetzt aus Kamerasicht zu bekommen, jag ich mein gl_Vertex durch meine ModelviewProjectionMatrix der Kamera, also gl_Position = PC*MC*gl_Vertex; Nun les ich ein zweites mal den Tiefenwert aus, und kann diese Vergleichen. Ist das nun so korrekt?
Nun les ich ein zweites mal den Tiefenwert aus, und kann diese Vergleichen. Ist das nun so korrekt?
Wozu brauchst du den Tiefenwert aus Kamera-Sicht? Nochmal: Der Schatten ist unabhängig von der Kamera.
Das Vorgehen müsste etwa so sein, hab sowas aber noch nie selbst implementiert:
Code:
// Vertexshader uniform vec4 position; uniform mat4 mvpLight; // = T * PL * ML (wobei T eine Matrix ist die xyz vom Raum -1..1 nach 0...1 transformiert)
void main() { // shadow2DProj hat die notwendige Division durch w und den Tiefenvergleich schon eingebaut! // Es wird entweder 0.0 oder 1.0 zurückgegeben. bool shadow = (shadow2DProj(shadowmap, position).r < 0.5); if (shadow) { // ...kein Licht... } else { // ...Licht... } }
Damit shadow2DProj korrekt funktioniert muss für die Shadowmap-Textur folgendes gesetzt sein:
Code:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE); // muss gesetzt werden, Default ist GL_NONE glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE); // Default-Wert glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL); // Default-Wert
Um den Tiefenwert jetzt aus Kamerasicht zu bekommen, jag ich mein gl_Vertex durch meine ModelviewProjectionMatrix der Kamera, also
meine ich folgendes:
Ich brauche den Abstand des Vertex zur Lichtquelle nach der Kameratafo (natürlich in einer vergleichbaren "Tiefenwert"-Skalierung und nicht in "Weltkoordinaten"). Ich muss ja vergleichen, ob der Tiefenwert aus der Shadowmap größer oder kleiner ist als Abstand Vertex zur Lichtquelle "Sicht der Kamera" . (Auch etwas komisch ausgedrückt, ich hoffe es kommt jetzt rüber, was ich meine)
Somit kann ich den Vergleich shadow2DProj "manuell" durchführen. Will die Rechnungen soweit wie möglich selbst programmieren.
Danke für die Hilfe
Übrigens: Testweise lasse ich meine Tiefenmap auf ein Quad rendern. Das sieht soweit gut aus. Wenn ich allerdings glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE); auf die Tiefentextur anwende, wird diese nur noch weiß dargestellt.... Sollte mich das beunruhigen?
Zuletzt geändert von simon1988 am Do Sep 09, 2010 11:22, insgesamt 1-mal geändert.
Ich muss ja vergleichen, ob Abstand Vertex-Lichtquelle aus Sicht der Lichtquelle oder aus "Sicht der Kamera" näher ist.
Also ich würde sagen beim Shadow-Mapping vergleicht man den Tiefenwert (aus Sicht der Lichtquelle) mit dem Tiefenwert in der ShadowMap. Die ShadowMap enthält dabei die Tiefenwerte der am nächsten zur Lichtquelle gelegenen Objekte, alles was dahinter liegt befindet sich im Schatten. Vielleicht verstehe ich aber auch nicht was du mir sagen willst, machst du vielleicht noch etwas anderes außer purem Shadow-Mapping? Etwa PerspectiveShadowMaps (PSM), da ist die Kamera nämlich wohl relevant?
Zitat:
Somit kann ich den Vergleich shadow2DProj "manuell" durchführen. Will die Rechnungen soweit wie möglich selbst programmieren.
Hm, gut wie du willst, aber soviel passiert da nicht:
Damit shadow2D den Tiefenvergleich nicht selbst ausführt (und projected.z ignoriert) muss der TextureCompareMode auf GL_NONE stehen, was der Default-Wert ist. shadow2D liefert dann einfach den Tiefenwert an der entsprechenden Stelle.
Mitglieder in diesem Forum: 0 Mitglieder und 14 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.