Hallo allerseits, Ich habe mit einem FBO etwas Postprocessing betrieben, und habe mir dabei überlegt, ob ich auf die Textur, in die geschrieben wird auch zugreifen kann, während ich die Szene in dieselbe Textur zeichne. Hab es ausprobiert, und es scheint auch was drin zu sein, aber scheinbar nur ein Teil, die gerenderte Textur ist mit quadratische löchern gespickt. Was muss ich beachten? Brauche ich dazu 2 FBOs?
_________________ "Pixel, ich bin dein Vater." -Darf Shader
Der Grund, weshalb ich die Textur in der Scene haben will, in der Sie erzeugt wird ist folgender. Ich hätte gerne ein Datenpaket (hier in Form der Textur), dass ich mittels Pixelshader fortlaufend verändern kann, und dabei auf das gesamte Paket zugreifen kann, z.B. für die Berechnung von zeitlichen Entwicklungen von irgendwelchen gekoppelten Systemen. Für andere Möglichkeiten hierzu bin ich natürlich offen.
Grüße Vinz
_________________ "Pixel, ich bin dein Vater." -Darf Shader
Registriert: So Aug 08, 2010 08:37 Beiträge: 460
Programmiersprache: C / C++ / Lua
Ich gehe mal davon aus, dass du zwei Threads hast, die beide gleichzeitig auf die Textur zugreifen sollen, einer davon soll sie verändern.
Du müsstest vorher die Textur in ein zweites FBO kopieren.
Wichtig dabei wäre, dass du beide FBO's am Anfang erstellst und dann am Ende des Berechnungsthreads, das Berechnungsfbo in das Renderfbo kopierst. So sollte es auf jeden Fall gehen.
EDIT:
Wenn du Pixelshader nutzt, kannst du doch die Parameter des Pixelshaders jeden Frame/mitten im Frame verändern. Dann geht es auch. aber eben nur mit dem was gerendert wird
_________________ offizieller DGL Compliance Beauftragter Never run a changing system! (oder so)
Registriert: Di Sep 06, 2005 18:34 Beiträge: 362 Wohnort: Hamburg
Hey,
end hat im Grunde Recht, allerdings musst du das FBO nicht zwingend kopieren. Du musst nur sicher stellen, dass du nicht gleichzeitig schreibst und liest (siehe https://www.opengl.org/wiki/Framebuffer ... back_Loops).
Du könntest auch versuchen 2 Texturen an das FBO zu binden und eine zum Schreiben, die andere zum Lesen zu benutzen und die nach jedem gerenderten objekt einfach tauschen. Das geht natürlich nur wenn deine Objekte so aufgebaut sind, dass sie es dir erlauben die komplette Textur zu kopieren (fullscreen quads).
Eine weitere Alternative wäre Transform Feedback. Damit kannst du die Ausgabe von Vertex Shadern in buffer objects auslesen (ähnlich wie Texturen für Fragment Shader). Ein Beispiel dafür findest du hier GLSL_Partikel_2.
Gruß Shai
_________________ Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)
Registriert: So Aug 08, 2010 08:37 Beiträge: 460
Programmiersprache: C / C++ / Lua
Das Problem ist doch, dass wenn man ein Teil der Textur liest, dann verändert und dann wieder liest, man nie eine komplett veränderte Textur hat, sondern immer nur Teile aus verändertem und unverändertem (wenn man nicht das Glück hat, dass die Threads gleich schnell sind, die Wahrscheinlichkeit hierfür ist jedoch gering )
_________________ offizieller DGL Compliance Beauftragter Never run a changing system! (oder so)
Danke für die Antworten! Ich hab mich für die Pingpong-Methode mit zwei Texturen entschieden, also von Frame zu Frame, die Lese- und Schreib-Textur gegeneinander auszutauschen, klappt bestens. Endlich mal zeitliche Entwicklung innerhalb der Grafikkarte, wollt ich schon lang mal haben. Und mit Floatingpointtexturen kann man damit einiges ausrechnen!
_________________ "Pixel, ich bin dein Vater." -Darf Shader
Mitglieder in diesem Forum: 0 Mitglieder und 18 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.