您绘制的内容的复杂性无关紧要。你画你要画的任何东西,然后调用eglSwapBuffers()
提交缓冲区。无论您绘制一个平面阴影三角形还是 100K 超级阴影三角形,您仍然只是将数据缓冲区提交给视频编码器或表面合成器。
没有等效于 SurfaceView 的surfaceCreated()
and surfaceChanged()
,因为 Surface 是由创建的MediaCodec#createInputSurface()
(所以你知道它是什么时候创建的),并且 Surface 不会改变。
使用 GeneratedMovie 的代码进行了一些相当简单的渲染(设置 scissor rect,调用 clear)。RecordFBOActivity 中的代码可能是您应该看到的——它有一个弹跳的矩形和一个旋转的三角形,并演示了三种不同的方法来处理您必须渲染两次的事实。
(HardwareScalerActivity 中的代码使用相同的 GLES 例程并演示纹理,但它不进行记录。)
关键是要仔细管理您的 EGLContext 和 EGLSurfaces。GLES 状态的各个位保存在 EGLContext 中,一次只能在一个线程上保持当前状态。使用单个上下文并为每个 Surface 设置单独的 EGLSurface 是最简单的,但您也可以创建单独的上下文(有或没有共享)并在它们之间切换。
一些额外的背景材料可在此处获得。