美文网首页
opengl转场效果

opengl转场效果

作者: 旁界001 | 来源:发表于2019-07-06 17:34 被阅读0次
    • 前提
      上一篇文章说到ffmpeg合成转场效果,后来发现这样的方案行不通的,一是合成时间太慢,而是需要实时的查看转场的效果,所以应该要动态查看转场的效果。所以用opengl实现转场方案最合适不过了

    • 实现步骤:
      图片转场:两个图片进行切换是,传入前一张和当前张图片的纹理到转场的(transitionfilter)滤镜中,在图片切换的时候,展示transitionfilter
      视频转场:截取当前视频的第一帧和上一视频的最后一帧图片,同样给transitionfilter赋值,在视频切换的时候,显示transitionfilter

    • 搭建环境注意点
      因为用到opengl,所以得要用glsurfaview去承载渲染,对于视频而言,根据相机用glsurfaview显示一个道理

    SurfaceTexture surfaceTexture = mOpenglDrawer.getSurfaceTexture();
    surfaceTexture.setOnFrameAvailableListener(new SurfaceTexture.
    OnFrameAvailableListener() {
        @Override
        public void onFrameAvailable(SurfaceTexture surfaceTexture) {
            requestRender();
        }
    });
    Surface surface = new Surface(surfaceTexture);
    mMediaPlayer.setSurface(surface);
    if (isCurrentVideo()) {
        mMediaPlayer.prepare();
        mOpenglDrawer.setInputTextureVideo();
    }
    

    对于图片,则手动去推动,按照一秒25帧默认,那么就是40ms推动一次渲染
    剩下就是编写opengl的fragment片段的事情了,不过对于视频帧的转场而言,需要对纹理进行转化一下,因为最开始视频进来的fragment定义的纹理对象是uniform samplerExternalOES vTexture;
    所以需要创建一层FBO:

       GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height,
                        0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);
    

    然后从FBO刷新出来的纹理便是sampler2D了,在用这个纹理去做transitionfilter的转场

    • 代码演示
      放一个最简单的移动切换的fragment代码:
    varying vec2 textureCoordinate;
    uniform float progress;
    uniform sampler2D vTexture;
    uniform sampler2D vTexture1;
    uniform vec2 direction;
    void main(){
    vec2 p = textureCoordinate +  progress*sign(direction);
    float m =step(0.0, p.y) * step(p.y, 1.0) * step(0.0, p.x) * step(p.x, 1.0);
    vec4 color = mix(texture2D(vTexture, textureCoordinate),
    texture2D(vTexture1, textureCoordinate), m);
    gl_FragColor = vec4(color);
    }
    

    丰富的转场案例可以从这里得到:
    https://gl-transitions.com/gallery
    这个网站中,uv转化成自己的纹理坐标, getFromColor(uv)换成自己的纹理:比如上面的我第一张纹理是texture2D(vTexture, textureCoordinate)
    getToColor(uv)换成第二张纹理:对应我自己的是texture2D(vTexture1, textureCoordinate)

    下篇文章介绍带转场效果、滤镜的多视频多图片的视频合成

    相关文章

      网友评论

          本文标题:opengl转场效果

          本文链接:https://www.haomeiwen.com/subject/wjxmhctx.html