OpenGL比glReadPixels更快地读取像素

Nik*_*las 13 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吗?

基本上,我想尽可能快地截取屏幕截图,而不会阻止下一个场景的绘制.

der*_*ass 17

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

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

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

伪代码是:

  1. 创建PBO
  2. 将PBO绑定为 GL_PIXEL_PACK_BUFFER
  3. 做的 glReadPixels
  4. 做点别的.两者都在CPU上运行并为GPU发布新命令是理想的选择.
  5. 通过使用glGetBufferSubData或通过映射PBO进行读取,从PBO回读数据.

关键点是第5步的时间安排.我这样做到了早,你仍然阻止了客户端,因为它会等待数据变得可用.对于某些屏幕截图,即使是一帧或两帧也不难延迟该步骤.这样,它只会对整体渲染性能产生轻微影响,并且不会使GPU和CPU停滞.