Registriert: Do Mai 20, 2010 10:54 Beiträge: 10
Programmiersprache: C/C++
Hi, Du brauchst eigentlich nur für die Position eine RGBA32F-Textur, für alle weiteren Texturen würde ich das GL_RGBA8 Format verwenden. Entsprechend der OpenGL 3(.3) Spezifikation kannst Du durchaus auch Texturen mit verschiedenen Formaten an einen Framebuffer binden.
So nach langer Zeit bin ich wieder zurück . Also ich machs doch jetzt mit einer Depth - Texture anstatt mit einer Vertex. Leider find ich im Internet fast gar nix darüber, wie man mittels Depth - Texture die 3D - Position eines bestimmten Pixels ermittelt. Also der Deferred - Shader sieht momentan wie folgt aus:
Also wenn ich die Kameraposition (nur die Position!) verändere, verändert sich auch das Diffuse - Licht. Weiß jemand wie man richtig die Position daraus berechnet? (Den oben gekennzeichneten Code mit der Berechnung der Position hab ich im Internet gefunden.)
Was spricht gegen die Verwendung von gl_ProjectionMatrix bzw. gl_ProjectionMatrixInverse? Des weiteren kann man auch Uniforms vom Typ mat4 benutzen. Also diese Matrix-Kopieraktion ist definitiv nicht notwendig
Mit gl_ProjectionMatrix bekommst du das was mittels glMatrixMode(GL_PROJECTION) gesetzt wurde. Also wenn du dein Screen-Quad für den Deferred Shader renderst müsstest du dann die alte Projektion setzen. Ist aber kein Problem da man zum rendern eines Screen-Quads ja keine Projektion braucht....bei mir sieht der Vertexshader meist einfach so aus:
Also mit Hilfe der Tiefe und der inversen Projektionsmatrix die Vertexposition zu errechnen. Dafür brauchst du den Vertex in den sog. normalisierten Gerätekoordinaten (NDC). Das ist einfach ein Einheitswürfel von -1 bis 1. Für X und Y bekommst du das leicht aus den Texturkoordinaten, ist aber natürlich abhängig wierum deine Texcoord sind...also ggf. musst du noch spiegeln.
Die Z-Koordinate ist natürlich davon abhängig was du da in deiner Textur hast. Der Wert dürfte aber zwischen 0 und 1 liegen denke ich mal. Dann musst du das auf die gleiche weise auf den -1...1 Bereich mappen.
Danke für die Antwort! Habs übernommen, aber scheinbar siehts leider immer noch so aus wie vorher ... Hab das Gefühl als würde die Vertexposition nicht richtig transformiert sein so wie die Lichtposition...
Problem gelöst . Nach langem Rumprobieren hab ich herausgefunden, dass es mit gl_ProjectionMatrixInverseTranspose anstatt mit gl_ProjectionMatrixInverse funktioniert. Läuft jetzt alles perfekt. Danke an alle ! Wens interessiert, hier der Code:
Nach langem Rumprobieren hab ich herausgefunden, dass es mit gl_ProjectionMatrixInverseTranspose anstatt mit gl_ProjectionMatrixInverse funktioniert.
Das liegt nur an meiner Dummheit das ich vertex = vertex * gl_ProjectionMatrixInverse; statt vertex = gl_ProjectionMatrixInverse * vertex; geschrieben habe
Zitat:
varying mat4 matProjectionInverse;
Alle eingebauten Uniforms sind sowohl im Vertex- als auch im Fragmentshader verfügbar. Insofern ist es nicht nötig da ein Varying zu benutzen.
@Thmfrnk Sowohl als auch . Habs so gemacht, das sich das an die Hardware anpasst. Also wenn MRT unterstützt wird, wirds auch verwendet. Ansonsten einzeln (2 Renderpasses).
Mitglieder in diesem Forum: 0 Mitglieder und 8 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.