ich hab da mal ne Verständnisfrage zu Deferred Shading. Also mit meiner jetzigen Methoder für meine Lichtprojektionen komm ich gerade bei Notebooks schnell an die Grenzen des machbaren, obwohl ich sogut wie jede Optimierungsmöglichkeit (Frustumculling etc..) ausgenutzt habe.. Doch bei ~40 Lampen is vorbei.. Ich brauch aber bis zu 100 Lampen... Hab schon viel über D.S. gehört daher denke ich das ich damit weiter komme..
Wenn ich das richtig Verstanden habe müsste ich so vorgehen:
1. Meine Szene in ein FBO mit 4 Rendertargets (16bit Floating Tex) folgend rendern:
a. Farbpuffer mit Ambientem Licht b. Die Normalen der Szene c. Die Positionen in x, y, z > r, g, b d. Die Tiefeninformation in z.b. r
Bei 16-Bit könnte ich doch die Tiefeninfos in den Alphawert schreiben oder?
2. Rendere ich meine Shadowmaps wie bisher a. Aus Sicht der Lichtquelle mit Frustum Culling etc..
3. Erzeuge wie bisher meine Texturmatrizen zur Projektion
4. Rendere ich für jede Lampe mein Offscreenquad mit einem Shader a. Dort berechne ich die Projektionskoordinaten nicht mehr im Vertexshader sondern je Fragment mit den Infos aus den Texturen aus Schritt 1
So stelle ich mir das im Groben vor.. Das müsste doch so funktionieren oder? Oder ist das doch komplizierter? Hat schon jemand sowas umgesetzt? Wie müssen da die Hardwareanforderungen sein? FBO is klar aber wie siehts mit den FP-Texturen aus?
Mal wieder Fragen über Fragen.. hoffe ihr könnt mir helfen.
Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
An den Punkten 1-3 hab ich nichts zu meckern bzw. nichts zu ergänzen. Bei Punkt 4 würde ich noch ergänzen, dass es reicht eine Bounding Box mit aktiviertem FrontFace-Culling, die die Lichtquelle einschliesst, zu zeichnen. Dann kommen die Fragmente ausserhalb der BoundingBox schon garnicht erst in die Verlosung In meinen bisherigen Versuchen damit hab ich festgestellt, dass man relativ früh entfernte Lichtquellen verwerfen kann. Das hängt natürlich auch stark von der Szene selbst ab.
_________________ Es werde Licht. glEnable(GL_LIGHTING); Und es ward Licht.
Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"
Kann meinem Vorposter nur zustimmen. Die Positions - Textur ist unnötig, weil du die Position ganz einfach durch die Tiefen - Textur und der ProjectionsMatrix berechnen kannst . Dadurch sparst du schonmal eine Textur. Du brauchst auch keine 16Bit, 8Bit tuns auch. Dafür muss auch die Normale entsprechend aufgeteilt werden. In meinem zuletzt erstellten Thread siehst du auch die umgesetzte Shader - Version: http://www.delphigl.com/forum/viewtopic.php?f=20&t=9735. Ich hab dir trotzdem nochmal die Shader - Dateien angehängt. Den MRT - Shader lässt du über den FrameBuffer mit der angehängten Color-, Normal-, und Depth - Textur laufen und den Deferred - Shader über ein bildschirmfüllendes Quad.
Dateianhang:
MRT.zip
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Also ich habe versucht das jetzt mal umzusatzten und bin auch rel schnell vorangekomme: NormalMap, Depth und Color werden korrekt gerendert. Doch am endresultat stimmt die projektion meiner lampen nicht mehr. Die leuchten überall hin aber nicht da wo sie sollen... Ich tippe mal auf einen falschen eyeVektor.. Die Shader für normal und color hab ich einfach übernommen.
uniform mat4 InvViewMat; uniform mat4 TexGenMat; //Texturprojektionsmatrix uniform vec4 LampColor; //Lichtfarbe und intensität uniform int GlobalLight; //gibt an ob globales Punktlicht verwendet werden soll uniform vec4 LightPos; //Lampenpositionen für evtl. weitere Berechnungen uniform float GlobalLightFactor; //Gibt an wie stark alle Lichter sind
Wie sieht dein Vertex - Shader aus? Wird das Quad nach deinen Geometrien direkt gerendert, ohne das dazwischen die glLoadIdentity() oder Ähnliches kommt?
Das Quad muss in der selben Model- und Projectionsmatrix wie deine restliche Geometrie sein, sonst funktioniert der Shader nicht. Also musst du nach dem
ja aber wenn ich die Offscreenquads in der gleichen Modelview-Matrix wie die der Szene rendere, dann ist doch das kein Füllendes Quad mehr, sondern es dreht sie mit der Kamera... Verstehe auch nicht anwelcher Stelle die ModelViewMatrix im Vertexshader interessant ist? Die InverseMatrix ist korrekt, da die Einstellungen mit meinem "NON-DeferredShader" funktionieren...
Wie hast du deine Texturen für den FBO konfiguriert?
Ohne mich jetzt großartig mit deferred shading auszukennen:
Wer zwingt dich, im Vertexshader die ModelViewProjection auf dein Fullscreenquad (*) anzuwenden? Die ist soweit ich weiß eher 1) für kleinere Lichtquellen, die du als Würfel, Ikosaeder, oder sonstwas zeichnest, damit nicht sinnloserweise für so viele Pixel der Wert 0.0 berechnet wird 2) damit du dir deine Positionsdaten berechnen kannst, falls du sie nicht speicherst 3) möglich, dass ich noch irgendwas vergessen hab, wofür du die brauchst
(*) ein Offscreenquad würde meiner Meinung nach ohnehin nicht viel Sinn machen
Also (wie gesagt, ich kenne mich mit deferred shadig nicht wirklich aus) soweit ich weiß, brauchst du für die Lichter mal sowieso einen eigenen Vertexshader.
Ich hab´s zwar nicht ausprobiert, aber ein einfaches
Code:
gl_Position = gl_Vertex //oder halt ggf das, was du statt gl_Vertex benutzt
müsste es eigentlich tun. In gl_Vertex mus dann natürlich die Position der Vertices im Screen Space rein, in die w koordinate würde ich (einfach mal ins Blaue geraten) 1.0 schreiben, weil da dann durchdividiert wird, schließlich ändert sich daran wohl nichts, nur weil du nicht mit der Projection Matrix multiplizierst. Tiefentest ist da soweit ich weiß sowieso ausgeschaltet, also musst du nur darauf achten, dass die z koordinate nicht von der near / far Clipping Plane abgeschnitten wird.
Sollte so funktionieren, hab´s aber nicht ausprobiert.
Mitglieder in diesem Forum: 0 Mitglieder und 4 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.