Revision 7170e4eb
Added by Leszek Koltunski over 7 years ago
src/main/java/org/distorted/library/DistortedEffects.java | ||
---|---|---|
78 | 78 |
mQuadPositions.put(positionData).position(0); |
79 | 79 |
} |
80 | 80 |
|
81 |
/// BLIT DEPTH PROGRAM /// |
|
82 |
private static DistortedProgram mBlitDepthProgram; |
|
83 |
private static int mBlitDepthTextureH; |
|
84 |
private static int mBlitDepthDepthTextureH; |
|
85 |
private static int mBlitDepthDepthH; |
|
86 |
|
|
81 | 87 |
/// NORMAL PROGRAM ///// |
82 | 88 |
private static DistortedProgram mNormalProgram; |
83 | 89 |
private static int mNormalMVPMatrixH; |
... | ... | |
166 | 172 |
mBlitTextureH = GLES30.glGetUniformLocation( blitProgramH, "u_Texture"); |
167 | 173 |
mBlitDepthH = GLES30.glGetUniformLocation( blitProgramH, "u_Depth"); |
168 | 174 |
|
175 |
// BLIT DEPTH PROGRAM //////////////////////////////////// |
|
176 |
final InputStream blitDepthVertStream = resources.openRawResource(R.raw.blit_depth_vertex_shader); |
|
177 |
final InputStream blitDepthFragStream = resources.openRawResource(R.raw.blit_depth_fragment_shader); |
|
178 |
|
|
179 |
try |
|
180 |
{ |
|
181 |
mBlitDepthProgram = new DistortedProgram(blitDepthVertStream,blitDepthFragStream,blitVertHeader,blitFragHeader, Distorted.GLSL); |
|
182 |
} |
|
183 |
catch(Exception e) |
|
184 |
{ |
|
185 |
android.util.Log.e("EFFECTS", "exception trying to compile BLIT DEPTH program: "+e.getMessage()); |
|
186 |
throw new RuntimeException(e.getMessage()); |
|
187 |
} |
|
188 |
|
|
189 |
int blitDepthProgramH = mBlitDepthProgram.getProgramHandle(); |
|
190 |
mBlitDepthTextureH = GLES30.glGetUniformLocation( blitDepthProgramH, "u_Texture"); |
|
191 |
mBlitDepthDepthTextureH = GLES30.glGetUniformLocation( blitDepthProgramH, "u_DepthTexture"); |
|
192 |
mBlitDepthDepthH = GLES30.glGetUniformLocation( blitDepthProgramH, "u_Depth"); |
|
193 |
|
|
169 | 194 |
// NORMAL PROGRAM ////////////////////////////////////// |
170 | 195 |
final InputStream normalVertexStream = resources.openRawResource(R.raw.normal_vertex_shader); |
171 | 196 |
final InputStream normalFragmentStream = resources.openRawResource(R.raw.normal_fragment_shader); |
... | ... | |
297 | 322 |
GLES30.glVertexAttribPointer(mBlitProgram.mAttribute[0], 2, GLES30.GL_FLOAT, false, 0, mQuadPositions); |
298 | 323 |
GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4); |
299 | 324 |
} |
300 |
|
|
325 |
|
|
326 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
327 |
|
|
328 |
static void blitDepthPriv(DistortedOutputSurface surface) |
|
329 |
{ |
|
330 |
mBlitDepthProgram.useProgram(); |
|
331 |
|
|
332 |
GLES30.glViewport(0, 0, surface.mWidth, surface.mHeight ); |
|
333 |
GLES30.glUniform1i(mBlitDepthTextureH, 0); |
|
334 |
GLES30.glUniform1i(mBlitDepthDepthTextureH, 1); |
|
335 |
GLES30.glUniform1f( mBlitDepthDepthH , 1.0f-surface.mNear); |
|
336 |
GLES30.glVertexAttribPointer(mBlitDepthProgram.mAttribute[0], 2, GLES30.GL_FLOAT, false, 0, mQuadPositions); |
|
337 |
GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4); |
|
338 |
} |
|
339 |
|
|
301 | 340 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
302 | 341 |
|
303 | 342 |
private void releasePriv() |
src/main/java/org/distorted/library/DistortedNode.java | ||
---|---|---|
271 | 271 |
float w = mSurface.getWidth() /2.0f; |
272 | 272 |
float h = mSurface.getHeight()/2.0f; |
273 | 273 |
|
274 |
// Actually draw our object.
|
|
274 |
// Draw the color buffer of the object.
|
|
275 | 275 |
buffer1.setAsOutput(); |
276 | 276 |
mState.apply(); |
277 | 277 |
mEffects.drawPriv(w, h, mMesh, buffer1, currTime, 0); |
278 | 278 |
|
279 |
// Mark area of our object + marginInPixels pixels around with 1s in Stencil buffer
|
|
279 |
// Draw stencil + depth buffers of the object enlarged by HALO pixels around.
|
|
280 | 280 |
buffer2.setAsOutput(); |
281 | 281 |
DistortedRenderState.setUpStencilMark(); |
282 | 282 |
mEffects.drawPriv(w, h, mMesh, buffer2, currTime, effects.getHalo()*buffer2.mMipmap); |
src/main/java/org/distorted/library/EffectQueuePostprocess.java | ||
---|---|---|
94 | 94 |
|
95 | 95 |
private static DistortedProgram mBlur1Program, mBlur2Program; |
96 | 96 |
private static int mRadius1H,mOffsets1H,mWeights1H,mDepth1H, mColorTexture1H; |
97 |
private static int mRadius2H,mOffsets2H,mWeights2H,mDepth2H, mColorTexture2H, mDepthTexture2H;
|
|
97 |
private static int mRadius2H,mOffsets2H,mWeights2H,mDepth2H, mColorTexture2H; |
|
98 | 98 |
private static float[] mWeights = new float[MAX_BLUR]; |
99 | 99 |
private static float[] mOffsets = new float[MAX_BLUR]; |
100 | 100 |
// another effect .... |
... | ... | |
161 | 161 |
mWeights2H = GLES30.glGetUniformLocation( blur2ProgramH, "u_Weights"); |
162 | 162 |
mDepth2H = GLES30.glGetUniformLocation( blur2ProgramH, "u_Depth"); |
163 | 163 |
mColorTexture2H = GLES30.glGetUniformLocation( blur2ProgramH, "u_ColorTexture"); |
164 |
mDepthTexture2H = GLES30.glGetUniformLocation( blur2ProgramH, "u_DepthTexture"); |
|
165 | 164 |
} |
166 | 165 |
|
167 | 166 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
307 | 306 |
DistortedRenderState.unuseStencilMark(); |
308 | 307 |
|
309 | 308 |
// vertical blur |
310 |
GLES30.glViewport(0, 0, (int)w2, (int)h2); |
|
311 | 309 |
mBlur2Program.useProgram(); |
312 | 310 |
buffer2.setAsInput(); |
313 |
buffer2.setAsDepth(); |
|
314 |
surface.setAsOutput(time); |
|
311 |
buffer1.setAsOutput(); |
|
312 |
|
|
313 |
GLES30.glStencilMask(0xff); |
|
314 |
GLES30.glDepthMask(true); |
|
315 |
GLES30.glColorMask(true,true,true,true); |
|
316 |
GLES30.glClearColor(0.0f,0.0f,0.0f,0.0f); |
|
317 |
GLES30.glClearDepthf(1.0f); |
|
318 |
GLES30.glClearStencil(0); |
|
319 |
GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT|GLES30.GL_DEPTH_BUFFER_BIT|GLES30.GL_STENCIL_BUFFER_BIT); |
|
315 | 320 |
|
316 | 321 |
GLES30.glUniform1fv( mWeights2H, radius+1, weightsCache,offset); |
317 | 322 |
GLES30.glUniform1i( mRadius2H, radius); |
318 | 323 |
GLES30.glUniform1f( mDepth2H , 1.0f-surface.mNear); |
319 | 324 |
GLES30.glUniform1i( mColorTexture2H , 0 ); |
320 |
GLES30.glUniform1i( mDepthTexture2H , 1 ); |
|
321 | 325 |
for(int i=0; i<=radius; i++) mOffsets[i] = offsetsCache[offset+i]/w1; |
322 | 326 |
GLES30.glUniform1fv( mOffsets2H ,radius+1, mOffsets,0); |
323 | 327 |
GLES30.glVertexAttribPointer(mBlur2Program.mAttribute[0], POS_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadPositions); |
324 | 328 |
GLES30.glVertexAttribPointer(mBlur2Program.mAttribute[1], TEX_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadTexture); |
329 |
|
|
330 |
GLES30.glFramebufferTexture2D(GLES30.GL_FRAMEBUFFER, GLES30.GL_DEPTH_STENCIL_ATTACHMENT, GLES30.GL_TEXTURE_2D, buffer2.mDepthStencilH[0], 0); |
|
331 |
DistortedRenderState.useStencilMark(); |
|
325 | 332 |
GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4); |
333 |
DistortedRenderState.unuseStencilMark(); |
|
334 |
GLES30.glFramebufferTexture2D(GLES30.GL_FRAMEBUFFER, GLES30.GL_DEPTH_STENCIL_ATTACHMENT, GLES30.GL_TEXTURE_2D, buffer1.mDepthStencilH[0], 0); |
|
335 |
|
|
336 |
// blit the results with DEPTH to surface. |
|
337 |
GLES30.glViewport(0, 0, (int)w2, (int)h2); |
|
338 |
buffer1.setAsInput(); |
|
339 |
buffer2.setAsDepth(); |
|
340 |
surface.setAsOutput(time); |
|
341 |
DistortedEffects.blitDepthPriv(surface); |
|
326 | 342 |
|
327 | 343 |
// after each postprocess, clear buffers |
328 | 344 |
GLES30.glStencilMask(0xff); |
... | ... | |
331 | 347 |
GLES30.glClearColor(0.0f,0.0f,0.0f,0.0f); |
332 | 348 |
GLES30.glClearDepthf(1.0f); |
333 | 349 |
GLES30.glClearStencil(0); |
334 |
|
|
335 | 350 |
buffer1.setAsOutput(); |
336 | 351 |
GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT|GLES30.GL_DEPTH_BUFFER_BIT|GLES30.GL_STENCIL_BUFFER_BIT); |
337 | 352 |
buffer2.setAsOutput(); |
338 |
GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT|GLES30.GL_DEPTH_BUFFER_BIT); |
|
353 |
GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT|GLES30.GL_DEPTH_BUFFER_BIT|GLES30.GL_STENCIL_BUFFER_BIT);
|
|
339 | 354 |
} |
340 | 355 |
|
341 | 356 |
return mNumEffects; |
src/main/res/raw/blit_depth_fragment_shader.glsl | ||
---|---|---|
1 |
////////////////////////////////////////////////////////////////////////////////////////////// |
|
2 |
// Copyright 2016 Leszek Koltunski // |
|
3 |
// // |
|
4 |
// This file is part of Distorted. // |
|
5 |
// // |
|
6 |
// Distorted is free software: you can redistribute it and/or modify // |
|
7 |
// it under the terms of the GNU General Public License as published by // |
|
8 |
// the Free Software Foundation, either version 2 of the License, or // |
|
9 |
// (at your option) any later version. // |
|
10 |
// // |
|
11 |
// Distorted is distributed in the hope that it will be useful, // |
|
12 |
// but WITHOUT ANY WARRANTY; without even the implied warranty of // |
|
13 |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // |
|
14 |
// GNU General Public License for more details. // |
|
15 |
// // |
|
16 |
// You should have received a copy of the GNU General Public License // |
|
17 |
// along with Distorted. If not, see <http://www.gnu.org/licenses/>. // |
|
18 |
////////////////////////////////////////////////////////////////////////////////////////////// |
|
19 |
|
|
20 |
precision lowp float; |
|
21 |
|
|
22 |
#if __VERSION__ != 100 |
|
23 |
out vec4 fragColor; // The output color |
|
24 |
in vec2 v_TexCoordinate; // Interpolated texture coordinate per fragment. |
|
25 |
#define TEXTURE texture |
|
26 |
#define FRAG_COLOR fragColor |
|
27 |
#else |
|
28 |
varying vec2 v_TexCoordinate; // Interpolated texture coordinate per fragment. |
|
29 |
#define TEXTURE texture2D |
|
30 |
#define FRAG_COLOR gl_FragColor |
|
31 |
#endif |
|
32 |
|
|
33 |
uniform sampler2D u_Texture; |
|
34 |
uniform sampler2D u_DepthTexture; |
|
35 |
|
|
36 |
////////////////////////////////////////////////////////////////////////////////////////////// |
|
37 |
|
|
38 |
void main() |
|
39 |
{ |
|
40 |
gl_FragDepth = TEXTURE(u_DepthTexture,v_TexCoordinate).r; |
|
41 |
FRAG_COLOR = TEXTURE(u_Texture ,v_TexCoordinate); |
|
42 |
} |
src/main/res/raw/blit_depth_vertex_shader.glsl | ||
---|---|---|
1 |
////////////////////////////////////////////////////////////////////////////////////////////// |
|
2 |
// Copyright 2016 Leszek Koltunski // |
|
3 |
// // |
|
4 |
// This file is part of Distorted. // |
|
5 |
// // |
|
6 |
// Distorted is free software: you can redistribute it and/or modify // |
|
7 |
// it under the terms of the GNU General Public License as published by // |
|
8 |
// the Free Software Foundation, either version 2 of the License, or // |
|
9 |
// (at your option) any later version. // |
|
10 |
// // |
|
11 |
// Distorted is distributed in the hope that it will be useful, // |
|
12 |
// but WITHOUT ANY WARRANTY; without even the implied warranty of // |
|
13 |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // |
|
14 |
// GNU General Public License for more details. // |
|
15 |
// // |
|
16 |
// You should have received a copy of the GNU General Public License // |
|
17 |
// along with Distorted. If not, see <http://www.gnu.org/licenses/>. // |
|
18 |
////////////////////////////////////////////////////////////////////////////////////////////// |
|
19 |
|
|
20 |
precision lowp float; |
|
21 |
|
|
22 |
#if __VERSION__ != 100 |
|
23 |
in vec2 a_Position; // Per-vertex position. |
|
24 |
out vec2 v_TexCoordinate; // |
|
25 |
#else |
|
26 |
attribute vec2 a_Position; // Per-vertex position. |
|
27 |
varying vec2 v_TexCoordinate; // |
|
28 |
#endif |
|
29 |
|
|
30 |
uniform float u_Depth; // distance from the near plane to render plane, in clip coords |
|
31 |
|
|
32 |
////////////////////////////////////////////////////////////////////////////////////////////// |
|
33 |
|
|
34 |
void main() |
|
35 |
{ |
|
36 |
v_TexCoordinate = a_Position + 0.5; |
|
37 |
gl_Position = vec4(2.0*a_Position,u_Depth,1.0); |
|
38 |
} |
src/main/res/raw/blur2_fragment_shader.glsl | ||
---|---|---|
31 | 31 |
#endif |
32 | 32 |
|
33 | 33 |
uniform sampler2D u_ColorTexture; |
34 |
uniform sampler2D u_DepthTexture; |
|
35 | 34 |
uniform float u_Offsets[MAX_BLUR]; |
36 | 35 |
uniform float u_Weights[MAX_BLUR]; |
37 | 36 |
uniform int u_Radius; |
... | ... | |
40 | 39 |
|
41 | 40 |
void main() |
42 | 41 |
{ |
43 |
gl_FragDepth = TEXTURE(u_DepthTexture,v_TexCoordinate).r; |
|
44 |
|
|
45 | 42 |
vec4 pixel= TEXTURE(u_ColorTexture,v_TexCoordinate) * u_Weights[0]; |
46 | 43 |
|
47 | 44 |
for (int i=1; i<=u_Radius; i+=1) |
Also available in: Unified diff
Move on to Stencil on both stages of the BLUR + separate 'blit with depth'.
This works wonders on Nexus 5X ( r=50 quality=HIGHIEST 1,4,8 cubes: 59.3,43.6,41.0 FPS! ) but it somehow fails to clear the DEPTH and STENCIL buffers on Nexus 4....