irgendwie muss es da doch noch ne andere möglichkeit geben? Kann mir nicht vorstellen das die anderen für jede Lichtquelle die Szene neu rendern.. Hab da schon sachen gesehen wo 100 Lampen mit Schatten & Co total flüssig liefen.. Hab ich denn im Shader nicht irgendwie zugriff auf den aktuellen Tiefenpuffer? Wenn ich nur auf die Fragmente Projeziere, welche am nähsten dran sind dann hätt ich doch schon meinen schatten..
Hab ich denn im Shader nicht irgendwie zugriff auf den aktuellen Tiefenpuffer?
Du brauchst den Tiefenbuffer aus Perspektive der Lichtquelle, nicht aus Perspektive der Kamera! Der Tiefenbuffer der Kamera nutzt dir gar nichts.
Möglichkeiten: 1. Wenn du die ShadowMaps renderst interessiert nur die Tiefeninformation. Hier wird also nur die pure Geometrie gerendert, kein Licht, keine Texturen usw. Das ist üblicherweise recht schnell. 2. Ggf. reicht es die ShadowMap nur alle paar Frames zu aktualisieren. Wenn du 10 Lampen hast aktualisierst zu dann in jedem Frame nur 2 der ShadowMaps. 3. Wenn die Szene eine einfache Geometrie hat oder sie durch einfache Geometrie approximiert werden kann, kannst du etwas wie in meinem Kegelvolumenschatten-Shader versuchen, siehe Shadersammlung. D.h. einfach im Fragmentshader berechnen ob ein Objekt den Strahl zwischen Lichtquelle und Fragment stört. Geht aber nur bei einfacher Geometrie, du kannst unmöglich im Fragmentshader für jedes Fragment alle Dreiecke in der Szene testen.
4. Wenn sich nix (relevantes) bewegt hat, brauchst du die Shadowmaps auch gar nicht neu zeichnen. Wenn sich aber deine Lichter Bewegen, geht das natürlich nicht. Bei translationen zumindest. Bei Rotationen kann man ggf immer noch die alte ShadowMap verwenden, wenn man da zB eine CubeMap verwendet. (Also, bei Spotlights. bei unendlich weit entfernten Lichtquellen ists wenn schon umgekehrt.) Wenn sich aber in deiner Szene auch noch irgendwas bewegt, ist das mit den CubeMaps wieder eher kontraproduktiv.
5. Unter Umständen brauchen die ShadowMaps keine allzu hohe Auflösung. Geringe Auflösung spart bekanntlich Füllrate. Zu geringe Auflösung macht dann aber Aliasing, also auch nicht übertreiben. Ich will damit nur sagen, die ShadowMaps müssen nicht grad 8192x8192 sein
Das mit den CubeMaps stimmt natürlich. Sofern die Szene abgesehen von den Lichtquellen komplett statisch ist brauchst du die CubeMaps nur einmal generieren oder kannst sie sogar direkt aus einer Datei laden.
Also rel. statisch ist bei mir nur die Szene, aber auch die kann verändert werden.. Aktuell schiebe ich ja schon für jeden Projektor eine Textur in den Shader, nämlich die die projeziert werden soll. Kann ich nicht diese irgendwie vorher schon entsprechend verändern? Ansonsten müsst ich ja dann nochmal für jede Lampe noch eine Textur in den Shader bringen.. Da gehen mir aber meine TMUs aus... Obwohl ich gelesen hab das ich schon auf durchschnittlichen Rechnern mit 16 TMUs rechnen kann.. Aktuell nutze ich 8.
Meine Shadowmap müsste ja nicht größer sein als die zu projeziernde Lichttextur.. D
Du kannst die Projektionstextur in die ShadowMap integrieren. Du musst ja nur die Z-Werte in der ShadowMap so nahe wie möglich an die Lichtquelle setzen da die Textur undurchsichtig sein soll.
nochmal kurz zurück zu der Projektion auf den "Rückseiten". Eigentlich sollte es doch auch so funktionieren, das nur auf flächen welche dem projektor zugewannt sind projeziert wird oder?
ne, jetzt wird nur nicht mehr auf die Rückseiten der Flächen projeziert.. Aber habe ich z.B. einen Würfel wo von hinten ein Licht gegenscheint, sehe ich auch an der Vorderseite die projektion..
ich denke vielleicht stimmt die Lichtposition nicht richtig. Ich habe ja die Texturmatrix welche ja aus sicht der Lichtquelle erstellt wurde. Krieg ich da nicht irgendwie den Vektor der lampe?
Denn hauts hin.. Aber wenn ich die Positionen über unform übergebe stimmt der Vektor irgendwie nich, bzw ändert sich die Berechnung abhängig von der Camera..
supi jetzt hauts hin.. hab mit der ModelMatrix multipliziert... Das einzige was mit jetzt auflällt ist das hier physikalisch was nicht stimmt... Ich glaube sogar das das bei den OGL lichtern genauso ist.. Also um die selbstbeschattung hinzubekommen multipliziere ich mit dem Labertterm (dot(Light, Normal)). Sieht auch super aus, doch je näher meine Lichtquelle an eine fläche kommt desto dunkler wirds.. aber eigentlich müsst es, da ich noch keine lichtabnahme implementiert habe, gleich bleiben..
Mitglieder in diesem Forum: Google [Bot] und 7 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.