2016-05-27 13 views
-1

Ich versuche das gerenderte Bild in einem PBO mit glReadPixels zu speichern und übertrage danach die Pixel in mein ByteBuffer Objekt mit glMapBuffer.glReadPixels schlägt beim Schreiben in PBO fehl

Aber nachdem update() abgeschlossen ist, enthält der Puffer nur die Dummy-Daten, die ich übergeben habe, wenn ich glBufferData (...) aufruft. Also gehe ich davon aus, dass glReadPixels die Daten nicht in das PBO laden kann. Ich bekomme den Fehler 1282 (INVALID_OPERATION) auch nach glReadPixels (...).

Wenn ich versuche, die Pixel direkt in den Puffer zu lesen, funktioniert es wie erwartet (obwohl der Fehler weiterhin auftritt). Aber aus Gründen der Performance möchte ich später glMapBuffer (...) zuerst und glReadPixels (...) danach aufrufen, damit ich die Datenverarbeitung ein wenig parallellieren kann.

public ModelObserver() { 
    buffer = BufferUtils.createByteBuffer(Display.getWidth() * Display.getHeight() * 4); 
    for (int i = 0; i < Display.getWidth() * Display.getHeight(); i++) { 
     buffer.put(new byte[] { 0, 127, 0, 0 }); 
    } 
    buffer.flip(); 

    pixelData = GL15.glGenBuffers(); 
    glBindBuffer(GL_PIXEL_PACK_BUFFER, pixelData); 
    glBufferData(GL_PIXEL_PACK_BUFFER, buffer, GL_DYNAMIC_READ); 
} 

public void update() { 
    glReadBuffer(GL_FRONT); 

    glBindBuffer(GL_PIXEL_PACK_BUFFER, pixelData); 
    glReadPixels(0, 0, Display.getWidth(), Display.getHeight(), GL_RGBA, GL_UNSIGNED_BYTE, 0); 

    System.out.println(glGetError()); 

    glBindBuffer(GL_PIXEL_PACK_BUFFER, pixelData); 
    glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_WRITE, buffer); 


    glUnmapBuffer(GL_PIXEL_PACK_BUFFER); 
    glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); 

} 

Antwort

0

Basierend auf dem LWJGL documentation, ist die Nutzung von glMapBuffer() falsch. Zitat aus der Dokumentation, bezogen auf das 3. Argument:

Nur ByteBuffers, die von dieser Methode zurückgegeben werden, sollen als old_buffer Argument übergeben werden. Vom Benutzer erstellte ByteBuffers können nicht wiederverwendet werden.

Das bedeutet, dass die buffer-Variable als drittes Argument ungültig ist. Die korrekte Verwendung ist:

ByteBuffer resBuffer = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_WRITE, null); 

Dann das Ergebnis von resBuffer lesen kann. Wenn Sie die gleiche Art von glMapBuffer() später erneut aufrufen, können Sie diesen Puffer jetzt für eine mögliche Wiederverwendung übergeben: