OpenGL 纹理到 AHardwareBuffer
OpenGL textures into AHardwareBuffer
我在 Android 中遇到了 AHardwareBuffer
。我想利用 AHardwareBuffer 来存储纹理,这样我就可以在没有 OpenGL 上下文的不同线程上使用它们。目前,我正在执行以下操作:
- 生成纹理并将其绑定到
GL_TEXTURE_2D
。
- 从中创建
EGLClientBuffer
和 EGLImageKHR
。附加 EGLImage 作为纹理目标。
- 生成一个 FBO 并使用
glFramebufferTexture2D
将其绑定到纹理。
- 为了绘制纹理(比如
tex
),我使用着色器 将其渲染到 AHardwareBuffer
但是,我想要离开,这样我就不需要将它重新渲染到硬件缓冲区上,而是直接将纹理数据存储到硬件缓冲区上。
我正在考虑使用 glCopyTexImage2d
来执行此操作。这样可以吗?
另外(一个愚蠢的问题,但我无法克服)如果我将我的 EGLImage
从硬件缓冲区附加到 GL_TEXTURE_2D
并使用 glTexImage2D 定义纹理,它不会存储数据吗将作为 glTexImage2D
参数的纹理放入硬件缓冲区?
我使用 glSubTexImage2D
解决了这个问题。
首先创建一个opengl纹理并将其绑定到GL_TEXTURE_2D
。
然后使用 glEGLImageTargetTexture2DOES
将纹理绑定到从 EGLClientBuffer 创建的 EGLImageKHR
。这类似于 glTexImage2D
。对 glTexImage2D
的任何后续调用都会破坏纹理和 EGLClientBuffer 之间的关系。
参考:https://www.khronos.org/registry/OpenGL/extensions/OES/OES_EGL_image_external.txt
但是 glSubTexImage2D
保留了这种关系。因此我们可以用这个 API 加载数据并将其存储在 AHardwareBuffer
.
PS:这可能是我的一种方式,如果有其他方式,我会接受答案。
我在 Android 中遇到了 AHardwareBuffer
。我想利用 AHardwareBuffer 来存储纹理,这样我就可以在没有 OpenGL 上下文的不同线程上使用它们。目前,我正在执行以下操作:
- 生成纹理并将其绑定到
GL_TEXTURE_2D
。 - 从中创建
EGLClientBuffer
和EGLImageKHR
。附加 EGLImage 作为纹理目标。 - 生成一个 FBO 并使用
glFramebufferTexture2D
将其绑定到纹理。 - 为了绘制纹理(比如
tex
),我使用着色器 将其渲染到
AHardwareBuffer
但是,我想要离开,这样我就不需要将它重新渲染到硬件缓冲区上,而是直接将纹理数据存储到硬件缓冲区上。
我正在考虑使用 glCopyTexImage2d
来执行此操作。这样可以吗?
另外(一个愚蠢的问题,但我无法克服)如果我将我的 EGLImage
从硬件缓冲区附加到 GL_TEXTURE_2D
并使用 glTexImage2D 定义纹理,它不会存储数据吗将作为 glTexImage2D
参数的纹理放入硬件缓冲区?
我使用 glSubTexImage2D
解决了这个问题。
首先创建一个opengl纹理并将其绑定到GL_TEXTURE_2D
。
然后使用 glEGLImageTargetTexture2DOES
将纹理绑定到从 EGLClientBuffer 创建的 EGLImageKHR
。这类似于 glTexImage2D
。对 glTexImage2D
的任何后续调用都会破坏纹理和 EGLClientBuffer 之间的关系。
参考:https://www.khronos.org/registry/OpenGL/extensions/OES/OES_EGL_image_external.txt
但是 glSubTexImage2D
保留了这种关系。因此我们可以用这个 API 加载数据并将其存储在 AHardwareBuffer
.
PS:这可能是我的一种方式,如果有其他方式,我会接受答案。