使用OpenGL ES 2.0传输纹理的最快方法是什么?

时间:2013-06-27 09:38:15

标签: opengl-es opengl-es-2.0

由于Pixel Buffer Objects在OpenGL ES 2.0中不可用,将纹理传输到GPU(又返回)的最快方法是什么?我们可以使用iPad 2或更高版本的扩展吗?

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

2 个答案:

答案 0 :(得分:2)

对于iOS(在这里提到iPad,我假设是你的平台),往返于未压缩纹理的最快方式是通过纹理缓存。这些是在iOS 5.0中引入的,基本上是在纹理的后备字节和本地内存字节缓冲区之间进行直接内存映射。

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

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

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

答案 1 :(得分:0)

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

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