2016-02-02 147 views
1

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

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

这里有一些例子,但它们都不适用,因为SurfaceTexture在glBindTexture中使用GL_TEXTURE_EXTERNAL_OES作为其目标,而不是GL_TEXTURE_2D。因此,在调用glFramebufferTexture2D时,不能将GL_TEXTURE_2D用作文本目标,我认为GL_TEXTURE_EXTERNAL_OES不能用于此调用。

任何人都可以提出一种方法来渲染纹理两次,最终渲染到SurfaceTexture?

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

编辑:这个问题被问及我的一些误解。 SurfaceTexture不是显示元素。它接收来自曲面的数据,并将其附加到GL_TEXTURE_EXTERNAL_OES。

谢谢。

+0

我一直使用GL_TEXTURE_2D。由于某种原因,这不适合你吗? –

+0

当我使用GL_TEXTURE_EXTERNAL_OES作为glBindTexture的目标时,无论我在该调用中使用GL_TEXTURE_2D还是GL_TEXTURE_EXTERNAL_OES,在glFramebufferTexture2D中传递相同的纹理名称时,都会得到无效的操作错误。如果glBindTexture中的目标是GL_TEXTURE_2D,绑定似乎可行,但显然我无法再将FBO渲染到SurfaceTexture。 – Michael

回答

0

渲染到SurfaceTexture在这里看起来很奇怪。 SurfaceTexture的要点是将任何发送到Surface的东西都转换为GLES“外部”纹理。由于您使用GLES进行渲染,因此您可以使用FBO将其渲染为第二阶段的GL_TEXTURE_2D

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

+0

我忽略的一个重要细节是,这是一个动态模糊的视频播放到表面,所以这就是我选择使用SurfaceTexture的原因。是否有可能渲染两次,最后渲染到SurfaceTexture,还是需要找到不同的方法? – Michael

+0

因此...视频解码器 - > SurfaceTexture,将该纹理渲染为具有水平模糊的FBO,将FBO渲染为具有垂直模糊的SurfaceView。 (我们是否使用相同的单词?SurfaceTexture是一个有效的EGL图形转换器,没有显示组件,而SurfaceView和TextureView转到了显示器上.SurfaceView是用SurfaceTexture实现的,但在这里并不重要,另请参见https:/ /source.android.com/devices/graphics/architecture.html。) – fadden

+0

@fadden以及如果输入来自相机?并且GL_TEXTURE_EXTERNAL_OES会被相机更新,并应用双通道模糊处理。如何用fbo实现这一点? –