【问题标题】:Android: Dual Pass Render To SurfaceTexture Using OpenGLAndroid:使用 OpenGL 对 SurfaceTexture 进行双通道渲染
【发布时间】:2016-02-02 03:15:31
【问题描述】:

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

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

有一些这样的例子,但它们似乎都不适用,因为 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。

谢谢。

【问题讨论】:

  • 我一直使用 GL_TEXTURE_2D。由于某种原因,这对您不起作用吗?
  • 当我使用 GL_TEXTURE_EXTERNAL_OES 作为 glBindTexture 的目标时,在 glFramebufferTexture2D 中传递相同的纹理名称时出现无效操作错误,无论我在该调用中使用的是 GL_TEXTURE_2D 还是 GL_TEXTURE_EXTERNAL_OES。如果 glBindTexture 中的目标是 GL_TEXTURE_2D,绑定似乎可以工作,但显然我不能再将 FBO 渲染到 SurfaceTexture。

标签: android opengl-es shader surfaceview


【解决方案1】:

在这里渲染到 SurfaceTexture 似乎是一件奇怪的事情。 SurfaceTexture 的重点是将发送到 Surface 的任何内容转换为 GLES“外部”纹理。由于您使用 GLES 进行渲染,因此您可以只使用 FBO 渲染到 GL_TEXTURE_2D 进行第二次传递。

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

【讨论】:

  • 我遗漏的一个重要细节是,这是播放到表面的视频的动态模糊,所以这就是我选择使用 SurfaceTexture 的原因。是否可以渲染两次,最终渲染到 SurfaceTexture,还是需要找到不同的方法?
  • 所以...视频解码器-> SurfaceTexture,用水平模糊将该纹理渲染到 FBO,用垂直模糊将 FBO 渲染到 SurfaceView。 (我们是否使用相同的词?SurfaceTexture 实际上是一个没有显示组件的 EGL 图形转换器,而 SurfaceView 和 TextureView 进入显示。TextureView 是使用 SurfaceTexture 实现的,但这并不重要。另见source.android.com/devices/graphics/architecture.html .)
  • @fadden 如果输入来自相机怎么办?并且应该对由相机更新的 GL_TEXTURE_EXTERNAL_OES 应用双通道模糊。如何使用 fbo 实现这一点?
  • 我认为可以通过将 OES 纹理渲染到屏幕外 fbo,然后取出屏幕外纹理并将其提供给另一个使用带有 sampler2D 纹理的片段着色器的程序来实现
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 2022-06-20
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多