【问题标题】:Android: Is it possible to create a SurfaceTexture without a SurfaceView?Android:是否可以在没有 SurfaceView 的情况下创建 SurfaceTexture?
【发布时间】:2014-06-16 05:41:12
【问题描述】:

我想用我可以管理的 OpenGL 纹理创建一个 SurfaceTexture,设置类似于this answer。 (此处引用:)

  1. 通过 OpenGL 创建纹理
  2. 将此纹理传递给新 SurfaceTexture 的构造函数。
  3. 将此新的 SurfaceTexture 赋予相机。
  4. 确保您使用的是 OES_External(请参阅文档 详情)。

但是,创建 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,然后根据需要创建 framebuffers。使用 EGL,您似乎总是需要一个原生窗口。

【问题讨论】:

    标签: android opengl-es android-ndk egl


    【解决方案1】:

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

    您确实需要一个 EGLSurface,但它不需要是一个 window 表面。您可以创建一个 1x1 pbuffer 表面并使用它。这是通过eglCreatePbufferSurface() 调用完成的;以 Grafika 中的 EglCore 类为例。

    这些示例是用 Java 编写的,但 Java 实现只是包装了本机 EGL/GLES 调用。

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

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

    【讨论】:

    • 非常感谢。我一直在使用 ANativeWindow_fromSurface() 并且效果很好,但它仍然需要 Java 端的 Surface。我将尝试使用 pbuffer 选项。我在另一个问题中读到 Pbuffers 并不适用于所有设备,对吗?
    • 我不知道 pbuffers 的问题。
    • 是的。看看 Grafika,这是一个很棒的项目。
    • @fadden:在 NDK(没有 AOSP/GraphicBuffer)中,我选择了一个合适的 EGL_NATIVE_VISUAL_ID 配置,我成功创建了一个 PbufferSurface,创建了一个上下文并使用这些 @ 987654332@、surfacecontext。我需要将什么作为(EGLClientBuffer) 传递给eglCreateImageKHR()?从我读过的内容来看,它应该以某种方式使用ANativeWindow,但我不知道怎么用!
    • @user1906:您是否设法使用带有eglCreateImageKHR() 的pbuffer 进行直接渲染?
    猜你喜欢
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2020-05-15
    • 2013-08-21
    • 2021-04-07
    • 2021-02-03
    相关资源
    最近更新 更多