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

一.先看看整体效果

分屏效果

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

                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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335