package com.marshalchen.common.uimodule.imageprocessing.filter.effect;
import com.marshalchen.common.uimodule.imageprocessing.filter.BasicFilter;
import android.graphics.PointF;
import android.opengl.GLES20;
/**
* Performs a vignetting effect, fading out the image at the edges
* colour: The colour outside
* center: The starting location for the vignetting effect
* start, end: The directional intensity of the vignetting
* @author Chris Batt
*/
public class VignetteFilter extends BasicFilter {
protected static final String UNIFORM_CENTER = "u_Center";
protected static final String UNIFORM_COLOUR = "u_Colour";
protected static final String UNIFORM_START = "u_Start";
protected static final String UNIFORM_END = "u_End";
private int centerHandle;
private int colourHandle;
private int startHandle;
private int endHandle;
private PointF center;
private float[] colour;
private float start;
private float end;
public VignetteFilter(PointF center, float[] colour, float start, float end) {
this.center = center;
this.colour = colour;
this.start = start;
this.end = end;
}
@Override
protected String getFragmentShader() {
return
"precision mediump float;\n"
+"uniform sampler2D "+UNIFORM_TEXTURE0+";\n"
+"varying vec2 "+VARYING_TEXCOORD+";\n"
+"uniform vec2 "+UNIFORM_CENTER+";\n"
+"uniform vec3 "+UNIFORM_COLOUR+";\n"
+"uniform float "+UNIFORM_START+";\n"
+"uniform float "+UNIFORM_END+";\n"
+"void main(){\n"
+" lowp vec4 color = texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+");\n"
+" mediump float d = distance("+VARYING_TEXCOORD+", "+UNIFORM_CENTER+");\n"
+" lowp float percent = smoothstep("+UNIFORM_START+", "+UNIFORM_END+", d);\n"
+" gl_FragColor = vec4(mix(color.rgb, "+UNIFORM_COLOUR+", percent), color.a);\n"
+"}\n";
}
@Override
protected void initShaderHandles() {
super.initShaderHandles();
centerHandle = GLES20.glGetUniformLocation(programHandle, UNIFORM_CENTER);
colourHandle = GLES20.glGetUniformLocation(programHandle, UNIFORM_COLOUR);
startHandle = GLES20.glGetUniformLocation(programHandle, UNIFORM_START);
endHandle = GLES20.glGetUniformLocation(programHandle, UNIFORM_END);
}
@Override
protected void passShaderValues() {
super.passShaderValues();
GLES20.glUniform2f(centerHandle, center.x, center.y);
GLES20.glUniform3f(colourHandle, colour[0], colour[1], colour[2]);
GLES20.glUniform1f(startHandle, start);
GLES20.glUniform1f(endHandle, end);
}
}