in meiner Beleuchtungsengine habe ich mehrere bewegende Spots. Da sie sich immer Bewegen nutze ich Parabolide ShadowMaps und nutze nur immer den jeweiligen Ausschnitt, somit muss nicht bei jeder Bewegung die ShadowMap neugerendert werden. Das funktioniert auch super. Problem ist nur der Speicherverbrauch... Damit die Schatten rel. ordentlich aussehen muss ich schon min. 512x512 Maps bauen. Doch bei 100 Lampen summiert sich das.. Da man ja eine komprimierten Texturen im FBO verwenden kann (schade eigentlich, gibts eine möglichkeit diese nach dem Erstellen der Shadowmap zu komprimieren?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Thmfrnk hat geschrieben:
Da man ja eine komprimierten Texturen im FBO verwenden kann (schade eigentlich, gibts eine möglichkeit diese nach dem Erstellen der Shadowmap zu komprimieren?
Da fehlt mindestens eine Klammer zu. Fehlt da auch ein „k“? So ergibt der Satz für mich nicht viel Sinn, aber ich bin mir nicht sicher .
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Ich vermute du spielst hier auf "S3TC hardware texture compression" an. Richtig, dies ist mit einem FBO direkt nicht möglich, allerdings kannst du diese Kompression vergleichsweise leicht im Shader implementieren. Das benötigt aber auf jeden Fall einen extra Pass und ordentlich Rechenzeit. Das Hauptproblem wird hier aber sein das die komprimierten Texturformate nicht für Tiefenbuffer-Daten auslegt sind. Es gibt nur RGB und RGBA-Formate wenn ich da richtig informiert bin. Du würdest hier deinen 24bit Z-Buffer effektiv auf 5bit reduzieren....und selbst da hast du noch Kompressionsartefakte. Farben (8bit pro Kanal) sind da einfach viel weniger anfällig als Tiefendaten. Ggf. kann man da etwas tricksen in dem man den Tiefenwert auf die drei Farbkanäle verteilt, aber die Kompression wird da vermutlich massive Artefakte erzeugen. => Wenn du eine Shadow-Map komprimieren möchtest, reduzieren die Auflösung. Damit dürfte sich eine bessere Qualität bei gleichem Speicherbedarf erreichen lassen.
Zitat:
Doch bei 100 Lampen summiert sich das..
Kannst du nicht die Reihenfolge ändern? Also sagen wir für 10 Lampen die Shadow-Maps erzeugen, Szene damit rendern, dann die nächsten 10 Lampen. Du wirst die 100 Shadow-Maps ja sicher sowieso nicht alle in einem einzigen Pass benötigen sondern in mehreren Durchgängen. Also speichere deine Szene zwischen, nicht die Shadow-Maps.
Edit, noch eine Idee: Wenn das mit der Reihenfolge nicht machbar ist, theoretisch kannst du die Shadow-Map im Screenspace auf "Schatten/kein Schatten" also 0/1 reduzieren. Die eigentliche Tiefeninfo interessiert nicht, oder? Dazu betrachtest du die Szene aus Perspektive der Kamera (ganz normal wie sonst auch) und kannst sogar 8 Pixel in einen komprimieren. Das gibt eine deutlich bessere Kompression, ohne Qualitätsverlust. Wenn du PCF oder ähnliches anwendest könnte es möglicherweise Probleme geben, habe gerade nicht mehr im Kopf wie PCF nochmal funktionierte....
nun ich rendere ja extra Parabolide Schatten damit ich die szene nicht bei jeder Bewegung neu rendern muss... Szene hat rund 1mio Polygone.. Wenn ich da permanend die Schatten neu rendere gehts massig auf die Performance. Daher bleibt mir nix anderes übrig als pro Lampe auch dessen ShadowMap zu speichern. Ich hatte auch schon normales Shadowmapping + FrustumCulling etc.. dennoch waren hier aufgrund der permanenten Berechnung der Shadowmap nicht mehr als rund 50 Lichter möglich.. Mit der aktuellen technik krieg ich sogar mehr als 100 hin.. wenn da nicht das GRAM Problem wäre.
Nun die ShadowMap auf 0/1 zu reduzieren hört sich interessant an aber ich denke das ist nicht machbar.. ich weiß doch zum Zeitpunkt wo die Shadowmap gerendert wird nicht wo sich die Camera befindet?! Für Shadowmapping muss man doch die Tiefe aus Camera und Lampensicht checken.. Mir würde jetzt nicht einfallen wie ich da eine Schatten/KeinSchatten map so erzeugen sollte..
Nun ein weiterer Pass wäre jetzt nicht so fatal.. auch 1-2 Sek rechenzeit zum erzeugen aller Maps wären kein Problem.. Diese müssen ja nur dann erzeugt werden wenn sich was an der Szene ändert.
Zitat:
=> Wenn du eine Shadow-Map komprimieren möchtest, reduzieren die Auflösung. Damit dürfte sich eine bessere Qualität bei gleichem Speicherbedarf erreichen lassen.
versteh ich nich... Welche Auflösung??
Kann mir nicht vorstellen das die Kompression so lange dauert...
Nun die ShadowMap auf 0/1 zu reduzieren hört sich interessant an aber ich denke das ist nicht machbar.. ich weiß doch zum Zeitpunkt wo die Shadowmap gerendert wird nicht wo sich die Camera befindet?! Für Shadowmapping muss man doch die Tiefe aus Camera und Lampensicht checken.. Mir würde jetzt nicht einfallen wie ich da eine Schatten/KeinSchatten map so erzeugen sollte..
Ja, das tut nur wenn du das jedes Frame machen würdest.
Zitat:
versteh ich nich... Welche Auflösung??
Du schriebst oben irgendwas von 512x512 ShadowMap-Auflösung.....das auf 256 reduzieren. Das wird besser aussehen als komprimierte 512x512....eben weil die Kompression für Farben und nicht für Tiefendaten gedacht ist. Selbst mit Normalmaps kann das grauenhaft aussehen.
Zitat:
Kann mir nicht vorstellen das die Kompression so lange dauert...
Der Algorithmus ist nur wenig besser als BruteForce...der probiert quasi alle Möglichkeiten für jeden 4x4-Pixelbereich durch.
ja aber 256x256 sieht dann schon extrem scheiße aus.. Da steckt ja die komplette Szene drin.. Gibt es denn keine Verlustfreie Kompression? Mhh sonst fällt mir eigentlich nix mehr ein...
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Es gibt keine Verlustfreie Kompression, für GPU, die sind Entweder Ineffizient, zu teuer in Hardware oder zu langsam. Die Kompression von alle verfügbaren Hardwareformaten ist auch bis jetzt nicht in Echtzeit, mit ausreichender Qualität(die verfügbaren Varianten sind echt nicht schön), machbar. Prinzipiell ist alles, was mit Transparenz oder feinen Farbübergängen zu tun hat nicht für Kompression geeignet. Eigentlich ist es auch nicht üblich 100 Schatten zu zeichnen, schon eher ein Global Light und die n wichtigsten Lichtquellen in deinem Bild. Techniken wie Lightprobes, Lightmaps, Ambient Occlusion und dynamik Ambient Occlusion skalieren wesentlich besser und werden eingesetzt, damit man nicht so stark merkt, dass nicht jede Lichtquelle Schatten wirft.
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Nun, theoretisch könntest du deine ShadowMaps auch in den Hauptspeicher auslagern. Dort wird ja sicher noch Platz sein.
Kannst du mal berechnen wie viel Platz du für deine ShadowMaps überhaupt brauchst? Also bei 512x512 * 24bit * 100 komme ich auf gerade mal 75 Mb. Was benutzt du den für eine Grafikkarte? Bei den heute üblichen > 1 GB Grafikspeicher sollte das doch machbar sein?
Noch eine Idee: Kannst du nicht abhängig von der Entfernung der Lichtquelle zur Kamera eine niedrigere ShadowMap-Auflösung wählen? Die werden ja wohl nicht alle im Vordergrund sein.
Mitglieder in diesem Forum: Bing [Bot] und 11 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.