DGL https://delphigl.com/forum/ |
|
Gebundener Shader + Matrixmanipulation https://delphigl.com/forum/viewtopic.php?f=20&t=8316 |
Seite 1 von 1 |
Autor: | littleDave [ Mo Mär 30, 2009 22:30 ] |
Betreff des Beitrags: | Gebundener Shader + Matrixmanipulation |
Ich hab da mal gerade ne Frage: ich bastel gerade an einem Shadow-Mapping-Test + GLSL. Um etwas dynamik rein zu bringen, manipuliere ich beim Rendern ein Teil der Szene mit glTranslate. Jetzt mach ich es so, dass ich den Shader binde und dann die Szene zeichne. Während dem Zeichnen wird das glTranslate dann angewendet - also der Shader bleibt gebunden. Wenn ich die Shadow-Map jetzt mit der Fixed-Function-Pipeline rendere, werden die Schatten korrekt auf die Objekte projeziert - auch auf die bewegten. Wenn ich jetzt den Shader benutze, wird die Shadow-Textur nur korrekt projeziert, wenn ich die Szene nicht mit glTranslate ändere. Ändere ich die Position einzelner Polygone, wird die Shadow-Map so draufprojeziert als ob die ModelView-Matrix nicht geändert wurde. Die Polygone, die ich nicht bewegt habe, werfen die Schatten korrekt. Die Schatten der bewegten Objekte sind auch korrekt - nur die Schatten AUF den bewegten Objekten sind falsch. Jetzt ist die Frage: muss ich den Shader nochmal neu binden, wenn ich die ModelView-Matrix ändere oder mach ich irgendwas falsch? Grüße |
Autor: | damadmax [ Di Mär 31, 2009 08:55 ] |
Betreff des Beitrags: | |
Hast du noch irgendwelche Variablen, die an den Shader übergeben werden? Wann hast du die Shadowmap erstellt? Ist dabei das glTranslate auch berücksichtigt? |
Autor: | Sellmann [ Di Mär 31, 2009 14:46 ] |
Betreff des Beitrags: | |
wenn du mit einem shader shadowmapping realisieren willst, dann darfst du die shadowmap erst erstellen, wenn ale schattenwerfenden Objekte an ihrem Ort stehen, von dem sie aus betrachtet werden sollen! Ein Objekt kann in der realität ja auch nicht während die Lichtstrahlen der Sonne den Schatten produzieren einfach davon rennen und den Schatten einfach zurücklassen. Du musst dir vorstellen, dass in der Tiefentextur der Zustand aller Objekte zu genau diesem zeitpunkt gespeichert ist. veränderst du die Position zu einem anderen Zeitpunkt eines Objektes musst du die Textur mit aktualisieren, da die Tiefen in der textur jetzt nicht mehr zur Szene passen. Also entweder aktualisieren, oder mit dem Schatten zeichen abwarten bis alles so steht wie es soll. |
Autor: | littleDave [ Di Mär 31, 2009 17:52 ] |
Betreff des Beitrags: | |
Also die Schattentextur ist ansich korrekt - sonst würde die fixed-pipeline-methode nicht funktionieren. Es ist sehr schwer, das Phenomen zu beschreiben, daher hab ich mal meine Demo hochgeladen. Der Download ist hier. Am besten seht ihr das Problem, wenn ihr das Licht im Rendermodus 1 mit der Maus an eine Stelle positioniert und euch dann auf die bewegten Würfel achtet. Wenn ihr dann in den Fixed-Function-Pfad wechselt, funktioniert das alles. Das einzige was bei diesem Renderpfad anders ist, dass der Shader gebunden wird - sonst nichts. Worauf ihr auch noch achten solltet sind die Schatten an der hinteren Wand - die sind nähmlich korrekt ![]() Controls: 1: Rendermodus 1 2: Rendermodus 2 3: Rendermodus 3 F1: Spotlight-Textur vergrößern F2: Spotlight-Textur verkleinern P: Bewegung pausen / fortsetzen 5: Shader-Renderpfad aktivieren 6: Fixed-Function-Renderpfad aktivieren W, S, A, D: Licht bewegen (im Rendermodus 1) Maus: Licht bewegen (im Rendermodus 1) Links/Rechts: Kamera rotieren |
Autor: | Sellmann [ Di Mär 31, 2009 19:12 ] |
Betreff des Beitrags: | |
okay, ich hbas mir mal angesehen und mir sind einige kleinigkeiten aufgefallen: 1. Es ist zu 100% offensichtlich, dass deine TiefenTextur im shader falsch auf die szene gemapped wird, um genau zu sein mapped der Shader die Tiefentextur so auf die Würfel, als würden sie immer im Zentrum stehen. Lösung ist wie gesagt, wenn du erst verschiebst und dann die Textur erstellst, ob du nu willst oder nicht. Dass es in der Fixed Function Pipeline funktioniert, kann daran liegen, das die Texturkoordinaten dort evtl. mit verschoben werden und das in die Shader variante nicht der Fall ist. wenn du also unbedingt deine Tiefentextur zuerst erstellen willst, dann musst du hinterher anhand der modelviewmatrix die neuen Koordinaten berechnen und ich wette, dass es blödsinn ist, das so zu machen, wenn man es auch einfacher haben kann in dem man die Reihenfolge ändert. Deinen Code konnte ich natürlich nicht einsehen, daher weiß ich nu auch nicht was man da evtl. noch alles probieren könnte. 2. dein Licht wirft den Spot auch in die negative Richtung. Edit: Ich möchte nur anmerken, das ich noch nie selbst nen Schattenalgo ausprobiert habe, aber mich trotzdem schon viel damit auseinander gesetzt habe |
Autor: | littleDave [ Di Mär 31, 2009 20:39 ] |
Betreff des Beitrags: | |
Erstmal danke für deine Mühe ![]() Also die Szene wird genau so in den Tiefenpuffer und somit auch in die Tiefentextur gerendert, wie sie auch gezeichnet wird. Das kann man daran sehen, dass an der hinteren Wand der Schatten korrekt ist. -> Ich zeichne die Szene erst komplett und kopier den Inhalt danach erst in die Textur, also wenn alles fertig ist. Die Transformation der Würfel wird auch im Depth-Pass vorgenommen. Beim zweiten und letzten Renderdurchgang binde ich dann die Depth-Texture und rendere die Szene in der gleichen Reihenfolge wie vorher beim Tiefen-Pass. Ich hab auch schon probiert, den glTexGen-Methoden weg zu lassen - ohne erfolg. Kann es sein, dass die VBOs, die ich benutze, da Probleme machen? Immerhin nimmt er immer die Vertex-Positionen, die auch im VBO sind. Das klingt zwar sehr utopisch, jedoch würde das die Mapping-Probleme erklären. |
Autor: | littleDave [ Mi Apr 01, 2009 18:06 ] |
Betreff des Beitrags: | |
Ich habs endlich geschafft!!! ![]() Ich übergeb jetzt an den Shader die aktuelle Transformations-Matrix und berechne dann die Shadow-Map-Position. Hier hab ich noch zwei Screenshots hochgeladen. Danke für eure Antworten, die haben mich auf die richtige Spur gebracht. |
Autor: | Sellmann [ Mi Apr 01, 2009 20:14 ] |
Betreff des Beitrags: | |
wow, sieht echt klasse aus, auch wenn ich kein Fan von Blooming bin, find ich es echt Klasse. |
Seite 1 von 1 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |