Revision 1c67457f
Added by Leszek Koltunski almost 8 years ago
src/main/java/org/distorted/library/EffectQueuePostprocess.java | ||
---|---|---|
21 | 21 |
|
22 | 22 |
import android.content.res.Resources; |
23 | 23 |
import android.opengl.GLES30; |
24 |
import android.opengl.Matrix; |
|
24 | 25 |
|
25 | 26 |
import org.distorted.library.message.EffectMessage; |
26 | 27 |
import org.distorted.library.program.DistortedProgram; |
... | ... | |
51 | 52 |
private static final int NUM_CACHE = 0; |
52 | 53 |
private static final int INDEX = EffectTypes.POSTPROCESS.ordinal(); |
53 | 54 |
|
54 |
private static final FloatBuffer mQuadPositions, mQuadTexture1, mQuadTexture2;
|
|
55 |
private static final FloatBuffer mQuadPositions, mQuadTextureNor, mQuadTextureInv;
|
|
55 | 56 |
|
56 | 57 |
static |
57 | 58 |
{ |
58 | 59 |
int dataLength = 4; |
59 | 60 |
int bytes_per_float = 4; |
60 | 61 |
|
61 |
float[] positionData= { -0.5f, -0.5f, -0.5f, 0.5f, 0.5f,-0.5f, 0.5f, 0.5f };
|
|
62 |
float[] textureData1= { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f };
|
|
63 |
float[] textureData2= { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f };
|
|
62 |
float[] position = { -0.5f, -0.5f, -0.5f, 0.5f, 0.5f,-0.5f, 0.5f, 0.5f };
|
|
63 |
float[] textureNor= { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f };
|
|
64 |
float[] textureInv= { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f };
|
|
64 | 65 |
|
65 | 66 |
mQuadPositions = ByteBuffer.allocateDirect(POSITION_DATA_SIZE*dataLength*bytes_per_float).order(ByteOrder.nativeOrder()).asFloatBuffer(); |
66 |
mQuadPositions.put(positionData).position(0);
|
|
67 |
mQuadTexture1 = ByteBuffer.allocateDirect(TEX_DATA_SIZE *dataLength*bytes_per_float).order(ByteOrder.nativeOrder()).asFloatBuffer();
|
|
68 |
mQuadTexture1.put(textureData1).position(0);
|
|
69 |
mQuadTexture2 = ByteBuffer.allocateDirect(TEX_DATA_SIZE *dataLength*bytes_per_float).order(ByteOrder.nativeOrder()).asFloatBuffer();
|
|
70 |
mQuadTexture2.put(textureData2).position(0);
|
|
67 |
mQuadPositions.put(position).position(0); |
|
68 |
mQuadTextureNor = ByteBuffer.allocateDirect(TEX_DATA_SIZE *dataLength*bytes_per_float).order(ByteOrder.nativeOrder()).asFloatBuffer();
|
|
69 |
mQuadTextureNor.put(textureNor).position(0);
|
|
70 |
mQuadTextureInv = ByteBuffer.allocateDirect(TEX_DATA_SIZE *dataLength*bytes_per_float).order(ByteOrder.nativeOrder()).asFloatBuffer();
|
|
71 |
mQuadTextureInv.put(textureInv).position(0);
|
|
71 | 72 |
} |
72 | 73 |
|
73 | 74 |
private static DistortedFramebuffer mBufferFBO = new DistortedFramebuffer(1,1); |
75 |
private static float[] mMVPMatrix = new float[16]; |
|
76 |
private static float[] mTmpMatrix = new float[16]; |
|
74 | 77 |
|
75 | 78 |
// BLUR effect |
76 | 79 |
private static DistortedProgram mBlurProgram; |
... | ... | |
151 | 154 |
} |
152 | 155 |
|
153 | 156 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
154 |
// w,h - width and height of hte input texture. MVP - Model-View-Projection matrix to apply to the
|
|
157 |
// w,h - width and height of the input texture. MVP - Model-View-Projection matrix to apply to the
|
|
155 | 158 |
// texture; df - output FBO. |
156 | 159 |
|
157 | 160 |
synchronized void render(float w, float h, float[] mvp, DistortedFramebuffer df) |
... | ... | |
169 | 172 |
GLES30.glUniform1fv( mWeightsH, radius+1, mWeights,0); |
170 | 173 |
GLES30.glUniform1i( mRadiusH, radius); |
171 | 174 |
GLES30.glUniform2f( mObjDH , w, h ); |
172 |
GLES30.glUniformMatrix4fv(mMVPMatrixH, 1, false, mvp , 0); |
|
173 | 175 |
|
174 |
mBufferFBO.resizeFast(df.mWidth, df.mHeight);
|
|
176 |
mBufferFBO.resizeFast( (int)w, (int)h);
|
|
175 | 177 |
mBufferFBO.setAsOutput(); |
178 |
GLES30.glViewport(0, 0, (int)w, (int)h); |
|
179 |
|
|
180 |
Matrix.setIdentityM(mTmpMatrix, 0); |
|
181 |
Matrix.translateM(mTmpMatrix, 0, 0, 0, -mBufferFBO.mDistance); |
|
182 |
Matrix.multiplyMM(mMVPMatrix, 0, mBufferFBO.mProjectionMatrix, 0, mTmpMatrix, 0); |
|
176 | 183 |
|
177 | 184 |
// horizontal blur |
178 | 185 |
GLES30.glUniform1f( mStepH , 1/h ); |
186 |
GLES30.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix , 0); |
|
179 | 187 |
GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[0], POSITION_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadPositions); |
180 |
GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[1], TEX_DATA_SIZE , GLES30.GL_FLOAT, false, 0, mQuadTexture2);
|
|
188 |
GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[1], TEX_DATA_SIZE , GLES30.GL_FLOAT, false, 0, mQuadTextureInv);
|
|
181 | 189 |
GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4); |
182 | 190 |
|
183 | 191 |
mBufferFBO.setAsInput(); |
184 | 192 |
df.setAsOutput(); |
193 |
GLES30.glViewport(0, 0, df.mWidth, df.mHeight); |
|
185 | 194 |
|
186 | 195 |
// vertical blur |
187 | 196 |
GLES30.glUniform1f( mStepH , 1/w ); |
197 |
GLES30.glUniformMatrix4fv(mMVPMatrixH, 1, false, mvp , 0); |
|
188 | 198 |
GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[0], POSITION_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadPositions); |
189 |
GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[1], TEX_DATA_SIZE , GLES30.GL_FLOAT, false, 0, mQuadTexture2);
|
|
199 |
GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[1], TEX_DATA_SIZE , GLES30.GL_FLOAT, false, 0, mQuadTextureInv);
|
|
190 | 200 |
GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4); |
191 | 201 |
} |
192 | 202 |
|
Also available in: Unified diff
Separable Box blur fully works now!