我想在类似于 this answer 的设置中创建一个带有我可以管理的 OpenGL 纹理的 SurfaceTexture . (此处引用:)
- Create a texture through OpenGL
- Pass this texture to the constructor of new SurfaceTexture.
- Give this new SurfaceTexture to the camera.
- Make sure you are using OES_External (see documentation for details).
但是,创建 OpenGL 纹理(如答案的第 1 步)需要一个 EGL 上下文,这需要一个 EGLSurface 成为当前的,这需要一个 SurfaceTexture。创建 EGL 上下文的唯一方法似乎是创建一个 SurfaceView(或另一个具有 SurfaceTexture 的 View ),并使用它来初始化 EGLSurface,然后使 EGLContext 成为当前 View 。
我的目标是创建一个 EGLContext 并使其在后台线程中处于当前状态,以便对相机预览图像进行一些屏幕外计算(主要使用 NDK)。我想创建一个库,并使其尽可能独立于 UI。两个相关问题:
在 Java 方面,是否可以在不事先创建 SurfaceTexture 的情况下创建 EGLContext?
在 NDK 方面,曾经有一个私有(private) API 调用来创建 native 窗口 android_createDisplaySurface()
,但它不再起作用了,好吧,它是一个私有(private) API。有什么方法可以使用 NDK 创建表面吗?
我对使用 EGL 很陌生,我不明白为什么需要 EGLSurface 才能使 EGLContext 成为最新的。在iOS中,可以先创建EAGLContexts,然后根据需要创建framebuffers。使用 EGL,您似乎总是需要一个 native 窗口。
最佳答案
您可以在 Grafika 中看到许多操作相机输出、SurfaceTexture 和 EGL 的示例. “连续捕获” Activity 是其中之一,但它使用了您提到的技术:为了避免必须创建 EGLSurface,它只是从附近的 SurfaceView 借用了一个。
您确实需要有一个 EGLSurface,但它不需要是一个窗口 表面。您可以创建一个 1x1 pbuffer 表面并直接使用它。这是通过 eglCreatePbufferSurface()
调用完成的;有关示例,请参见 Grafika 中的 EglCore 类。
这些示例是用 Java 编写的,但 Java 实现只是包装了 native EGL/GLES 调用。
android_createDisplaySurface()
是一个内部调用,正如您所发现的,它在较新的设备上不起作用。而是在 NDK 中搜索 ANativeWindow
。
更新:对于通过搜索到达此处的任何人,android_createDisplaySurface()
依赖于一个名为 FramebufferNativeWindow
的内部类,该类在Android 5.0 this change .使用它的内部 OpenGL ES 测试代码在 this change 中更新为基于 SurfaceFlinger 的替代品.原始版本的测试代码需要关闭 Android 应用程序框架才能获取帧缓冲区;较新的版本只要求 SurfaceFlinger 提供一个覆盖屏幕并合成在其他所有内容之上的窗口。
关于Android:是否可以在没有 SurfaceView 的情况下创建 SurfaceTexture?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23378993/