阅读 125

OpenGL ES 仿抖音四屏镜像乱画

最近抖音上有个四分镜像的特效挺有意思,通过四分镜像一通乱画,能画出相当于窗花的效果。实现原理看着也比较简单,就随手实践下。


抖音四屏镜像

摄像头的预览及四分屏效果参见OpenGL ES入门4-预览摄像头并叠加三角形
。其实原理很简单,只要对片元着色器进行处理就可以。

片元着色器代码如下:

#extension GL_OES_EGL_image_external : require
precision mediump float;
uniform samplerExternalOES videoTex;
varying vec2 textureCoordinate;

void main() {
    vec2 uv = textureCoordinate;
    if(uv.x <= 0.5 && uv.y <= 0.5){
        uv.x = uv.x * 2.0;
        uv.y = uv.y * 2.0;
    }else if(uv.x >=0.5 && uv.y <=0.5){
        uv.x = 1.0 -(uv.x - 0.5) * 2.0;
        uv.y = uv.y * 2.0;
    }else if(uv.x <= 0.5 && uv.y >=0.5){
        uv.x = uv.x * 2.0;
        uv.y = 1.0 -(uv.y - 0.5) * 2.0;
    }else if(uv.x >= 0.5 && uv.y >= 0.5){
        uv.x = 1.0 -(uv.x - 0.5) * 2.0;
        uv.y = 1.0 -(uv.y - 0.5) * 2.0;
    }

    vec4 tc = texture2D(videoTex, fract(uv));
    float color = tc.r * 0.3 + tc.g * 0.59 + tc.b * 0.11;
    gl_FragColor = vec4(tc.r,tc.g,tc.b,1.0);
}

因为要进行四分屏,所以原来顶点坐标对应的纹理坐标x,y要进行转换。如uv.x >= 0.5(即x坐标取值0.5~1),除了要将坐标取值范围放大到0~1,还要进行镜像处理,通过如下:

1.0 -(放大后的坐标值)

来取x轴的镜像坐标。其他情况的处理类似。

实际效果

四分镜像乱画.jpg

作者:神迹12

原文链接:https://www.jianshu.com/p/5d2b11fe8d0b

文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐