【问题标题】:Delayed reading from generated texture in OpenGL延迟读取 OpenGL 中生成的纹理
【发布时间】:2013-11-16 08:28:00
【问题描述】:

我使用着色器程序在 OpenGL 的纹理中生成一些数据,并且我想从 OpenGL 中读回数据以在 CPU 上使用它。当然,通常情况下,读取纹理数据涉及刷新管道,以便数据实际存在并准备就绪,这对性能有明显影响。

但是,我实际上并不立即需要数据,也可以完全等到它准备好后再读取它。有没有办法做到这一点?我想我也许可以等到我交换缓冲区然后读取数据,但这会导致任何性能问题(由于必须刷新两次或其他原因)?还有其他方法吗?

【问题讨论】:

    标签: performance opengl render-to-texture


    【解决方案1】:

    可以使用Pixel Buffer Objects 完成异步图像数据传输。想法是您创建一个 PBO 并启动 texutre 回读到其中,而 GL 将异步进行传输。如果您在传输完成之前尝试访问 PBO,它只需要强制同步。

    您可以通过glFenceSync() 进一步将其与fence sync object 结合起来,并在尝试映射/读回PBO 之前实际查询传输是否已完成,如果没有,请在CPU 上执行其他操作而不是浪费等待时间。

    【讨论】:

    • 非常感谢!这应该可以满足我的要求,但我认为 OpenGL 2.0 没有任何方法可以做到这一点?
    • @Dolda2000:PBO 在 GL2.1 中被提升为核心。如果您确实需要针对 2.0 而不是 2.1,您可能仍然很幸运,因为此扩展可能在 2.0 实现中广泛可用。但我不知道核心 2.0 中有任何异步回读功能。
    • 哦,真的吗?没想到这么早。在那种情况下,我想根本就有问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2020-07-25
    相关资源
    最近更新 更多