在iOS 5中,引入了OpenGL ES Texture缓存,以提供从摄像机视频数据到OpenGL的直接方式,而无需复制缓冲区。在session 414 - Advances in OpenGL ES for iOS 5 of WWDC 2011中简要介绍了纹理缓存。
我发现了一个有趣的article,它最终进一步滥用了这个概念,并通过简单地锁定纹理,然后直接访问缓冲区来绕过对glReadPixels
的调用。
glReadPixels
也非常慢。但是,所描述的方法似乎比glReadPixels
处理得更快。
文章中提出的方法是否有效,是否可用于增强依赖glReadPixels
的应用程序?
由于OpenGL与CPU并行处理图形数据,如何在不与OpenGL交谈的情况下完成渲染时CVPixelBufferLockBaseAddress
调用如何知道?
答案 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电影编码。