package com.af.experiments.FxCameraApp.shaders; import static android.opengl.GLES20.glUniform2f; public class GlStretchDistortionShader extends GlShader { private static final String FRAGMENT_SHADER = "precision mediump float;" + // 演算精度を指定します。 "varying vec2 vTextureCoord;" + "uniform lowp sampler2D sTexture;" + "uniform highp vec2 center;" + "void main() {" + "highp vec2 normCoord = 2.0 * vTextureCoord - 1.0;" + "highp vec2 normCenter = 2.0 * center - 1.0;" + "normCoord -= normCenter;" + "mediump vec2 s = sign(normCoord);" + "normCoord = abs(normCoord);" + "normCoord = 0.5 * normCoord + 0.5 * smoothstep(0.25, 0.5, normCoord) * normCoord;" + "normCoord = s * normCoord;" + "normCoord += normCenter;" + "mediump vec2 textureCoordinateToUse = normCoord / 2.0 + 0.5;" + "gl_FragColor = texture2D(sTexture, textureCoordinateToUse);" + "}"; private float mCenterX = 0.5f; private float mCenterY = 0.5f; protected String mShaderName = "Stretch"; public String getName() { return mShaderName; } public GlStretchDistortionShader() { super(DEFAULT_VERTEX_SHADER, FRAGMENT_SHADER); } ////////////////////////////////////////////////////////////////////////// @Override public void onDraw() { glUniform2f(getHandle("center"), mCenterX, mCenterY); } }