commit 5ccafcca5ad9f35d9cea840a7b488d7be17e4389
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Tue Jan 24 17:35:51 2017 +0000

    Separable Box blur fully works now!

diff --git a/src/main/java/org/distorted/library/EffectQueuePostprocess.java b/src/main/java/org/distorted/library/EffectQueuePostprocess.java
index 64107d6..c90bde2 100644
--- a/src/main/java/org/distorted/library/EffectQueuePostprocess.java
+++ b/src/main/java/org/distorted/library/EffectQueuePostprocess.java
@@ -77,9 +77,9 @@ class EffectQueuePostprocess extends EffectQueue
 
   // BLUR effect
   private static DistortedProgram mBlurProgram;
-  private static int mRadiusH,mStepH,mWeightsH,mObjDH,mMVPMatrixH;
+  private static int mRadiusH,mOffsetsH,mWeightsH,mObjDH,mMVPMatrixH;
   private float[] mWeights = new float[MAX_BLUR];
-
+  private float[] mOffsets = new float[MAX_BLUR];
   // another effect ....
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -103,7 +103,7 @@ class EffectQueuePostprocess extends EffectQueue
 
     int blurProgramH = mBlurProgram.getProgramHandle();
     mRadiusH    = GLES30.glGetUniformLocation( blurProgramH, "u_Radius");
-    mStepH      = GLES30.glGetUniformLocation( blurProgramH, "u_Step");
+    mOffsetsH   = GLES30.glGetUniformLocation( blurProgramH, "u_Offsets");
     mWeightsH   = GLES30.glGetUniformLocation( blurProgramH, "u_Weights");
     mObjDH      = GLES30.glGetUniformLocation( blurProgramH, "u_objD");
     mMVPMatrixH = GLES30.glGetUniformLocation( blurProgramH, "u_MVPMatrix");
@@ -167,9 +167,11 @@ class EffectQueuePostprocess extends EffectQueue
     for(int i=0; i<=radius; i++)
       {
       mWeights[i] = 1.0f / (2.0f*radius+1.0f);
+      mOffsets[i] = i/h;
       }
 
     GLES30.glUniform1fv( mWeightsH, radius+1, mWeights,0);
+    GLES30.glUniform1fv( mOffsetsH ,radius+1, mOffsets,0);
     GLES30.glUniform1i( mRadiusH, radius);
     GLES30.glUniform2f( mObjDH , w, h );
 
@@ -182,7 +184,7 @@ class EffectQueuePostprocess extends EffectQueue
     Matrix.multiplyMM(mMVPMatrix, 0, mBufferFBO.mProjectionMatrix, 0, mTmpMatrix, 0);
 
     // horizontal blur
-    GLES30.glUniform1f( mStepH , 1/h );
+
     GLES30.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix , 0);
     GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[0], POSITION_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadPositions);
     GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[1], TEX_DATA_SIZE     , GLES30.GL_FLOAT, false, 0, mQuadTextureInv);
@@ -192,8 +194,11 @@ class EffectQueuePostprocess extends EffectQueue
     df.setAsOutput();
     GLES30.glViewport(0, 0, df.mWidth, df.mHeight);
 
+    float adjust = h/w;
+    for(int i=0; i<=radius; i++) mOffsets[i] *= adjust;
+
     // vertical blur
-    GLES30.glUniform1f( mStepH , 1/w );
+    GLES30.glUniform1fv( mOffsetsH ,radius+1, mOffsets,0);
     GLES30.glUniformMatrix4fv(mMVPMatrixH, 1, false, mvp , 0);
     GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[0], POSITION_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadPositions);
     GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[1], TEX_DATA_SIZE     , GLES30.GL_FLOAT, false, 0, mQuadTextureInv);
diff --git a/src/main/res/raw/blur_fragment_shader.glsl b/src/main/res/raw/blur_fragment_shader.glsl
index cf5f6a7..f7d933b 100644
--- a/src/main/res/raw/blur_fragment_shader.glsl
+++ b/src/main/res/raw/blur_fragment_shader.glsl
@@ -21,7 +21,7 @@ precision lowp float;
 
 varying vec2 v_TexCoordinate;
 uniform sampler2D u_Texture;
-uniform float u_Step;
+uniform float u_Offsets[MAX_BLUR];
 uniform float u_Weights[MAX_BLUR];
 uniform int u_Radius;
 
@@ -29,18 +29,12 @@ uniform int u_Radius;
 
 void main()
   {
-  float lCoord = v_TexCoordinate.x;
-  float rCoord = lCoord;
-  float yCoord = v_TexCoordinate.y;
-
-  vec4  pixel  = texture2D(u_Texture,vec2(lCoord,yCoord)) * u_Weights[0];
+  vec4 pixel= texture2D(u_Texture,v_TexCoordinate) * u_Weights[0];
 
   for (int x = 1; x <= u_Radius; x+=1)
     {
-    rCoord+= u_Step;
-    lCoord-= u_Step;
-    pixel += ( texture2D(u_Texture,vec2(rCoord,yCoord)) +
-               texture2D(u_Texture,vec2(lCoord,yCoord)) ) * u_Weights[x];
+    pixel += ( texture2D(u_Texture,vec2(v_TexCoordinate.x+u_Offsets[x],v_TexCoordinate.y)) +
+               texture2D(u_Texture,vec2(v_TexCoordinate.x-u_Offsets[x],v_TexCoordinate.y)) ) * u_Weights[x];
     }
 
   gl_FragColor = pixel;
