OpenGL比glReadPixels更快地读取像素

时间:2014-08-04 21:21:12

标签: opengl

有没有办法提高glReadPixels的速度?目前我这样做:

Gdx.gl.glReadPixels(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), GL20.GL_RGBA, GL20.GL_UNSIGNED_BYTE, pixels);

问题在于它会阻止渲染并且速度很慢。

我听说过Pixel Buffer Objects,但我不确定如何连接它以及它是否更快。

还有除glReadPixels以外的任何其他解释吗?

基本上,我想尽快拍摄截图,而不会阻挡下一个场景的绘制。

1 个答案:

答案 0 :(得分:17)

  

有没有办法提高glReadPixels的速度?

嗯,该操作的速度实际上不是主要问题。它必须将一定量的字节从帧缓冲区传输到系统内存。在具有独立GPU的典型桌面系统中,通过PCI-Express发送数据,并且无法解决这个问题。

但正如您所说,隐式同步是一个大问题。如果您需要尽快获得像素数据,那么您实际上并不比同步回读更好。但是,如果您可以在以后获取该数据,那么通过像素缓冲对象(PBO)进行异步回读就可以了。

伪代码是:

  1. 创建PBO
  2. 将PBO绑定为GL_PIXEL_PACK_BUFFER
  3. 执行glReadPixels
  4. 做其他事情。两者都在CPU上运行并为GPU发布新命令是理想的。
  5. 使用glGetBufferSubData或通过映射PBO进行阅读,从PBO回读数据。
  6. 关键点是第5步的时间安排。我这样做到了早,你仍然阻止了客户端,因为它会等待数据变得可用。对于某些屏幕截图,即使是一帧或两帧也不难延迟该步骤。这样,它只会对整体渲染性能产生轻微影响,并且不会使GPU和CPU停滞不前。