package com.af.experiments.FxCameraApp.shaders;
import static android.opengl.GLES20.glUniform1f;
import static android.opengl.GLES20.glUniform2f;
import static android.opengl.GLES20.glUniform3fv;
public class GlVignetteShader extends GlShader {
private static final String FRAGMENT_SHADER =
"precision mediump float;" + // 演算精度を指定します。
"varying vec2 vTextureCoord;" +
"uniform lowp sampler2D sTexture;" +
"uniform lowp vec2 vignetteCenter;" +
"uniform lowp vec3 vignetteColor;" +
"uniform highp float vignetteStart;" +
"uniform highp float vignetteEnd;" +
"void main() {" +
"lowp vec3 rgb = texture2D(sTexture, vTextureCoord).rgb;" +
"lowp float d = distance(vTextureCoord, vec2(vignetteCenter.x, vignetteCenter.y));" +
"lowp float percent = smoothstep(vignetteStart, vignetteEnd, d);" +
"gl_FragColor = vec4(mix(rgb.x, vignetteColor.x, percent), mix(rgb.y, vignetteColor.y, percent), mix(rgb.z, vignetteColor.z, percent), 1.0);" +
"}";
private float mVignetteCenterX = 0.5f;
private float mVignetteCenterY = 0.5f;
private float[] mVignetteColor = new float[]{ 0f, 0f, 0f };
private float mVignetteStart = 0.2f;
private float mVignetteEnd = 0.85f;
public GlVignetteShader() {
super(DEFAULT_VERTEX_SHADER, FRAGMENT_SHADER);
}
public float getVignetteStart() {
return mVignetteStart;
}
public void setVignetteStart(final float vignetteStart) {
mVignetteStart = vignetteStart;
}
public float getVignetteEnd() {
return mVignetteEnd;
}
public void setVignetteEnd(final float vignetteEnd) {
mVignetteEnd = vignetteEnd;
}
//////////////////////////////////////////////////////////////////////////
@Override
public void onDraw() {
glUniform2f(getHandle("vignetteCenter"), mVignetteCenterX, mVignetteCenterY);
glUniform3fv(getHandle("vignetteColor"), 0, mVignetteColor, 0);
glUniform1f(getHandle("vignetteStart"), mVignetteStart);
glUniform1f(getHandle("vignetteEnd"), mVignetteEnd);
}
}