gpt4 book ai didi

c++ - OpenGL:从许多帧缓冲区纹理中读取稀疏像素数据的有效方法?

转载 作者:太空宇宙 更新时间:2023-11-04 16:07:23 40 4
gpt4 key购买 nike

我正在编写一个使用 GPU 计算内容的程序,我想从帧缓冲区读取数据以用于我的客户端代码。我使用的帧缓冲区大约有 40 个纹理,大小均为 1024x1024,所有这些都包含需要读取的数据,但非常少,例如每个纹理的任意 x/y 坐标中的 50 个左右像素。对每个纹理、每个帧使用 glReadPixels 对我来说成本太高了……

我只需要从每个纹理中读取几个选定的像素,有没有一种方法可以快速收集它们的数据而不需要从 GPU 下载每个完整的纹理?

最佳答案

无论您如何划分,这听起来都相当昂贵。我想到了几种方法:

  • 我首先要尝试的是 glReadPixels(),但要使用 PBO。绑定(bind)一个足够大的缓冲区以将所有像素保存到 GL_PIXEL_PACK_BUFFER 目标,然后提交 glReadPixels() 调用,并使用偏移量将结果放置在缓冲区的不同部分.然后调用 glMapBufferRange() 来读回这些值。

  • 另一种方法是将要读取的所有像素复制到一个纹理中。您可以使用 glBlitFramebuffer()glCopyTexSubImage2D()。然后使用单个 glReadPixels()glGetTexImage() 调用从该纹理获取所有数据。

这两种方法的工作量和同步开销应该大致相同。但其中一个可能更有效,具体取决于驱动程序中的哪些路径得到了更好的优化。

正如前面的回答所建议的那样,我会非常确定您确实需要它,并且没有任何方法可以在 GPU 上保存和处理数据。任何时候回读数据,都会在 GPU 和 CPU 之间引入同步,这对性能最有害。

关于c++ - OpenGL:从许多帧缓冲区纹理中读取稀疏像素数据的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33179782/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com