| 21 |
21 |
|
| 22 |
22 |
import android.content.res.Resources;
|
| 23 |
23 |
import android.opengl.GLES30;
|
| 24 |
|
import android.opengl.Matrix;
|
| 25 |
24 |
|
| 26 |
25 |
import org.distorted.library.message.EffectMessage;
|
| 27 |
26 |
import org.distorted.library.program.DistortedProgram;
|
| ... | ... | |
| 72 |
71 |
private static DistortedFramebuffer mPostBuffer = new DistortedFramebuffer(true,DistortedSurface.TYPE_SYST,1,1);
|
| 73 |
72 |
DistortedFramebuffer mMainBuffer = new DistortedFramebuffer(true,DistortedSurface.TYPE_SYST,1,1);
|
| 74 |
73 |
|
| 75 |
|
private static float[] mMVPMatrix = new float[16];
|
| 76 |
|
private static float[] mTmpMatrix = new float[16];
|
| 77 |
|
|
| 78 |
74 |
// BLUR effect
|
| 79 |
75 |
private static final float GAUSSIAN[] = // G(0.00), G(0.03), G(0.06), ..., G(3.00), 0
|
| 80 |
76 |
{ // where G(x)= (1/(sqrt(2*PI))) * e^(-(x^2)/2). The last 0 terminates.
|
| ... | ... | |
| 103 |
99 |
private static float[] offsetsCache = new float[MAX_BLUR + MAX_BLUR*MAX_BLUR/4];
|
| 104 |
100 |
|
| 105 |
101 |
private static DistortedProgram mBlurProgram;
|
| 106 |
|
private static int mRadiusH,mOffsetsH,mWeightsH,mObjDH,mMVPMatrixH;
|
|
102 |
private static int mRadiusH,mOffsetsH,mWeightsH,mDepthH;
|
| 107 |
103 |
private static float[] mWeights = new float[MAX_BLUR];
|
| 108 |
104 |
private static float[] mOffsets = new float[MAX_BLUR];
|
| 109 |
105 |
// another effect ....
|
| ... | ... | |
| 131 |
127 |
mRadiusH = GLES30.glGetUniformLocation( blurProgramH, "u_Radius");
|
| 132 |
128 |
mOffsetsH = GLES30.glGetUniformLocation( blurProgramH, "u_Offsets");
|
| 133 |
129 |
mWeightsH = GLES30.glGetUniformLocation( blurProgramH, "u_Weights");
|
| 134 |
|
mObjDH = GLES30.glGetUniformLocation( blurProgramH, "u_objD");
|
| 135 |
|
mMVPMatrixH = GLES30.glGetUniformLocation( blurProgramH, "u_MVPMatrix");
|
|
130 |
mDepthH = GLES30.glGetUniformLocation( blurProgramH, "u_Depth");
|
| 136 |
131 |
}
|
| 137 |
132 |
|
| 138 |
133 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| ... | ... | |
| 235 |
230 |
if( mNumEffects>0 && compute(time) )
|
| 236 |
231 |
{
|
| 237 |
232 |
mMainBuffer.setAsInput();
|
| 238 |
|
|
| 239 |
|
Matrix.setIdentityM(mTmpMatrix, 0);
|
| 240 |
|
Matrix.translateM(mTmpMatrix, 0, 0, 0, -surface.mDistance);
|
| 241 |
|
Matrix.multiplyMM(mMVPMatrix, 0, surface.mProjectionMatrix, 0, mTmpMatrix, 0);
|
| 242 |
|
|
| 243 |
233 |
float w = surface.mWidth;
|
| 244 |
234 |
float h = surface.mHeight;
|
| 245 |
235 |
|
| 246 |
|
mBlurProgram.useProgram();
|
| 247 |
|
|
| 248 |
236 |
int radius = (int)mUniforms[0];
|
| 249 |
237 |
if( radius>=MAX_BLUR ) radius = MAX_BLUR-1;
|
| 250 |
238 |
computeGaussianKernel(radius);
|
| ... | ... | |
| 253 |
241 |
radius = (radius+1)/2;
|
| 254 |
242 |
for(int i=0; i<=radius; i++) mOffsets[i] = offsetsCache[offset+i]/h;
|
| 255 |
243 |
|
| 256 |
|
GLES30.glUniform1fv( mWeightsH, radius+1, weightsCache,offset);
|
| 257 |
|
GLES30.glUniform1i( mRadiusH, radius);
|
| 258 |
|
GLES30.glUniform2f( mObjDH , w, h );
|
| 259 |
|
|
| 260 |
244 |
mPostBuffer.resizeFast( (int)w, (int)h);
|
| 261 |
245 |
mPostBuffer.setAsOutput(time);
|
| 262 |
246 |
GLES30.glViewport(0, 0, (int)w, (int)h);
|
| 263 |
247 |
|
| 264 |
|
Matrix.setIdentityM(mTmpMatrix, 0);
|
| 265 |
|
Matrix.translateM(mTmpMatrix, 0, 0, 0, -mPostBuffer.mDistance);
|
| 266 |
|
Matrix.multiplyMM(mMVPMatrix, 0, mPostBuffer.mProjectionMatrix, 0, mTmpMatrix, 0);
|
|
248 |
mBlurProgram.useProgram();
|
|
249 |
GLES30.glUniform1fv( mWeightsH, radius+1, weightsCache,offset);
|
|
250 |
GLES30.glUniform1i( mRadiusH, radius);
|
|
251 |
GLES30.glUniform1f( mDepthH , 1.0f-surface.mNear);
|
| 267 |
252 |
|
| 268 |
253 |
// horizontal blur
|
| 269 |
254 |
GLES30.glUniform1fv( mOffsetsH ,radius+1, mOffsets,0);
|
| 270 |
|
GLES30.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix , 0);
|
| 271 |
255 |
GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[0], POS_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadPositions);
|
| 272 |
256 |
GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[1], TEX_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadTextureInv);
|
| 273 |
257 |
GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
|
Simplify BLUR shader.