我正在使用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
...
}
答案 0 :(得分:0)
使用glReadPixels
,ByteBuffer.get()
或基本上以任何方式访问ByteBuffer,更改缓冲区中指针的当前位置。
这里发生的是:
glReadPixels
的调用将字节从GPU复制到缓冲区,从当前位置开始(= 0
)buf.position(0)
将位置重置为0。buf.get()
将缓冲区中的字节复制到imgBackingByteArray
,并将位置更改为已读取的字节数 解决方案:
//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);