3

由于像素缓冲区对象在 OpenGL ES 2.0 中不可用,将纹理传输到 GPU(然后再返回)的最快方法是什么?是否有任何可用于 iPad 2 或更高版本的扩展程序可供我们使用?

不幸的是,我不能使用压缩纹理,因为纹理(RGBA8)是在应用程序的另一部分动态生成的。

4

2 回答 2

3

对于 iOS(鉴于此处对 iPad 的引用,我假设是您的平台),往返未压缩纹理的最快方法是通过纹理缓存。这些是在 iOS 5.0 中引入的,基本上是在纹理的支持字节和本地内存字节缓冲区之间进行直接内存映射。

对于使用 CVOpenGLESTextureCacheRef 的上传,我在这个答案中描述了这个过程。不过,摄像机有点特殊,因为它提供像素缓冲区供您使用。对于其他用途,您将自己创建像素缓冲区并将内存关联到本地字节缓冲区以上传到纹理中。在我的基准测试中,初始上传不比 快glTexImage2D(),但我相信这些字节的后续修改更快。

我在这个答案中谈到了使用纹理缓存从 FBO 纹理目标中捕获的过程。该答案还针对特定用例,即视频编码,但可以将相同的基本原理与您自己的自定义像素缓冲区一起使用来提取原始字节。在我进行基准测试的几乎所有情况下,这都比glReadPixels().

当然,最快的路径是不必在 CPU 和 GPU 之间来回切换。如果可以,请利用 FBO 纹理目标和共享组来将所有渲染保留在 GPU 上。

于 2013-06-29T18:21:09.057 回答
1

EGL 图像扩展可用于分配带有指针的纹理,这些指针可用于直接访问纹理图像数据。通常,这比使用 glTexImage2D() 快得多。我没有适用于 iOS 的示例代码,但本文中有适用于 Linux 和 Android 的示例代码:

http://software.intel.com/en-us/articles/using-opengl-es-to-accelerate-apps-with-legacy-2d-guis

于 2013-06-28T00:20:56.223 回答