参考
书写本文的初衷是为了自我学习
效果图
开发分析
基本思路
思路相对来说比较简单,首先拿到一张图片,传入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;
}
}