如何“将片段着色器应用于GLSurfaceView / TextureView”?

时间:2016-02-26 15:52:28

标签: android opengl-es exoplayer

我的目标是让ExoPlayer将彩色视频显示为黑白色。

根据这个this Github issue,我应该能够通过Open GL实现这一目标:

  

ExoPlayer会将视频渲染到任何Surface。你可以用   SurfaceTexture,此时你将视频渲染成一个   OpenGL ES纹理。一旦你有了,你可以做任何OpenGL   让你这样做,包括使用像素着色器将视频转换为   黑与白。

an older, but related, discussion in the Android Developers Google group中,Romain Guy提供了一些有关如何完成此操作的详细信息:

  
      
  • 创建OpenGL上下文
  •   
  • 生成OpenGL纹理名称
  •   
  • 使用纹理名称
  • 创建SurfaceTexture   
  • 将SurfaceTexture传递给相机
  •   
  • 监听更新在SurfaceTexture更新中,使用绘制纹理   使用你想要的着色器的OpenGL
  •   
     

简单:)

通过玩Google's Cardboard example project,我已经确定像下面这样的片段着色器应该是正确的:

precision mediump float;
varying vec4 v_Color;

void main() {
    float grayscale = v_Color[0] * 0.3 + v_Color[1] * 0.59 + v_Color[2] * 0.11;
    gl_FragColor = vec4(grayscale, grayscale, grayscale, 0.1);
}

我还设法将ExoPlayer呈现为TextureView,而不是通常的SurfaceView

mPlayer.sendMessage(
    videoRenderer,
    MediaCodecVideoTrackRenderer.MSG_SET_SURFACE,
    new Surface(mVideoTextureView.getSurfaceTexture())
);

现在,如何将所有内容连接在一起?

在哪里可以将着色器“应用”到TextureView?这是可能的还是我应该使用GLSurfaceView?我需要在Renderer

中做些什么

1 个答案:

答案 0 :(得分:1)

我之前已经将片段着色器应用于由ExoPlayer播放的视频。最有效的方法似乎是将视频播放到GLSurfaceView,因为它们对自定义渲染器有很好的支持。

可以从here获得将{0}应用于OpenGL着色器的工作示例。它甚至已经将灰度片段着色器作为其effects library的一部分。现有代码需要进行一些小的重构,因为它使用GLSurfaceView而不是MediaPlayer