Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Mai 28, 2024 20:38

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Sep 08, 2010 11:53 
Offline
DGL Member

Registriert: Mi Mär 08, 2006 17:38
Beiträge: 153
Wohnort: Rümmelsheim (bei Bingen)
Hallo,
habe eine eher mathematische Frage, wie genau die Transformationen für das Shadowmapping funktioniert. Dazu erstmal eine Skizze der nötigen Transformationen:
Bild
Quelle: http://www.uni-koblenz.de/~cg/Studienarbeiten/ShadowMappingNicoHempe.pdf

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?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 08, 2010 12:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
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 ;)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 08, 2010 15:13 
Offline
DGL Member

Registriert: Mi Mär 08, 2006 17:38
Beiträge: 153
Wohnort: Rümmelsheim (bei Bingen)
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?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 08, 2010 16:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
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() {
   position = mvpLight * gl_Vertex;
   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

   // ...   
}


Code:
// Fragmentshader
uniform sampler2DShadow shadowmap;
uniform vec4 position;

// ...

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

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Sep 09, 2010 11:00 
Offline
DGL Member

Registriert: Mi Mär 08, 2006 17:38
Beiträge: 153
Wohnort: Rümmelsheim (bei Bingen)
oh ich habe mich etwas schlecht ausgedrückt. Mit
Zitat:
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.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Sep 09, 2010 11:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
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:
Code:
vec3 projected = position.xyz / position.w;
float depth = shadow2D(shadowmap, projected).r;
if (projected.z > depth) {
      // ...Schatten...
} else {
      // ...Licht...
}

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.
Code:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » Mathematik-Forum


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.025s | 15 Queries | GZIP : On ]