[OpenGL] Framebuffer auslesen
-
Hallo.
Gibt es eine Möglichkeit, den Inhalt eines Framebuffers auszulesen, um ihn z.B. in einer Bitmap zu speichern? Wenn ja, was wäre der sinnvollste Weg?
gruß
Martin
-
Wozu brauchst Du das?
Du kannst z.B. direkt in eine Textur rendern.
-
glReadPixels vermutlich.
-
Es geht, wie rapso schon vermutet, um glReadPixels und einfach um einen Screenshot. Das Problem ist, dass in meinem Programm mehrere Renderthreads parallel existieren und deshalb - vermute ich - glReadPixels undefiniertes Verhalten zeigt. Code, der im Single-Threaded-Programm korrekt läuft und einen Screenshot erstellt, gibt mir im Multi-Threaded-Programm nur eine graue Fläche aus.
Es gibt laut Gerüchten die Möglichkeit, den Framebuffer auszulesen, um einen glReadPixels vergleichbaren Mechanismus zu erzielen. Jetzt ist die Frage, wie das gehen mag!
-
afaik ist opengl nicht multithreading save, du musst also im renderthread glReadPixels an der richtigen stelle machen, die synchronisierung mit anderen threads musst du dann zum renderthread machen, nicht zu opengl.
-
rapso schrieb:
afaik ist opengl nicht multithreading save, du musst also im renderthread glReadPixels an der richtigen stelle machen, die synchronisierung mit anderen threads musst du dann zum renderthread machen, nicht zu opengl.
Die Erfahrung hab ich auch gemacht, Du darfst nur einen Renderthread verwenden.
-
OpenGL ist definitiv nicht multithreading-safe. Das hab ich auch beachtet. Da die OpenGL-States (Viewport, Frustum, Hintergrundfarbe,...) "global" sind, setzt jeder Renderthread jeweils seine Einstellungen vor dem Zeichnen neu. Das klappt auch soweit ohne Probleme, die Leistungseinbußen sind vernachlässigbar.
Die Synchronisation läuft zumindest fürs Zeichnen auch ohne Probleme. Mein Renderaufruf wird von EnterCriticalSection und LeaveCriticalSection eingerahmt. Bisherige Test zeigen, dass das so ohne Probleme auch bei >10 Threads funktioniert (Belastung skaliert scheinbar fast linear).
Nun hab ich versucht, das glReadPixels einfach an einen Renderaufruf dranzuhängen, weil ich dann ja sicher sein kann, dass das Bild korrekt gezeichnet wurde, oder?
Die Frage ist nun, ob das Problem an meiner Synchro liegt (was zwar wahrscheinlich ist, ich aber nicht vermute, da ich mir da eigentlich vorher gründlich überlegt hab, was ich da mache) oder ob es an glReadPixels liegt. Wenn es eine Alternative über Framebuffer gäb, könnte ich zumindest die zweite Annahme leicht überprüfen.
-
mad_martin schrieb:
Die Frage ist nun, ob das Problem an meiner Synchro liegt (was zwar wahrscheinlich ist, ich aber nicht vermute, da ich mir da eigentlich vorher gründlich überlegt hab, was ich da mache) oder ob es an glReadPixels liegt. Wenn es eine Alternative über Framebuffer gäb, könnte ich zumindest die zweite Annahme leicht überprüfen.
einfach nur mit einem thread probieren (also eigentlich ohne treading), wenn es dann nicht geht, hast du entweder nen bug im treiber oder die doku zu glReadPixel nicht genau genug studiert

-
mad_martin schrieb:
Das hab ich auch beachtet. Da die OpenGL-States (Viewport, Frustum, Hintergrundfarbe,...) "global" sind, setzt jeder Renderthread jeweils seine Einstellungen vor dem Zeichnen neu.
Was ist, wenn Thread 1 die farbe auf x setzt und anfangen will zu zeichnen, dann aber zugunsten von Thread 2, welcher die Farbe dann auf y setzt und sein zeug zeichnet, unterbrochen wird? Sobald Thread 1 wieder dran ist, zeichnet er mit Farbe y von Thread 2...
-
Das ist kein Problem. Wie ich oben schon schrieb, ist mein Renderaufruf von EnterCriticalSection und LeaveCriticalSection eingerahmt (Mutex). Wenn ein Thread einmal angefangen hat zu zeichnen, dann macht er das auch fertig. Da wird nicht unterbrochen. Wäre auch ziemlich sinnlos, oder?

-
mad_martin schrieb:
Das ist kein Problem. Wie ich oben schon schrieb, ist mein Renderaufruf von EnterCriticalSection und LeaveCriticalSection eingerahmt (Mutex). Wenn ein Thread einmal angefangen hat zu zeichnen, dann macht er das auch fertig. Da wird nicht unterbrochen. Wäre auch ziemlich sinnlos, oder?

dann bleibt nach sherlock holmes ja nur noch dass du glreadpixels falsch verwendest.
-
Was glaubst du, womit ich mich in den letzten 2 Stunden beschäftigt habe?
Irgendwie habe ich das Gefühl, da was übersehen zu haben. Naja, mal weitersuchen!
-
mad_martin schrieb:
Was glaubst du, womit ich mich in den letzten 2 Stunden beschäftigt habe?
vermutlich nicht gleich diese information ins anfangsposting zu stecken :p