如何将 OpenGL 上下文中的纹理复制到另一个上下文

vgo*_*anz 4 android textures opengl-es surfaceview android-mediacodec

我正在尝试使用 OpenGL ES 2 上下文在 Android 上使用 MediaCodec 录制视频。

为此,我想使用以下方法使用可记录表面:

private static final int EGL_RECORDABLE_ANDROID = 0x3142;
Run Code Online (Sandbox Code Playgroud)

创建一个新的上下文。实际上,我正在我的第一个上下文中在纹理中渲染一个场景。我想在新的上下文中呈现它以将数据发送到 MediaCodec。

我正在尝试使用Recording 补丁执行与突破教程相同的操作

我在我的游戏中实现了 InputSurface 和 GameRecorder,但我只记录了一个空场景。

我的主要问题是,上下文不共享相同的 OpenGL 对象,我不知道这样做的最佳解决方案。

我如何发送最终图像渲染或整个场景以在同一线程中渲染以避免线程问题,以正确记录表面?

fad*_*den 5

首先查看Grafika中的“Record GL app with FBO”活动。它演示了三种不同的游戏视频录制方法(嗯,两种有效,一种将来会有效)。

您可以创建一个 EGL“共享组”并将两个上下文放入其中,这就是 Breakout 游戏记录器补丁和 Grafika“显示 + 捕获相机”活动所做的。这有点尴尬,GLSurfaceView因为您对上下文的生命周期没有太多控制,但是如果您想在方向更改和屏幕关闭期间保持记录状态活动,它就足够了。

另一种方法是认识到 aSurface是进程间缓冲区队列的消费者端,即使渲染和记录发生在不同的线程中,您实际上也不需要单独的上下文;相反,您只需要EGLSurface在同一个EGLContext. 这就是“Record GL app with FBO”代码的工作原理。它使用一个普通的SurfaceView来完全控制 EGL 上下文,但GLSurfaceView如果你对上下文管理很小心,你应该能够做类似的事情。

该活动演示了 Breakout 中使用的方法(绘制场景两次)、第二种渲染到 FBO 然后渲染渲染结果的技术,以及第三种需要glBlitFramebuffer()GLES3 且不适用于任何 API 19 设备的技术。我试过了。