Android:使用 OpenGL 双通道渲染到 SurfaceTexture

Android: Dual Pass Render To SurfaceTexture Using OpenGL

为了在 SurfaceTexture 上执行高斯模糊,我正在执行双通道渲染,这意味着我正在通过一个着色器(水平模糊)然后通过另一个着色器(垂直模糊)传递纹理。

我理解这背后的理论:将第一个纹理渲染到 FBO,将第二个纹理渲染到 SurfaceTexture 本身。

有一些这样的示例,但其中 none 似乎适用,因为 SurfaceTexture 在 glBindTexture 中使用 GL_TEXTURE_EXTERNAL_OES 作为其目标而不是 GL_TEXTURE_2D。因此,在glFramebufferTexture2D的调用中,GL_TEXTURE_2D不能用作textarget,我认为GL_TEXTURE_EXTERNAL_OES也不能用于此调用。

任何人都可以建议一种方法来渲染两次纹理,最后一次渲染到 SurfaceTexture 吗?

重要更新:我正在使用 SurfaceTexture,因为这是在表面上播放的视频的动态模糊。

编辑:问这个问题是因为我有一些误解。 SurfaceTexture 不是显示元素。它改为从表面接收数据,并附加到 GL_TEXTURE_EXTERNAL_OES.

谢谢。

在这里渲染到 SurfaceTexture 似乎是一件奇怪的事情。 SurfaceTexture 的要点是获取发送到 Surface 的任何内容并将其转换为 GLES "external" 纹理。由于您使用 GLES 进行渲染,因此您可以只使用 FBO 来渲染第二遍的 GL_TEXTURE_2D

从相机或视频解码器接收帧时使用 SurfaceTexture,因为源通常是 YUV。 "external" 纹理格式允许更广泛的像素格式,但限制了纹理的使用。如果您的目标是创建 GLES 纹理,则使用 GLES 渲染到 SurfaceTexture 没有任何价值。