【问题标题】:Is there a way to share a texture between two contexts / threads using OpenGL on Android?有没有办法在 Android 上使用 OpenGL 在两个上下文/线程之间共享纹理?
【发布时间】:2013-06-03 08:58:18
【问题描述】:

我想要两个线程。一个线程使用 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 扩展并非在所有平台上都得到完全支持。可以在安卓上使用吗? 我不能使用不能保证正常工作的东西。

这是我在这个链接上读到的: http://www.khronos.org/message_boards/showthread.php/7319-EGLImage-on-Android-NDK

  1. 在 Android 4.0 中添加了新的 TextureView 类后,EGL 图像扩展就不再是必需的了。使用 TextureView 在 OpenGL ES 和 Canvas API 之间传输纹理图像。

我正在使用 TextureView。如何使用它来“传输纹理图像”?

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

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

显然,firefox 使用了与我尝试使用相同的东西 http://snorp.net/2011/12/16/android-direct-texture.html 但我不明白我应该怎么做。

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

【问题讨论】:

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


    【解决方案1】:

    您已经描述了默认情况下 OpenGL ES 在 Android 上的工作方式。也就是说,你使用TextureView提供的SurfaceTexture,通过一个线程来渲染OpenGL ES。然后,Android 的 Surfaceflinger 会将该 SurfaceTexture 合成到显示器,作为其正常视图合成的一部分 - 通过另一个线程。

    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

    【讨论】:

    • 我不确定这是不是我想要做的。如果我使用 SurfaceTexture,我能否控制绘制纹理的哪一部分?这就是我想要做的:纹理会很大。它的一部分应该显示在 TextureView 上。在 Touch 事件中,显示的纹理部分会发生变化。
    • 我建议您更改在一个 SurfaceTexture 上呈现的内容。但是,您可以绑定第一个 SurfaceTexture 以将其作为具有纹理坐标的纹理来处理,以将其渲染到另一个 SurfaceTexture(渲染到纹理),这将是 TextureView 显示的那个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 2012-08-14
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多