ich bin mal wieder am Optimieren... Es geht um das Einschränken meines Deferred Beleuchtungsshaders für Spotlights. Aktuell konnte ich den soweit einschränken das nur Pixel innerhalb des Lichtkegels gerendert werden. Dazu habe ich einfach vor dem FullscreenQuad den Lichtkegel mit Tiefentest gerendert, somit wurden hier alle Fragmente die nicht im Kegel sind weggeworfen. Dies brachte schon einiges an Performance. Doch mein Gefühl sagt mir das da noch viel mehr drin ist.
Betrachtet man sich die Üblichen Szenen: Eine Lampe die an einer Truss hängt und und 5m unter ihr der Boden. Hier wird nun der komplette Bereich (im Kegel) zwischen Lampe und Boden berechnet, obwohl sich dort kein Objekt befindet. Wirklich sinnvoll wäre es, nur die Bereiche die vom Kegel geschnitten werden zu berechnen.
Hier eine Illustration von Lichtkegel und Massiven Objekten.
Dateianhang:
light1.PNG
Und hier die Bereiche die eigentlich nur durch den Shader dürften:
Dateianhang:
Light2.PNG
Bekommt man sowas irgendwie mit dem Tiefentest oder Stencil hin? Mit Stencil konnt ich noch nciht viel machen, da ich es bis heute nicht geschafft habe einen StencilBuffer an ein FBO zu hängen...
Grüße Thomas
PS: Ich hatte sowas schonmal angesprochen siehe: viewtopic.php?f=2&t=10323 Allerdings hier nun bisschen konkreter
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Bin mir da nicht so sicher ob da noch so viel mehr geht. Eventuell könntest du sowas bei statischen Lichtern auf der CPU machen, da größtenteils CSG....
Der Stenciltest nützt dir übrigens in diesen Falle fast nix da er nach den Fragment-OPs kommt.
Nun Statische Lichter hab ich nicht wirklich.. Nun irgendwie muss das doch was bringen, denn der Tiefentest kommt auch nach dem FragmentShader.. Lediglich EarlyZ kommt davor, doch den hab ich Testweise mal ausgehebelt in dem ich im Vertex Shader gl_Position.z *= 0.99999; gemacht habe.. doch da hat sich nix an der FPS geändert.
Also CSG-Ops sind nicht wirklich sinnvoll bei dynamischen Lichtern. Du hast wahrscheinlich das Licht schneller berechnet bevor du auch nur das nötige Schnittmengen-Mesh berechnet hast.
Also man könnte zwar theoretisch den Z-Buffer einsetzen. Schau dir dazu mal "Depth-Peeling" an. Das Problem ist das dies aufwendig ist, weil du mehrere Passes pro Lampe bräuchtest. Außerdem wird trotzdem jeder Pixel des Lichtkegels verarbeitet, also Fillrate spart das auch nicht.
Das sinnvollste was du machen kannst (*) ist die Lichtkegel ganz normal in die Szene zu rendern und den normalen Z-Test sowie Backface-Culling zu verwenden. So sparst du immerhin dann Fillrate, wenn der Lichtkegel etwa irgendwo im Boden steckt oder ähnliches.
(*) jedenfalls fällt mir für dynamische Lichtkegel nichts besseres ein
Mitglieder in diesem Forum: Bing [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.