我使用着色器程序在OpenGL中的纹理中生成一些数据,我想从OpenGL中读回数据以在CPU上使用它。当然,通常情况下,读取纹理数据涉及刷新管道,以便数据实际存在并准备就绪,对性能有明显的影响。
但是,我实际上并不需要立即获得数据,并且可以准确地等待它准备就绪然后再读取它。有没有办法做到这一点?我想我也许可以等到我交换缓冲区然后再读取数据,但这会导致任何性能问题(由于必须冲洗两次或者什么)?还有其他办法吗?
答案 0 :(得分:3)
可以使用Pixel Buffer Objects完成异步图像数据传输。想法是你创建一个PBO并启动它的texutre回读,GL将异步进行传输。如果您在传输完成之前尝试访问PBO,则只需强制同步。
您可以通过fence sync object进一步将其与glFenceSync()
结合起来,并在尝试映射/回读PBO之前实际查询传输是否已完成,如果不是,请在其上执行其他操作CPU而不是浪费时间等待。