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

时间:2016-02-02 03:15:31

标签: android opengl-es shader surfaceview

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

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

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

有人可以建议一种渲染纹理两次的方法,最终渲染会转移到SurfaceTexture吗?

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

编辑:这个问题被我提出了一些误解。 SurfaceTexture不是显示元素。它改为从曲面接收数据,并附加到GL_TEXTURE_EXTERNAL_OES。

谢谢。

1 个答案:

答案 0 :(得分:1)

渲染到SurfaceTexture在这里做起来似乎很奇怪。 SurfaceTexture的目的是获取发送到Surface的任何内容并将其转换为GLES"外部"质地。由于您使用GLES进行渲染,因此您可以使用FBO渲染到video以进行第二次传递。

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