Registriert: Di Aug 09, 2011 07:33 Beiträge: 163
Programmiersprache: C/C++
Hallo,
Beim Cascaded Shadowmapping ist mir aufgefallen, dass dort mehrere Shadow Maps benutzt werden. Wobei eine Shadow Map einen nahen Bereich um die Kamera herum erfässt, die nächste einen größeren usw. (je nachdem wie viele Shadowmaps man nutzt).
Ich wollte das auch mal probieren und habe daher 2 FBO's, wo jeweils eine Depth-Texture enthalten ist. Einmal ist der FOV vom Lichtpunkt 10, bei der anderen Texture 30. Lass ich mir nun beide Texturen ausgeben, so habe ich leider das Problem, dass die Texture mit dem größeren FOV Wert auch im Gebiet der "guten" Texture ist. Optimal wäre jedoch, wenn die "schlechtere" Textur erst dann anfängt, wenn die gute endet. Die Frage ist bloß wie?
Das Problem lässt sich einigermaßen lösen, wenn man bei der Biasmatrix Wert #13 von 0.5 auf ca. 0.5002 erhöht (Array [0..15]), ist allerdings eher eine Notlösung und verursacht dadurch auch andere Probleme. Habe mir schon einen Code zum Cascaded Shadowmapping angeschaut, konnte aber nicht wirklich erkennen, wie das dort gelöst wird. Hoffe mal mir kann jemand weiterhelfen.
Im Anhang nochmal was ich meine + meiner "Lösung" mit der Biasmatrix. Die rote Linie makiert den Übergang zur anderen Depthmap.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Also ich würde sagen, entweder man schreibt sich einen Shader der abhängig von der Tiefe des Pixels die jeweilige Shadowmap verwendet oder man rendert die Szene in mehreren Durchgängen und beschränkt mit Clipplanes den Bereich auf den Teil der von der jeweiligen Shadowmap beeinflusst wird.
Die Tiefe, die ich meinte bezog sich eigentlich auf das zu schattierende Objekt. Also das wo der Schatten drauf fällt. Allgemein gesagt, müsstest du im Shader ausrechnen ob der aktuelle Pixel im Bereich von Shadowmap1 oder Shadowmap2 (oder auch noch mehr) liegt. Ich hab' das aber bisher nur mit Sonnenlicht gemacht was parallel scheint. Dabei habe ich 4 Shadowmaps so erstellt, dass sie immer einen bestimmten Teil vor der Kamera vollständig abdecken. Dann kann man einfach aus der Eyespace-z-Koordinate im Shader bestimmen welche Shadowmap gerade verwendet werden soll. Aber bei dir scheint das irgendwie anders zu sein. Im Zweifelsfall kannst du aber einfach aus den Worldspace-Koordinaten der Geometrie und der ModelViewProjection-Matrix die du für die Shadowmapgenerierung verwendet hast, die Koordinaten des Texels auf der Shadowmap bestimmen. Dann sieht man ja ob das eine gültige Position ist. Also die X-Koordinate müsste dann zwischen 0 und der Breite der Shadowmap liegen, für Y analog und Z müsste positiv sein, damit nichts auf der falschen Seite verwendet wird. Denke so müsste das funktionieren. Oder muss X zwischen 0 und 1 sein? Hm, naja weiß jetzt nicht, kannst du aber einfach ausprobieren. Jedenfalls kannst du dadurch bestimmen ob die erste Shadowmap verwendet werden kann/muss. Und wenn nicht überprüfst du einfach die zweite Shadowmap mit ihren Koordinaten usw.
Mitglieder in diesem Forum: 0 Mitglieder und 2 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.