使用OpenGL ES纹理缓存而不是glReadPixels来获取纹理数据

时间:2012-02-13 13:33:57

标签: ios opengl-es-2.0 glreadpixels core-video

在iOS 5中,引入了OpenGL ES Texture缓存,以提供从摄像机视频数据到OpenGL的直接方式,而无需复制缓冲区。在session 414 - Advances in OpenGL ES for iOS 5 of WWDC 2011中简要介绍了纹理缓存。

我发现了一个有趣的article,它最终进一步滥用了这个概念,并通过简单地锁定纹理,然后直接访问缓冲区来绕过对glReadPixels的调用。

由于iPad 2中使用的基于图块的渲染器(即使只使用1x1纹理),

glReadPixels也非常慢。但是,所描述的方法似乎比glReadPixels处理得更快。

文章中提出的方法是否有效,是否可用于增强依赖glReadPixels的应用程序?

由于OpenGL与CPU并行处理图形数据,如何在不与OpenGL交谈的情况下完成渲染时CVPixelBufferLockBaseAddress调用如何知道?

1 个答案:

答案 0 :(得分:4)

我根据你上面链接的文章和来自WWDC 2011的Apple的ChromaKey样本,在this answer中描述了这样做的方法。鉴于Apple在他们的一个样本中使用了这个,并且我没有听到任何与OpenGL ES工程师对抗的事情,我相信这是对纹理缓存的有效使用。它适用于我尝试过的每个iOS 5.x兼容设备,并且也可以在iOS 5.0和5.1中使用。它比glReadPixels()快得多。

至于何时锁定像素缓冲区基址,您应该能够使用glFlush()等来阻止,直到所有数据都呈现给您的FBO纹理。这似乎适用于我从纹理支持的FBO完成的30 FPS 1080p电影编码。