几帧后,LWJGL在glReadPixels上崩溃

时间:2017-10-08 16:13:04

标签: java opengl segmentation-fault lwjgl buffer-overflow

我正在使用LWJGL使用renderbuffer将三角形渲染到屏幕外的帧缓冲区。渲染场景后,我使用glReadPixels将数据从渲染缓冲区读出到RAM。前几帧效果很好,但程序崩溃了(SEGFAULT,或SIGABRT,......)。

我在这里做错了什么?

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

1 个答案:

答案 0 :(得分:0)

使用glReadPixelsByteBuffer.get()或基本上以任何方式访问ByteBuffer,更改缓冲区中指针的当前位置。

这里发生的是:

  1. 缓冲区的位置最初为零。
  2. glReadPixels的调用将字节从GPU复制到缓冲区,从当前位置开始(= 0
  3. 当前位置变为写入缓冲区的字节数。
  4. buf.position(0)将位置重置为0。
  5. buf.get()将缓冲区中的字节复制到imgBackingByteArray ,并将位置更改为已读取的字节数
  6. 循环的下一次迭代尝试将字节读入缓冲区,但当前位置位于缓冲区的末尾,因此发生缓冲区溢出。这会导致崩溃。
  7. 解决方案:

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