有没有办法在Android上使用OpenGL在两个上下文/线程之间共享纹理?

时间:2013-06-07 06:21:18

标签: android opengl-es opengl-es-2.0 textures

我想要两个主题。一个线程使用FBO写入纹理,另一个线程使用它渲染到屏幕。 这可以在Windows等上完成,但我如何在Android上完成? 我正在使用GL ES 2,并且正在使用Textureview 我已经阅读了关于egl图像扩展但我无法弄清楚使用它们 http://www.khronos.org/registry/egl/extensions/KHR/EGL_KHR_image.txt http://www.khronos.org/registry/egl/extensions/KHR/EGL_KHR_image_base.txt 我读到所有平台都不完全支持egl扩展。可以在Android上使用它吗? 我不能使用不能保证正常工作的东西。

这是我在此链接中阅读的内容: http://www.khronos.org/message_boards/showthread.php/7319-EGLImage-on-Android-NDK

  1. 现在新的TextureView类已经添加了Android 4.0,因此在Android上不需要EGL图像扩展。使用TextureView在OpenGL ES和Canvas API之间传输纹理图像。
  2. 我正在使用TextureView。如何使用它来“传输纹理图像”?

    此外,我在某处读到,egl默认将纹理定义为共享。这是什么意思?如果纹理已经定义为共享,如何在不同的上下文中使用该纹理?

    我不希望在另一个线程中创建相同的上下文,因为我希望在不阻止渲染到屏幕的情况下完成纹理加载。这有意义吗? 我对OpenGL没有多少经验。

    显然,firefox使用的是我尝试使用的相同内容  http://snorp.net/2011/12/16/android-direct-texture.html 但我无法理解我应该怎么做。

    我使用的是Java,而不是NDK。

1 个答案:

答案 0 :(得分:1)

您已经描述了默认情况下OpenGL ES在Android上的工作方式。换句话说,您使用TextureView提供的SurfaceTexture通过一个线程渲染OpenGL ES。 Android的Surfaceflinger然后将SurfaceTexture复合到显示器上,作为普通View合成的一部分 - 由另一个线程组成。

EGL图像扩展用于获取指向表面的指针,这需要本机代码并且是不必要的。请改用TextureView。有一个示例应用程序在Android SDK中使用TextureView(尽管它使用SurfaceTexture进行摄像机视频而不是OpenGL ES渲染):

sources\android-17\com\android\test\hwui\GLTextureViewActivity.java

因此,使用SurfaceTexture(在创建TextureView时提供给onSurfaceTextureAvailable()回调)来创建带有eglCreateWindowSurface()的EGL Surface。 SurfaceTexture将成为您的OpenGL ES渲染的目标,它将显示在相关的TextureView中。

EGLSurface EglSurface = mEgl.eglCreateWindowSurface(mEglDisplay, maEGLconfigs[0], surfaceTexture, null);
mEgl.eglMakeCurrent(mEglDisplay, EglSurface, EglSurface, mEglContext);

我认为这篇文章会有所帮助:

http://software.intel.com/en-us/articles/porting-opengl-games-to-android-on-intel-atom-processors-part-1