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

Eta*_*tan 5 glreadpixels core-video ios opengl-es-2.0

在iOS 5中,引入了OpenGL ES Texture缓存,以提供从摄像机视频数据到OpenGL的直接方式,而无需复制缓冲区.会话414中简要介绍了纹理缓存--Windows 2011中iOS 5的OpenGL ES的进展.

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

glReadPixels由于iPad 2中使用的基于图块的渲染器(即使只使用1x1纹理),因此速度非常慢.但是,所描述的方法似乎处理得比glReadPixels.

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

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

Bra*_*son 4

我根据您上面链接的文章和 WWDC 2011 中的 Apple ChromaKey 示例,在这个答案中描述了一种执行此操作的方法。鉴于 Apple 在他们的一个示例中使用了此方法,并且我没有从他们的 OpenGL 中听到任何反驳这一点的内容ES 工程师,我相信这是纹理缓存的有效使用。它适用于我尝试过的所有 iOS 5.x 兼容设备,也适用于 iOS 5.0 和 5.1。它比 快得多glReadPixels()

至于何时锁定像素缓冲区基地址,您应该能够使用glFlush()或类似的方法进行阻塞,直到所有数据都渲染到您的 FBO 纹理。这似乎适用于我通过纹理支持的 FBO 完成的 30 FPS 1080p 电影编码。