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

时间:2014-02-10 11:58:21

标签: android opengl-es textures surfaceview mediacodec

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

为此,我想使用:

来使用可记录的表面
private static final int EGL_RECORDABLE_ANDROID = 0x3142;

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

我尝试使用this

Recording patch突破教程相同

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

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

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

1 个答案:

答案 0 :(得分:4)

首先查看Grafika中的“使用FBO记录GL应用”活动。它展示了三种不同的游戏视频录制方式(好吧,两个有效,一个有用)。

您可以创建一个EGL“共享组”并将两个上下文放入其中,这就是Breakout游戏记录器补丁和Grafika“Show + capture camera”活动所做的事情。这对于GLSurfaceView来说有点尴尬,因为你对上下文的生命周期没有多少控制权,但是如果你想在方向改变和屏幕关闭期间保持记录状态存活,那么它就足够了。

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

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