Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#1

PBO asynchron glreadPixel

  Alt 18. Jan 2014, 12:19
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

Geändert von EWeiss (19. Jan 2014 um 01:15 Uhr)
  Mit Zitat antworten Zitat