如我们所知,glReadPixels()
将阻塞管道并使用CPU转换数据格式,尤其是当我想将深度值读取到系统RAM时。
我尝试过Songho提供的PBO,但我发现只有当glReadPixels()
的参数设置为GL_BGRA时它才有用。
GL_BGRA
的PBO时,读取时间几乎为0.1毫秒,CPU使用率为4%。GL_RGBA
时,它读取2ms,CPU使用率为50%。尝试GL_DEPTH_COMPONENT
时也一样。显然这种缓慢是由转换造成的,所以任何人都知道如何阻止它转换数据格式?
在我的程序中,我必须读取深度值并在不到一秒钟内计算16 * 25次,因此2ms是不可接受的。
答案 0 :(得分:1)
呃呃,通过阅读不需要转换的数据格式。屏幕上的帧缓冲区通常被格式化为BGRA,如果你想要不同的东西,首先需要转换数据。所以任何人都知道如何阻止它转换数据格式?
你可以使用带有纹理/渲染缓冲附件的FBO,这些附件是预期的格式并呈现给它。
答案 1 :(得分:0)
桌面OpenGL将以您想要的任何格式提供数据,因此除非您指定不需要转换的格式,否则它将为您转换。因为那就是你要求的。
给定支持ARB_internalformat_query2的实现(现在只支持NVIDIA),you can simply ask。您要求GL_READ_PIXELS_FORMAT
和GL_READ_PIXELS_TYPE
,然后使用它们。它应该返回一个不需要转换的格式。