Lesen Sie die Pixel Werte aus dem Frame Buffer Object (FBO) unter Verwendung der Pixel Buffer Object (PBO)
Kann ich Pixel Buffer Object (PBO) zum direkten Auslesen der Pixel-Werte (d.h. mit glReadPixels) aus der FBO (also während FBO ist noch angebracht)?
Wenn ja,
- Was sind die Vorteile und Nachteile der Verwendung von PBO mit FBO?
- Was ist das problem mit folgenden code
{
//DATA_SIZE = WIDTH * HEIGHT * 3 (BECAUSE I AM USING 3 CHANNELS ONLY)
//FBO and PBO status is good
.
.
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);
//Draw the objects
Folgenden glReadPixels funktioniert
glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, (uchar*)cvimg->imageData);
Folgenden glReadPixels FUNKTIONIERT NICHT 🙁
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pboId);
//yes glWriteBuffer has also same target and I also checked with every possible values
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, (uchar*)cvimg->imageData);
.
.
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); //back to window framebuffer
InformationsquelleAutor Rudi | 2011-05-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie mit einem PBO als Ziel für
glReadPixels
müssen Sie angeben, ein byte-offset in den Puffer (0
, nehme ich an) statt(uchar*)cvimg->imageData
als Ziel-Adresse. Es ist ähnlich wie mit einem buffer offset inglVertexPointer
bei der Verwendung von VBOs.EDIT: Wenn ein PBO ist gebunden an die
GL_PIXEL_PACK_BUFFER
, das Letzte argument zuglReadPixels
wird nicht behandelt, wie ein Zeiger, der in die system-Speicher, sondern als byte-offset in die gebundenen Puffer-Speicher. So schreiben die Pixel in den Puffer übergeben Sie eine 0 (schreiben Sie an den Anfang des Puffer-Speichers). Sie können dann später Zugang buffer memory (Pixel) durchglMapBuffer
. Die Beispiel-link, den Sie in Ihrem Kommentar nicht, dass auch nur Lesen, es ausgiebig. Ich empfehle auch das Lesen der Artikel über vertex-buffer-Objekte, die Sie erwähnen am Anfang, als diese die Grundlagen zu verstehen, Puffer-Objekte.aktualisiert meine Antwort.
Ich hoffe, dass Sie gebunden PBO, bevor Sie versuchen zu schreiben in.
InformationsquelleAutor Christian Rau
Ja, wir können FBO, PBO zusammen.
Antwort 1:
Für synchrone Lesen: 'glReadPixels", ohne PBO ist schnell.
Für asynchrones Lesen: 'glReadPixels' mit 2/n PBo ist besser - eine Lektüre für Pixel aus dem framebuffer der PBO (n) von GPU und anderen PBO (n+1) zur Bearbeitung von Pixel-CPU. Aber schnell ist nicht selbstverständlich, es ist problem-und design-spefic.
Antwort 2:
Christian Rau ' s Erklärung ist richtig und überarbeitete code ist unten
InformationsquelleAutor Rudi