我想要两个主题。一个线程使用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
我正在使用TextureView。如何使用它来“传输纹理图像”?
此外,我在某处读到,egl默认将纹理定义为共享。这是什么意思?如果纹理已经定义为共享,如何在不同的上下文中使用该纹理?
我不希望在另一个线程中创建相同的上下文,因为我希望在不阻止渲染到屏幕的情况下完成纹理加载。这有意义吗? 我对OpenGL没有多少经验。
显然,firefox使用的是我尝试使用的相同内容 http://snorp.net/2011/12/16/android-direct-texture.html 但我无法理解我应该怎么做。
我使用的是Java,而不是NDK。
答案 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);
我认为这篇文章会有所帮助: