Video puffer auslesen
-
Hallo,
ich denke einige von euch kennen die Funktion 'SwapBuffer()' welche für Grafikanwendugnen sehr wichtig ist. Allerdings frage ich mich ob man mittels Win32API auch so schnell wie möglich den aktuellen VideoBuffer (Video Puffer) auslesen kann. Die Funktionen von OpenGL um Screenshots zu machen sind mit nämlich noch etwas zu langsam.
Kennt jemand von euch eine solche Funktion?
-
theoretisch du kannst doch nen CompatibleDC (so dass auf dem DC des Fensters weiter gezeichnet werden kann) erstellen und die entsprechenden Daten vom RenderingContext darein kopieren, und letztendlich abspeichern. praktische umsetzung - kA, kenn mich mit OGL nich wirklich aus.
das obige wird wohl ziemlich langsam sein, deshalb wird ich dir raten, ob jetzt mit den OpenGL funktionen oder der winapi: erstell doch einen thread, in dem das obige Vorgehen passiert. Dann solltest du doch von einem Geschwindigkeitsverlust fast nichts merken.
-
Ich möchte nicht unbedingt einen Thread wegen so einer Saceh aufmachen. Selbst 'PureBasic' kriegt das sau schnell hin dann wird das jawohl in C++ genau so gut auch ohne Thread gehen.
Aber das mit dem auslesen aus dem RenderingContext ist vielleicht gar keine so dumme Idee.
Ich guck dazu mal in Google. Danke schon mal.
PS: Weitere Ideen freuen mich natürlich acuh
-
Hi !
Die Funktion BitBlt, die könnte etwas für dich sein.
-
Das währ vielleicht ne gute Idee. Danke

-
LukasBanana schrieb:
Die Funktionen von OpenGL um Screenshots zu machen sind mit nämlich noch etwas zu langsam.
Meinst du glReadPixels()? Was ist dir daran zu langsam? Was für eine Anforderung hast du denn, 20 Screenshots pro Sekunde???
Ich glaube nicht, dass es mit WinAPI-Mitteln besser geht. Die Daten der OGL-Anwendung liegen ja immerhin auf dem Grafikspeicher. Da kommst du nicht mehr so einfach dran.
Ein Weg, den Xantus glaube ich meinte, wäre:
Kurzzeitig den RC an einen anderen DC zu binden, d.h. du wählst einen DC von einem DIB an, holst dir einen RC dazu und zeichnest einfach deine OGL-Szene. Danach wieder mit wglMakeCurrent() den alten RC an den DC deines normalen Fensters binden, um wieder normal weiterzumachen.Den Ansatz hat hier jemand verwendet, um ein OpenGL-Bild zu drucken. Der Ansatz sollte dir helfen.
Aber ob das schneller ist, als per glReadPixels(), weiß ich nicht. Probiers aus.
gruß
-
BitBlt macht es in ms... aber DirectX-Grafik kann es nicht kopieren, sondern nur "normale" Bilder...
-
Also bei mir ist glReadPixels noch um einiges langsamer als glCopyTexSubImage2D. Und diese Funktion wiederum ist langsamer als eien Funktion aus PureBasic und in C++ sollte das mindestens genau so schnell gehen.
Aber das mit dem wechseln von DC zu RC und dann auch noch mal die gesammte Szene rendern, neh, das kann auch nicht die Lösung sein
-
Beantworte mir doch bitte mal die Frage, wie langsam das bei dir ist. Und wie deine Anforderung sein soll.
Welche Funktion benutzest du denn in PureBasic? Gibts da ne Doku zu, die deren Wirkungsweise erläutert?
-
LukasBanana schrieb:
Aber das mit dem wechseln von DC zu RC und dann auch noch mal die gesammte Szene rendern, neh, das kann auch nicht die Lösung sein
du scheinst die obigen Tipps nicht verstanden zu haben. Hier nochmal ein Überblick über die Methode mit BitBlt, allerdings in anderer Reihenfolge:
Ich gehe mal davon aus, dass du die gedrückten Tasten VOR dem rendern überprüfst, nich wahr?
- überprüfe ob die taste für den screenshot gedrückt; wenn ja, setzte flag
- berechnungen, rendern, gut is
- swap buffers; JETZT hast du alles im DC
- flag gesetzt? compatibleDC erstellen, compatibleBitmap erstellen, DC auslesen, in compatible dc kopieren, bitmap abspeichern.
-
@mad_martin: glReadPixels dauert bei mir so ca. eine Sekunde. In PB gibt`s ne Funktion namens 'GrabSprite' da merkt man überhaupt keinen Geschwindigkeitsverlust.
@Xantus: Okay das kann ich mal ausprobieren
Danke