Android:是否可以在没有SurfaceView的情况下创建SurfaceTexture?

时间:2014-04-30 03:08:22

标签: android opengl-es android-ndk egl

我想在类似this answer的设置中创建一个我可以管理的OpenGL纹理的 SurfaceTexture 。 (引用来自:)

  
      
  1. 通过OpenGL创建纹理
  2.   
  3. 将此纹理传递给新SurfaceTexture的构造函数。
  4.   
  5. 将这个新的SurfaceTexture提供给相机。
  6.   
  7. 确保您使用的是OES_External(请参阅相关文档   详情)。
  8.   

但是,创建OpenGL纹理(如答案的第1步),需要 EGL上下文,这需要使EGLSurface成为当前,这需要SurfaceTexture。似乎创建EGL上下文的唯一方法是创建一个SurfaceView(或具有SurfaceTexture的其他视图),并使用它初始化EGLSurface,然后使EGLContext为当前。

我的目标是创建一个EGLContext并使其在后台线程中显示,在相机预览图像上进行一些屏幕外计算(主要使用NDK)。我想创建一个库,并使其尽可能独立于UI。两个相关问题:

在Java方面,是否可以在不事先创建SurfaceTexture的情况下创建EGLContext?

在NDK方面,曾经有一个私有API调用来创建本机窗口android_createDisplaySurface(),但它不再起作用,而且它是一个私有API。有没有办法用NDK创建表面?

我很擅长使用EGL,但我不明白为什么你需要一个EGLSurface来使EGLContext成为最新的。在iOS中,可以首先创建EAGLContexts,然后根据需要创建帧缓冲区。使用EGL似乎总是需要一个原生窗口。

1 个答案:

答案 0 :(得分:6)

您可以在Grafika中看到许多操作Camera输出,SurfaceTexture和EGL的示例。 “连续捕获”活动是一个,但它使用您提到的技术:为了避免创建EGLSurface,它只是借用附近SurfaceView中的那个。

您确实需要EGLSurface,但它不需要是窗口表面。您可以创建1x1 pbuffer表面并使用它。这是通过eglCreatePbufferSurface()电话完成的;请参阅格拉菲卡的EglCore课程。

这些示例使用Java,但Java实现只包含本机EGL / GLES调用。

android_createDisplaySurface()是一个内部调用,正如您所发现的那样,它不适用于较新的设备。搜索NDK代替ANativeWindow

更新:对于通过搜索到达此处的所有人,android_createDisplaySurface()依赖于名为FramebufferNativeWindow的内部类,该内容类已在this change的Android 5.0中标记为已废弃。使用它的内部OpenGL ES测试代码在this change中使用基于SurfaceFlinger的替换进行了更新。测试代码的原始版本需要关闭Android应用程序框架,以便它可以获取帧缓冲区;较新版本只是要求SurfaceFlinger提供一个覆盖屏幕的窗口,并在其他所有窗口之上进行合成。