5.OpenglES——简单的滤镜

参考


书写本文的初衷是为了自我学习

效果图

在这里插入图片描述
在这里插入图片描述

开发分析

基本思路

思路相对来说比较简单,首先拿到一张图片,传入shader中,然后在shader中对这张图片进行处理。

代码分析

shader代码

如何搭建openGLES的环境,并将图片传入shader不在赘述,可自行下载,这里直接贴出shader代码。
这里将一个个滤镜效果分为一个个方法,通过传入不同的type值对应不容的滤镜。进行不同的呈现。

precision mediump float;

uniform sampler2D vTexture;
uniform int vChangeType;
uniform vec3 vChangeColor;
uniform int vIsHalf;
uniform float uXY;


varying vec4 gPosition;

varying vec2 aCoordinate;
varying vec4 aPos;

void modifyColor(vec4 color){
    color.r=max(min(color.r,1.0),0.0);
    color.g=max(min(color.g,1.0),0.0);
    color.b=max(min(color.b,1.0),0.0);
    color.a=max(min(color.a,1.0),0.0);
}
//冷色调暖色调
void coolwarmColor(vec4 nColor ){
    vec4 deltaColor=nColor+vec4(vChangeColor,0.0);
    modifyColor(deltaColor);
    gl_FragColor=deltaColor;
}
//模糊
void bulrColor(vec4 nColor){
    nColor+=texture2D(vTexture,vec2(aCoordinate.x-vChangeColor.r,aCoordinate.y-vChangeColor.r));
    nColor+=texture2D(vTexture,vec2(aCoordinate.x-vChangeColor.r,aCoordinate.y+vChangeColor.r));
    nColor+=texture2D(vTexture,vec2(aCoordinate.x+vChangeColor.r,aCoordinate.y-vChangeColor.r));
    nColor+=texture2D(vTexture,vec2(aCoordinate.x+vChangeColor.r,aCoordinate.y+vChangeColor.r));
    nColor+=texture2D(vTexture,vec2(aCoordinate.x-vChangeColor.g,aCoordinate.y-vChangeColor.g));
    nColor+=texture2D(vTexture,vec2(aCoordinate.x-vChangeColor.g,aCoordinate.y+vChangeColor.g));
    nColor+=texture2D(vTexture,vec2(aCoordinate.x+vChangeColor.g,aCoordinate.y-vChangeColor.g));
    nColor+=texture2D(vTexture,vec2(aCoordinate.x+vChangeColor.g,aCoordinate.y+vChangeColor.g));
    nColor+=texture2D(vTexture,vec2(aCoordinate.x-vChangeColor.b,aCoordinate.y-vChangeColor.b));
    nColor+=texture2D(vTexture,vec2(aCoordinate.x-vChangeColor.b,aCoordinate.y+vChangeColor.b));
    nColor+=texture2D(vTexture,vec2(aCoordinate.x+vChangeColor.b,aCoordinate.y-vChangeColor.b));
    nColor+=texture2D(vTexture,vec2(aCoordinate.x+vChangeColor.b,aCoordinate.y+vChangeColor.b));
    nColor/=13.0;
    gl_FragColor=nColor;
}
//放大镜
void bigCameraColor(vec4 nColor){
    float dis=distance(vec2(gPosition.x,gPosition.y/uXY),vec2(vChangeColor.r,vChangeColor.g));
    if(dis<vChangeColor.b){
        nColor=texture2D(vTexture,vec2(aCoordinate.x/2.0+0.25,aCoordinate.y/2.0+0.25));
    }
    gl_FragColor=nColor;
}


void main(){
    vec4 nColor=texture2D(vTexture,aCoordinate);


    if(aPos.x>0.0||vIsHalf==0){
        if(vChangeType==1){


        }else if(vChangeType==2){
            coolwarmColor(nColor );
        }else if(vChangeType==3){
            bulrColor(nColor);
        }else if(vChangeType==4){
            bigCameraColor(nColor);
        }
        else{
            gl_FragColor=nColor;
        }
    }else{
        gl_FragColor=nColor;
    }
}

项目地址,欢迎点星

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值