package com.af.experiments.FxCameraApp.shaders; import static android.opengl.GLES20.glUniform1f; public class GlHarrisCornerDetectionShader extends GlShader { private static final String FRAGMENT_SHADER = "precision mediump float;\n" + // 演算精度を指定します。 "varying highp vec2 vTextureCoord;" + "uniform lowp sampler2D sTexture;" + "uniform lowp float sensitivity;" + "const mediump float harrisConstant = 0.04;" + "void main() {" + "mediump vec3 derivativeElements = texture2D(sTexture, vTextureCoord).rgb;" + "mediump float derivativeSum = derivativeElements.x + derivativeElements.y;" + // R = (Ix^2 * Iy^2 - Ixy * Ixy) / (Ix^2 + Iy^2) "mediump float zElement = (derivativeElements.z * 2.0) - 1.0;" + "mediump float cornerness = derivativeElements.x * derivativeElements.y - (zElement * zElement) - harrisConstant * derivativeSum * derivativeSum;" + "gl_FragColor = vec4(vec3(cornerness * sensitivity), 1.0);" + "}"; private float mSensitivity = 5.0f; public GlHarrisCornerDetectionShader() { super(DEFAULT_VERTEX_SHADER, FRAGMENT_SHADER); } protected String mShaderName = "Harris CD"; public String getName() { return mShaderName; } public float getSensitivity() { return mSensitivity; } public void setSensitivity(final float sensitivity) { mSensitivity = sensitivity; } @Override public void onDraw() { glUniform1f(getHandle("sensitivity"), mSensitivity); } }