2012-02-13 51 views
5

在iOS 5中,OpenGL ES的纹理缓存被引入提供摄像头的视频数据到OpenGL的一个直接的方式,而不需要复制缓冲区。有一个session 414 - Advances in OpenGL ES for iOS 5 of WWDC 2011的纹理缓存简要介绍。使用OpenGL ES的纹理缓存,而不是glReadPixels获得的纹理数据

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

glReadPixels实在是太慢了,由于这是在iPad 2的(即使只使用1x1的纹理)使用基于区块的渲染器。但是,所描述的方法似乎处理得比glReadPixels更快。

的文章中所提出的方法,即使有效,可以把它用来提高依赖于glReadPixels应用程序?

由于OpenGL的在CPU并行处理图形数据时,CVPixelBufferLockBaseAddress电话怎么会知道当渲染,无需与OpenGL做的?

回答

4

我在this answer的基础上描述了一种方法,基于您的上面链接的文章和来自WWDC 2011的Apple ChromaKey样本。鉴于Apple在其中一个样本中使用了这一点,并且我没有听到任何反驳从他们的OpenGL ES工程师,我认为这是纹理缓存的有效使用。它的工作原理,我试过每部iOS 5.x的兼容设备上,并在安装iOS 5.0和5.1的作品一样好。它比glReadPixels()快得多。至于何时锁定像素缓冲区基地址,您应该能够使用glFlush()或类似的东西来阻止,直到所有数据都已经渲染到您的FBO纹理为止。这似乎适用于我从纹理支持的FBO完成的30 FPS 1080p电影编码。