package com.marshalchen.common.uimodule.imageprocessing.filter.processing; import com.marshalchen.common.uimodule.imageprocessing.filter.MultiPixelRenderer; import android.opengl.GLES20; /** * Applies a sharpen filter to the image * @author Chris Batt */ public class SharpenFilter extends MultiPixelRenderer { private static final String UNIFORM_SHARPEN_AMOUNT = "u_SharpenAmount"; private float sharpenAmount; private int sharpenAmountHandle; public SharpenFilter(float sharpenAmount) { this.sharpenAmount = sharpenAmount; } @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" +"uniform float "+UNIFORM_SHARPEN_AMOUNT+";\n" +"void main(){\n" +" vec2 singleStepOffset = vec2("+UNIFORM_TEXELWIDTH+", "+UNIFORM_TEXELHEIGHT+");\n" +" vec4 sum = vec4(0,0,0,0);\n" +" vec2 up = vec2(0.0, "+UNIFORM_TEXELHEIGHT+");\n" +" vec2 left = vec2("+UNIFORM_TEXELWIDTH+", 0.0);\n" +" sum += texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+") * (1.0 + 4.0 * "+UNIFORM_SHARPEN_AMOUNT+");\n" +" sum += texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+" + up) * -"+UNIFORM_SHARPEN_AMOUNT+";\n" +" sum += texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+" - up) * -"+UNIFORM_SHARPEN_AMOUNT+";\n" +" sum += texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+" + left) * -"+UNIFORM_SHARPEN_AMOUNT+";\n" +" sum += texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+" - left) * -"+UNIFORM_SHARPEN_AMOUNT+";\n" +" gl_FragColor = sum;\n" +"}\n"; } @Override protected void initShaderHandles() { super.initShaderHandles(); sharpenAmountHandle = GLES20.glGetUniformLocation(programHandle, UNIFORM_SHARPEN_AMOUNT); } @Override protected void passShaderValues() { super.passShaderValues(); GLES20.glUniform1f(sharpenAmountHandle, sharpenAmount); } }