像一维数组一样读取帧缓冲区纹理

时间:2011-08-03 17:42:51

标签: c++ opengl textures framebuffer glreadpixels

我正在使用GL进行一些gpgpu计算,并希望从framebuffer中读取我的结果。 我的帧缓冲纹理在逻辑上是一维数组,但我把它做成2D以获得更大的区域。现在我想从任何给定长度的framebuffer-texture中读取任意像素。

这意味着所有计算都已在GPU端完成,我只需要将某些数据传递给可以在纹理边框上对齐的cpu。

这可能吗?如果是,它比整个图像上的glReadPixels更慢/更快,然后切断我需要的东西吗?

修改 当然我知道OpenCL / CUDA,但它们并不需要,因为我希望我的程序能够(几乎)在任何平台上运行。

我也知道glReadPixels非常慢,一个原因可能是它提供了一些我不需要的功能(在2D中运行)。因此,我要求一个更基本的功能可能更快。

2 个答案:

答案 0 :(得分:2)

使用glReadPixels读取整个帧缓冲区只是为了丢弃所有帧缓冲区除了几个像素/行之外将是非常低效的。但是glReadPixels允许你在帧缓冲区中指定一个矩形,那么为什么不限制它来获取感兴趣的几行呢?因此,您最终可能会在获取的第一行和最后一行的开头和结尾处获取一些额外的数据,但我怀疑与进行多次调用相比,其开销很小。

可能将数据写入tile中的帧缓冲区和/或使用Morton order可能有助于构建它,以便找到更紧密的边界框并最小化检索的额外数据。

答案 1 :(得分:1)

您可以使用像素缓冲区对象(PBO)将像素数据从帧缓冲区传输到PBO,然后使用glMapBufferARB直接读取数据:

http://www.songho.ca/opengl/gl_pbo.html