Ich erstelle beim initialisieren von
OpenGL zwei PBO (Pixel Buffer Objects)um später beim Rendern glReadpixel asynchron verwenden zu können.
Eine PBO zum lesen der Pixel aus dem Framebuffer von der GPU die andere zur Bearbeitung der Pixel über die CPU.
Wenn ich das nicht mache geht meine Framerate runter bis auf 9 Frames in der Sekunde.
// InitPBO
Delphi-Quellcode:
glGenBuffersARB(2, @m_pPBO);
glBindBufferARB(GL_PIXEL_PACK_BUFFER_EXT, m_pPBO[0]);
glBufferDataARB(GL_PIXEL_PACK_BUFFER_EXT,
StretchWidth * StretchHeight * 4,
nil,
GL_STREAM_READ);
glBindBufferARB(GL_PIXEL_PACK_BUFFER_EXT, m_pPBO[1]);
glBufferDataARB(GL_PIXEL_PACK_BUFFER_EXT,
StretchWidth * StretchHeight * 4,
nil,
GL_STREAM_READ);
glBindBufferARB(GL_PIXEL_PACK_BUFFER_EXT, 0);
Damit habe ich zwei PBO's initialisiert.
und verwende eine davon auf diese weise.
Delphi-Quellcode:
glBindBufferARB(GL_PIXEL_PACK_BUFFER_EXT, m_pPBO[0]);
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
glReadPixels(0, 0, width, Height, GL_BGRA, GL_UNSIGNED_BYTE, nil);
RGBBits[0] := glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB);
//.......
// Pixel verarbeiten..
//.......
// Buffer freigeben.
glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
Das bringt mir schon mal 20 Frames mehr.
Allerdings verwende ich nur ein PBO.
Ich verstehe im Moment die Technik nicht die dahinter steckt zwei PBO's auf ein und die
gleiche Texture anzuwenden so das die Daten asynchron gelesen (verarbeitet) werden.
Kann jemand helfen?
gruss