如何通过CPU停止glReadPixels转换数据格式?

时间:2013-01-18 13:06:22

标签: opengl glreadpixels

如我们所知,glReadPixels()将阻塞管道并使用CPU转换数据格式,尤其是当我想将深度值读取到系统RAM时。

我尝试过Songho提供的PBO,但我发现只有当glReadPixels()的参数设置为GL_BGRA时它才有用。

  • 当我使用带有参数GL_BGRA的PBO时,读取时间几乎为0.1毫秒,CPU使用率为4%。
  • 当我将param更改为GL_RGBA时,它读取2ms,CPU使用率为50%。

尝试GL_DEPTH_COMPONENT时也一样。显然这种缓慢是由转换造成的,所以任何人都知道如何阻止它转换数据格式?

在我的程序中,我必须读取深度值并在不到一秒钟内计算16 * 25次,因此2ms是不可接受的。

2 个答案:

答案 0 :(得分:1)

  

所以任何人都知道如何阻止它转换数据格式?

呃呃,通过阅读不需要转换的数据格式。屏幕上的帧缓冲区通常被格式化为BGRA,如果你想要不同的东西,首先需要转换数据。

你可以使用带有纹理/渲染缓冲附件的FBO,这些附件是预期的格式并呈现给它。

答案 1 :(得分:0)

桌面OpenGL将以您想要的任何格式提供数据,因此除非您指定不需要转换的格式,否则它将为您转换。因为那就是你要求的。

给定支持ARB_internalformat_query2的实现(现在只支持NVIDIA),you can simply ask。您要求GL_READ_PIXELS_FORMAT​GL_READ_PIXELS_TYPE​,然后使用它们。它应该返回一个不需要转换的格式。