【问题标题】:Read Framebuffer-texture like an 1D array像一维数组一样读取帧缓冲区纹理
【发布时间】:2023-03-17 20:13:02
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • "现在我想从帧缓冲纹理中任意给定长度的任意像素中读取数据。" - 这意味着什么?从着色器中读取,还是从您的应用程序中读取?假设支持的话,可以通过相对简单的数学或非常快速的缓冲区复制到缓冲区纹理(复制缓冲区 api)来完成。另一个只能用 glReadPixels 来完成,你不会绕过它(它可能在 CUDA 或 OpenCL 中被不同地调用,但它或多或少还是 glReadPixels)

标签: c++ opengl textures framebuffer glreadpixels


【解决方案1】:

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

可能将数据写入图块中的帧缓冲区和/或使用Morton order 可能有助于构建数据,以便找到更紧密的边界框并最大限度地减少检索到的额外数据。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-12-05
      • 2020-09-16
      • 1970-01-01
      • 2015-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      相关资源
      最近更新 更多