【问题标题】:Using OpenGL ES texture caches instead of glReadPixels to get texture data使用 OpenGL ES 纹理缓存而不是 glReadPixels 来获取纹理数据
【发布时间】:2012-03-04 21:50:03
【问题描述】:

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

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

glReadPixels 非常慢,因为 iPad 2 中使用了基于 tile 的渲染器(即使您只使用 1x1 纹理)。但是,所描述的方法似乎比glReadPixels 处理得更快。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      相关资源
      最近更新 更多