6

在 iOS 5 中,引入了 OpenGL ES 纹理缓存,以提供从相机视频数据到 OpenGL 的直接方式,而无需复制缓冲区。在WWDC 2011 的第 414 节——iOS 5 的 OpenGL ES 进展中对纹理缓存进行了简要介绍。

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

glReadPixels由于 iPad 2 中使用的基于 tile 的渲染器(即使您只使用 1x1 纹理),它真的很慢。但是,所描述的方法似乎比glReadPixels.

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

由于 OpenGL 与 CPU 并行处理图形数据,CVPixelBufferLockBaseAddress调用如何知道渲染何时完成而不与 OpenGL 对话?

4

1 回答 1

4

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

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

于 2012-03-20T20:59:52.023 回答