Revision 9d5bb851
Added by Leszek Koltunski over 7 years ago
src/main/java/org/distorted/library/EffectQueuePostprocess.java | ||
---|---|---|
45 | 45 |
{ |
46 | 46 |
private static final int MAX_BLUR = 50; |
47 | 47 |
|
48 |
private static final int POSITION_DATA_SIZE= 2; // Post Program: size of the position data in elements
|
|
49 |
private static final int TEX_DATA_SIZE = 2; // Post Program: size of the texture coordinate data in elements.
|
|
48 |
private static final int POS_DATA_SIZE= 2; // Post Program: size of the position data in elements |
|
49 |
private static final int TEX_DATA_SIZE= 2; // Post Program: size of the texture coordinate data in elements. |
|
50 | 50 |
|
51 | 51 |
private static final int NUM_UNIFORMS = 4; |
52 | 52 |
private static final int NUM_CACHE = 0; |
... | ... | |
63 | 63 |
float[] textureNor= { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f }; |
64 | 64 |
float[] textureInv= { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f }; |
65 | 65 |
|
66 |
mQuadPositions = ByteBuffer.allocateDirect(POSITION_DATA_SIZE*dataLength*bytes_per_float).order(ByteOrder.nativeOrder()).asFloatBuffer();
|
|
66 |
mQuadPositions = ByteBuffer.allocateDirect(POS_DATA_SIZE*dataLength*bytes_per_float).order(ByteOrder.nativeOrder()).asFloatBuffer(); |
|
67 | 67 |
mQuadPositions.put(position).position(0); |
68 |
mQuadTextureNor = ByteBuffer.allocateDirect(TEX_DATA_SIZE *dataLength*bytes_per_float).order(ByteOrder.nativeOrder()).asFloatBuffer();
|
|
68 |
mQuadTextureNor= ByteBuffer.allocateDirect(TEX_DATA_SIZE*dataLength*bytes_per_float).order(ByteOrder.nativeOrder()).asFloatBuffer();
|
|
69 | 69 |
mQuadTextureNor.put(textureNor).position(0); |
70 |
mQuadTextureInv = ByteBuffer.allocateDirect(TEX_DATA_SIZE *dataLength*bytes_per_float).order(ByteOrder.nativeOrder()).asFloatBuffer();
|
|
70 |
mQuadTextureInv= ByteBuffer.allocateDirect(TEX_DATA_SIZE*dataLength*bytes_per_float).order(ByteOrder.nativeOrder()).asFloatBuffer();
|
|
71 | 71 |
mQuadTextureInv.put(textureInv).position(0); |
72 | 72 |
} |
73 | 73 |
|
... | ... | |
154 | 154 |
} |
155 | 155 |
|
156 | 156 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
157 |
// w,h - width and height of the input texture. MVP - Model-View-Projection matrix to apply to the |
|
158 |
// texture; df - output FBO. |
|
159 | 157 |
|
160 |
synchronized void render(float w, float h, float[] mvp, DistortedFramebuffer df)
|
|
158 |
private int computeKernel(int radius, float height)
|
|
161 | 159 |
{ |
162 |
mBlurProgram.useProgram(); |
|
163 |
|
|
164 |
int radius = (int)mUniforms[0]; |
|
165 | 160 |
if( radius>=MAX_BLUR ) radius = MAX_BLUR-1; |
166 | 161 |
|
167 | 162 |
for(int i=0; i<=radius; i++) |
168 | 163 |
{ |
164 |
// Box Blur size 'radius' |
|
169 | 165 |
mWeights[i] = 1.0f / (2.0f*radius+1.0f); |
170 |
mOffsets[i] = i/h; |
|
166 |
mOffsets[i] = i*height; |
|
167 |
|
|
168 |
// Gaussian Blur size 'radius' |
|
169 |
|
|
170 |
|
|
171 | 171 |
} |
172 | 172 |
|
173 |
return radius; |
|
174 |
} |
|
175 |
|
|
176 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
177 |
// w,h - width and height of the input texture. MVP - Model-View-Projection matrix to apply to the |
|
178 |
// texture; df - output FBO. |
|
179 |
|
|
180 |
synchronized void render(float w, float h, float[] mvp, DistortedFramebuffer df) |
|
181 |
{ |
|
182 |
mBlurProgram.useProgram(); |
|
183 |
|
|
184 |
int radius = computeKernel( (int)mUniforms[0], 1/h ); |
|
185 |
|
|
173 | 186 |
GLES30.glUniform1fv( mWeightsH, radius+1, mWeights,0); |
174 |
GLES30.glUniform1fv( mOffsetsH ,radius+1, mOffsets,0); |
|
175 | 187 |
GLES30.glUniform1i( mRadiusH, radius); |
176 | 188 |
GLES30.glUniform2f( mObjDH , w, h ); |
177 | 189 |
|
... | ... | |
184 | 196 |
Matrix.multiplyMM(mMVPMatrix, 0, mBufferFBO.mProjectionMatrix, 0, mTmpMatrix, 0); |
185 | 197 |
|
186 | 198 |
// horizontal blur |
187 |
|
|
199 |
GLES30.glUniform1fv( mOffsetsH ,radius+1, mOffsets,0); |
|
188 | 200 |
GLES30.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix , 0); |
189 |
GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[0], POSITION_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadPositions);
|
|
190 |
GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[1], TEX_DATA_SIZE , GLES30.GL_FLOAT, false, 0, mQuadTextureInv);
|
|
201 |
GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[0], POS_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadPositions); |
|
202 |
GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[1], TEX_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadTextureInv); |
|
191 | 203 |
GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4); |
192 | 204 |
|
193 | 205 |
mBufferFBO.setAsInput(); |
... | ... | |
200 | 212 |
// vertical blur |
201 | 213 |
GLES30.glUniform1fv( mOffsetsH ,radius+1, mOffsets,0); |
202 | 214 |
GLES30.glUniformMatrix4fv(mMVPMatrixH, 1, false, mvp , 0); |
203 |
GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[0], POSITION_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadPositions);
|
|
204 |
GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[1], TEX_DATA_SIZE , GLES30.GL_FLOAT, false, 0, mQuadTextureInv);
|
|
215 |
GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[0], POS_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadPositions); |
|
216 |
GLES30.glVertexAttribPointer(mBlurProgram.mAttribute[1], TEX_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadTextureInv); |
|
205 | 217 |
GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4); |
206 | 218 |
} |
207 | 219 |
|
Also available in: Unified diff
minor.