package com.marshalchen.common.uimodule.imageprocessing.filter.processing;
import com.marshalchen.common.uimodule.imageprocessing.filter.MultiPixelRenderer;
/**
* Applies a directional motion blur to an image
* blurSize: A multiplier for the blur size, ranging from 0.0 on up
* blurAngle: The angular direction of the blur, in degrees.
* @author Chris Batt
*/
public class MotionBlurFilter extends MultiPixelRenderer {
private float blurSize;
private float degree;
public MotionBlurFilter(float blurSize, float degree) {
this.blurSize = blurSize;
this.degree = degree;
}
@Override
protected String getFragmentShader() {
return
"precision mediump float;\n"
+"uniform sampler2D "+UNIFORM_TEXTURE0+";\n"
+"varying vec2 "+VARYING_TEXCOORD+";\n"
+"uniform float "+UNIFORM_TEXELWIDTH+";\n"
+"uniform float "+UNIFORM_TEXELHEIGHT+";\n"
+"void main(){\n"
+" vec2 step = vec2("+UNIFORM_TEXELWIDTH+", "+UNIFORM_TEXELHEIGHT+");\n"
+" vec4 fragColour = texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+") * 0.18;\n"
+" fragColour += texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+" + step) * 0.15;\n"
+" fragColour += texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+" - step) * 0.15;\n"
+" fragColour += texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+" + step * 2.0) * 0.12;\n"
+" fragColour += texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+" - step * 2.0) * 0.12;\n"
+" fragColour += texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+" + step * 3.0) * 0.09;\n"
+" fragColour += texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+" - step * 3.0) * 0.09;\n"
+" fragColour += texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+" + step * 4.0) * 0.05;\n"
+" fragColour += texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+" - step * 4.0) * 0.05;\n"
+" gl_FragColor = fragColour;\n"
+"}\n";
}
@Override
protected void handleSizeChange() {
super.handleSizeChange();
texelWidth = (float) (blurSize * Math.cos(degree * Math.PI / 180.0)) / (float)getWidth();
texelHeight = (float) (blurSize * Math.sin(degree * Math.PI / 180.0)) / (float)getHeight();
}
}