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

Opengl es 使用OpenGL ES 2.0传输纹理的最快方法是什么?,opengl-es,opengl-es-2.0,Opengl Es,Opengl Es 2.0,由于像素缓冲区对象在OpenGL ES 2.0中不可用,将纹理传输到GPU(然后再传输回来)的最快方法是什么?我们是否可以使用iPad2或更高版本的扩展 不幸的是,我不能使用压缩纹理,因为纹理(RGBA8)是在应用程序的另一部分中动态生成的。EGL图像扩展可用于分配纹理,并使用指针直接访问纹理图像数据。通常,这比使用glTexImage2D()要快得多。我没有iOS的示例代码,但本文中有Linux和Android的示例代码: 对于iOS(鉴于这里提到的是iPad,我假设是您的平台),最快的进出未

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


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

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

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

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

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


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

我使用Brad的示例从纹理缓存中获取GL纹理,这有效地消除了传输时间。这看起来是一个有趣的读取,但iOS上似乎不存在
EGL/eglext.h
。我在其他地方也看到了证据(比如)iOS不支持EGL扩展。这是正确的。iOS使用Apple EAGL而不是Khronos EGL。