0

我正在使用 GL 进行一些 gpgpu 计算,并希望从帧缓冲区中读取我的结果。我的帧缓冲区纹理在逻辑上是一个一维数组,但我将其设为二维以拥有更大的区域。现在我想从帧缓冲纹理中任意给定长度的任意像素中读取数据。

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

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

编辑 当然,我知道 OpenCL/CUDA,但它们不是我们想要的,因为我希望我的程序在(几乎)任何平台上开箱即用。

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

4

2 回答 2

2

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

可能将您的数据以图块的形式写入帧缓冲区和/或使用Morton 顺序可能有助于对其进行结构化,以便可以找到更紧密的边界框并最大限度地减少检索到的额外数据。

于 2011-08-03T23:20:00.280 回答
1

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

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

于 2011-08-03T20:53:58.043 回答