2017-10-08 129 views
0

我正在使用LWJGL向渲染緩衝區的屏幕外幀緩衝區渲染三角形。渲染場景後,我使用glReadPixels將渲染緩衝區中的數據讀出到RAM中。前幾幀很好,但程序崩潰了(SEGFAULT,或SIGABRT,...)。幾幀後,LWJGL在glReadPixels上崩潰

我在這裏做錯了什麼?

//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 
    ... 
} 

回答

0
使用

glReadPixelsByteBuffer.get(),或基本上以任何方式訪問的ByteBuffer,改變指針在緩衝器中的當前位置。

這裏發生的是:

  1. 緩衝區的位置最初爲零。
  2. 呼叫到glReadPixels拷貝從GPU到緩衝區中,從當前位置被改變到被寫入到緩衝器的字節量的當前位置(= 0
  3. 字節。
  4. buf.position(0)的位置爲0。
  5. buf.get()拷貝在緩衝器中的字節復位到imgBackingByteArray並且改變位置以所讀取的字節量
  6. 循環的下一次迭代嘗試將字節讀入緩衝區,但當前位置在緩衝區的末尾,因此發生緩衝區溢出。這會觸發崩潰。

解決方案:

//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);