美文网首页Opengl
OpenGLES基于自定义着色器滤镜(一)---(2/3/4/6

OpenGLES基于自定义着色器滤镜(一)---(2/3/4/6

作者: 枫紫_6174 | 来源:发表于2020-08-10 11:13 被阅读0次

    一.先看看整体效果

    分屏效果

            说明:所有分屏原理操作的是片元着色器。顶点着色器不变,这里附上顶点着色器代码,下面不在涉及顶点着色器,至于自定义顶点/片元着色器请看我以前的博客,顶点着色器如下:

                    attribute vec4 Position;

                    attributevec2TextureCoords;

                    varyingvec2TextureCoordsVarying;

                    voidmain (void) {

                    gl_Position= Position;

                    TextureCoordsVarying = TextureCoords;

                    }

    二.二分屏实现原理

            2.1我们先来看看二分屏片元着色器代码:

                    precision highp float;--------------->定义精度,最后都写一下

                    uniform sampler2D Texture;----------->纹理

                    varyinghighpvec2TextureCoordsVarying;---------->纹理坐标

                    voidmain() {

                    vec2uv = TextureCoordsVarying.xy;

                    floaty;

                    if(uv.y >=0.0&& uv.y <=0.5) {

                        y = uv.y +0.25;

                        }else{

                                    y = uv.y -0.25;        

                        }

                                    gl_FragColor=texture2D(Texture,vec2(uv.x, y));

                        }

            所谓二分屏,就是当显示一张图片的时候,截取纹理Y坐标下0.25-0.75的位置,为什么是0.25至0.75了,因为在我们拍摄的过程,大多图片的核心内容显示在这个区域,当然,在自定义着色器中,这个值你可以修改,但最后的效果不是很理想,你可以试一试哈。我们知道纹理的坐标范围是(0,1),流程示意图如下:

    二分屏示意图 效果图

    三.三分屏实现原理

            三分屏片元着色器代码:

                    precision highp float;

                    uniform sampler2D Texture;

                    varyinghighpvec2TextureCoordsVarying;

                    voidmain() {

                                vec2uv = TextureCoordsVarying.xy;

                                if(uv.y <1.0/3.0) {

                                    uv.y = uv.y +1.0/3.0;

                                }elseif(uv.y >2.0/3.0){

                                    uv.y = uv.y -1.0/3.0;

                                }

                                gl_FragColor=texture2D(Texture, uv);

                                }

    三分屏和二分屏的原理一样,判断的位置变成了1/3处:

    三分屏示意图 三分屏效果图

    四.四分屏实现原理

            四分屏片元着色器代码:

                    precision highp float;

                    uniform sampler2D Texture;

                    varyinghighpvec2TextureCoordsVarying;

                    voidmain() {

                                vec2uv = TextureCoordsVarying.xy;

                        if(uv.x <=0.5){

                                uv.x = uv.x *2.0;

                            }else{

                            uv.x = (uv.x -0.5) *2.0;

                            }

                    if(uv.y<=0.5) {

                        uv.y = uv.y *2.0;

                    }else{

                        uv.y = (uv.y -0.5) *2.0;

                }

                    gl_FragColor=texture2D(Texture, uv);

                }

    四分屏特点:原样显示图片的大小,不放大缩小,从代码中我们可以看出,当纹理坐标(x,y)在0-0.5的时候,我们让其乘以2,为什么?原来纹理坐标在0到0.5的时候,获取纹理的时候,只能对应纹理0到0.5,使其乘以2,原本0到0.5的范围就变成了0到1,当纹理坐标(x,y)大于0.5的时候,先减去0.5,再乘以2,也使其0.5到1的范围先变成0到0.5,最后变成0到1,这样,当获取纹理的时候,无论从0到0.5的范围,还是0.5到1的范围,都是变成获取(0,1)整张图片。究其根本原因就是改变纹理坐标获取的纹理位置。原理示意图如下:

    四分屏示意图 四分屏效果图

    五。六分屏实现原理

            六分屏片元着色器代码:

                    precision highp float;

                    uniform sampler2D Texture;

                    varyinghighpvec2TextureCoordsVarying;

                    voidmain() {

                            vec2uv = TextureCoordsVarying.xy;

                            if(uv.x <=1.0/3.0){

                                uv.x = uv.x +1.0/3.0;

                            }elseif(uv.x >=2.0/3.0){

                                uv.x = uv.x -1.0/3.0;

                            }

                            if(uv.y <=0.5){

                                uv.y = uv.y +0.25;

                            }else{

                            uv.y = uv.y -0.25;

                            }

        gl_FragColor=texture2D(Texture, uv);

    }

                你看懂了2/3/4分屏原理,6和9分屏原理就很简单了,6分屏实现原理就是同时改变纹理坐标的值,x坐标取三分之一处,Y坐标取0.5之处,主要是看你的图拍你的样子,原理示意图参照2/3/4分屏


    六分屏效果图

    六.九分屏实现原理

            九分屏片元着色器代码:

                    precision highp float;

                    uniform sampler2D Texture;

                    varyinghighpvec2TextureCoordsVarying;

                    voidmain() {

                    vec2uv = TextureCoordsVarying.xy;

                     if(uv.x <1.0/3.0) {

                         uv.x = uv.x *3.0;

                    }elseif(uv.x <2.0/3.0) {

                        uv.x = (uv.x -1.0/3.0) *3.0;

                    }else{

                        uv.x = (uv.x -2.0/3.0) *3.0;

                }

                if(uv.y <=1.0/3.0) {

                        uv.y = uv.y *3.0;

                        }elseif(uv.y <2.0/3.0) {

                        uv.y = (uv.y -1.0/3.0) *3.0;

                        }else{

                        uv.y = (uv.y -2.0/3.0) *3.0;

                    }

                    gl_FragColor=texture2D(Texture, uv);

    }

            九分屏原理和四分屏原理一样,只是x,y分屏的地方选择的是1/3,2/3处,相关流程示意图,请参照4分屏示意图


    九分屏效果图

    最后附上代码地址:链接: https://pan.baidu.com/s/1bzJpt2Nq6h7DGpfx8PQYdQ 提取码: cck8

    相关文章

      网友评论

        本文标题:OpenGLES基于自定义着色器滤镜(一)---(2/3/4/6

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