2017-10-08 21 views
0

Ich benutze LWJGL, um ein Dreieck auf einen Offscreen Framebuffer mit renderbuffer zu rendern. Nach dem Rendern der Szene lese ich die Daten aus dem Renderpuffer in den RAM unter Verwendung glReadPixels. Die ersten paar Frames funktionieren großartig, aber dann stürzt das Programm ab (SEGFAULT oder SIGABRT, ...).LWJGL stürzt nach wenigen Frames auf glReadPixels ab

Was mache ich hier falsch?

//Create memory buffer in RAM to copy frame from GPU to. 
ByteBuffer buf = BufferUtils.createByteBuffer(3*width*height); 

while(true){ 
    // Set framebuffer, clear screen, render objects, wait for render to finish, ... 
    ... 

    //Read frame from GPU to RAM 
    glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, buf); 

    //Move cursor in buffer back to the begin and copy the contents to the java image 
    buf.position(0); 
    buf.get(imgBackingByteArray); 

    //Use buffer 
    ... 
} 

Antwort

0

Mit glReadPixels, ByteBuffer.get() oder grundsätzlich ByteBuffer in irgendeiner Weise zugegriffen wird, ändert sich die aktuelle Position des Zeigers im Puffer.

Was hier passiert, ist:

  1. Die Position des Puffers anfänglich Null ist.
  2. Der Aufruf von glReadPixels kopiert das Bytes von der GPU in die Puffern, an der aktuellen Position (= 0)
  3. die aktuelle Position zu der Menge von Bytes wird verändert, die ausgehend in den Puffer geschrieben wurden.
  4. buf.position(0) die Position
  5. buf.get() Kopien versucht, auf 0 setzt das Bytes in dem Puffer zu imgBackingByteArrayund ändert die Position auf die Menge an Bytes, die
  6. die nächste Iteration der Schleife gelesenen Bytes in zu lesen, der Puffer, aber die aktuelle Position ist am Ende des Puffers und so tritt ein Pufferüberlauf auf. Dies löst einen Absturz aus.

Lösung:

//Make sure we start writing to the buffer at offset 0 
buf.position(0); 
//Read frame from GPU to RAM 
glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, buf); 

//Move cursor in buffer back to the begin and copy the contents to the java image 
buf.position(0); 
buf.get(imgBackingByteArray);