如何在不显示的情况下使用 OpenGL?

How to use OpenGL without displaying it?

对于一个应用程序,即使当前未显示该应用程序,我也想在后台呈现内容。官方文档写道通过 GLSurfaceView 打开 GLcontext。对于不显示图形和渲染到另一个目标似乎没有真正的解决方案。

所以问题是如何在 Android 中创建没有 GLSurfaceView 的 GL 上下文?

用例:录制视频并将当前时间作为文本直接添加到视频中。对于基于 CPU 的图像处理来说,现场执行速度太慢了。至少如果视频也应该在录制时显示。 OpenGL 可以将所有内容简单地渲染成 Framebuffer/Renderbuffer.

已回答here and here

我认为最简单的是第二个 link 中描述的内容,他们说:

将其视图大小设置为 1 像素和 1 像素,使其可见(用户看不到)并在 OnDraw 中将 FBO 绑定到主纹理并渲染它

因此您仍会创建一个 GLSurfaceView(只是为了获取上下文),但您会将其设为 1x1 且不可见。

或者您可以按照我的评论中的建议使用半透明的 GLSurfaceView(我不确定这是否适用于任何设备,设置起来似乎有点棘手)。

您不必使用 GLSurfaceView 进行 OpenGL 渲染。如果您查看 source code,您会发现它仅使用公开可用的 API。这仅仅是一个方便 class 使得在 Android 下最常见的 OpenGL 使用(使用 OpenGL 绘制视图的内容)变得非常容易。如果您的用例不同,那么您就...不要使用它。

您用来更直接地创建上下文和渲染表面的 API 是 EGL。 Android Java 框架中有两个版本可用:EGL10 and EGL14。 EGL10 很旧,我强烈建议使用 EGL14。

EGL 调用并未真正记录在 Android SDK 文档中,但您可以使用 man pages on www.khronos.org 查看调用说明。

直接使用 EGL,您可以创建一个上下文和一个屏幕外渲染表面,这样您就可以在没有任何视图的情况下使用 OpenGL。

我在之前的回答中发布了完整的代码,展示了如何使用屏幕外渲染表面创建上下文:GLES10.glGetIntegerv returns 0 in Lollipop only