Project

General

Profile

« Previous | Next » 

Revision 559da65d

Added by Leszek Koltunski almost 7 years ago

Progress with Stencil app. Rendering through an intermediate FBO still doesn't quite work.

View differences:

src/main/java/org/distorted/examples/fbo/FBORenderer.java
82 82

  
83 83
     // we can also, to save memory, delete/recreate
84 84
     // the depth buffer each time. This is optional.
85
     DistortedFramebuffer fbo = mRoot.getFramebuffer();
86
     if( fbo!=null ) fbo.enableDepthStencil(mDepth ? DistortedFramebuffer.DEPTH_NO_STENCIL:DistortedFramebuffer.NO_DEPTH_STENCIL);
85
     mRoot.enableDepthStencil(mDepth ? DistortedFramebuffer.DEPTH_NO_STENCIL:DistortedFramebuffer.NO_DEPTH_NO_STENCIL);
87 86
     }
88 87

  
89 88
///////////////////////////////////////////////////////////////////////////////////////////////////
src/main/java/org/distorted/examples/stencil/StencilRenderer.java
70 70
        }
71 71
      else
72 72
        {
73
        if( mFBONode==null ) mFBONode = new DistortedNode(mFBOTex,mFBOEffects,mQuad);
74

  
75 73
        mScreen.detachAll();
76 74
        mScreen.attach(mFBONode);
77 75
        mFBONode.attach(mCube1Node);
78
        mFBONode.attach(mCube2Node);
79 76
        mFBONode.attach(mFloorNode);
80

  
81
        DistortedFramebuffer fbo = mFBONode.getFramebuffer();
82
        if( fbo!=null ) fbo.enableDepthStencil(DistortedFramebuffer.BOTH_DEPTH_STENCIL);
83
        else
84
          {
85
          android.util.Log.e("stencil", "failed to enable STENCIL!");
86
          }
77
        mFBONode.attach(mCube2Node);
78
        mFBONode.enableDepthStencil(DistortedFramebuffer.BOTH_DEPTH_STENCIL);
87 79
        }
88 80
      }
89 81

  
......
110 102
      mCube1Node = new DistortedNode(mCubeTex ,mCube1Effects,mCubeMesh );
111 103
      mCube2Node = new DistortedNode(mCubeTex ,mCube2Effects,mCubeMesh );
112 104
      mFloorNode = new DistortedNode(mFloorTex,mFloorEffects,mQuad     );
113

  
105
      mFBONode   = new DistortedNode(mFBOTex  ,mFBOEffects  ,mQuad     );
106

  
107
      ///////////////// The Meat of this App - shamelessly ripped off https://open.gl/depthstencils ///////////////////////
108
      /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
109
      // Stuff to do just before we render the upper Cube
110
      // (nothing - i.e. use default OpenGL settings with one difference - in Distorted, Depth test is on by default)
111
      /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
112
      // Stuff to do just before we render the Floor
114 113
      mFloorNode.glEnable(GLES30.GL_STENCIL_TEST);                               // Enable Stencil when rendering this Node
115 114
      mFloorNode.glStencilFunc(GLES30.GL_ALWAYS, 1, 0xFF);                       // Set any stencil to 1
116 115
      mFloorNode.glStencilOp(GLES30.GL_KEEP, GLES30.GL_KEEP, GLES30.GL_REPLACE); // replace with 1 when we fail Depth test
117 116
      mFloorNode.glStencilMask(0xFF);                                            // Write to stencil buffer
118 117
      mFloorNode.glDepthMask(false);                                             // Don't write to depth buffer
119
      mFloorNode.glClear(GLES30.GL_STENCIL_BUFFER_BIT);                          // Clear stencil buffer (0 by default)
118
      mFloorNode.glClear(GLES30.GL_STENCIL_BUFFER_BIT);                          // Clear stencil buffer (by default, with a 0)
120 119

  
120
      /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
121
      // Stuff to do just before we render the lower Cube
121 122
      mCube2Node.glEnable(GLES30.GL_STENCIL_TEST);                               // Enable Stencil when rendering this Node
122 123
      mCube2Node.glStencilFunc(GLES30.GL_EQUAL, 1, 0xFF);                        // Pass test if stencil value is 1
123 124
      mCube2Node.glStencilMask(0x00);                                            // Don't write anything to stencil buffer
124 125
      mCube2Node.glDepthMask(true);                                              // Write to depth buffer
126
      /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
125 127

  
126 128
      mScreen = new DistortedScreen(mView);
127 129
      mScreen.glClearColor(1.0f,1.0f,1.0f,1.0f);
......
149 151
      float fh = mFloorTex.getHeight();
150 152
      float fd = mFloorTex.getDepth(mQuad);
151 153

  
154
      float bw = mFBOTex.getWidth();
155
      float bh = mFBOTex.getHeight();
156

  
152 157
      float cubeScale = 0.4f*(width>height ? height/ch:width/cw);
153 158
      float floorScale= 0.8f*(width>height ? height/fh:width/fw);
154 159

  
......
169 174
      Static1D rotSt1 = new Static1D(angle);
170 175
      Static1D rotSt2 = new Static1D(angle-90.0f);
171 176

  
177
      /////////////////////////////////////////////////////////////////////////////////////////////////////
178
      // Those Matrix effects, i.e. correct positioning of Objects on the Screen, is admittedly quite hard.
179
      // Figured out of experimentation.
180
      /////////////////////////////////////////////////////////////////////////////////////////////////////
181
      // Upper cube
172 182
      mCube1Effects.abortEffects(EffectTypes.MATRIX);
173 183
      mCube1Effects.move( new Static3D( (width-cubeScale*cw)/2 , height/2-cubeScale*ch , cubeScale *cd/2) );
174 184
      mCube1Effects.scale(cubeScale);
175 185
      mCube1Effects.rotate(rotSt1, axisX, cubeCenter);
176 186
      mCube1Effects.rotate(rotDyn, axisY, cubeCenter);
177 187

  
188
      /////////////////////////////////////////////////////////////////////////////////////////////////////
189
      // Floor
190
      mFloorEffects.abortEffects(EffectTypes.MATRIX);
191
      mFloorEffects.move( new Static3D( (width-floorScale*fw)/2 ,height/2-floorScale*fh/2, floorScale*fd/2) );
192
      mFloorEffects.scale(floorScale);
193
      mFloorEffects.rotate(rotSt2, axisX, floorCenter);
194
      mFloorEffects.rotate(rotDyn, axisZ, floorCenter);
195

  
196
      /////////////////////////////////////////////////////////////////////////////////////////////////////
197
      // Lower cube
178 198
      mCube2Effects.abortEffects(EffectTypes.MATRIX);
179 199
      mCube2Effects.move( new Static3D( (width-cubeScale*cw)/2 , height/2-cubeScale*ch , cubeScale *cd/2) );
180 200
      mCube2Effects.scale(cubeScale);
......
183 203
      mCube2Effects.scale(new Static3D(1,-1,1) );
184 204
      mCube2Effects.move( new Static3D( 0, -2*ch , 0) );
185 205

  
186
      mFloorEffects.abortEffects(EffectTypes.MATRIX);
187
      mFloorEffects.move( new Static3D( (width-floorScale*fw)/2 ,height/2-floorScale*fh/2, floorScale*fd/2) );
188
      mFloorEffects.scale(floorScale);
189
      mFloorEffects.rotate(rotSt2, axisX, floorCenter);
190
      mFloorEffects.rotate(rotDyn, axisZ, floorCenter);
191

  
192
      if( mFBONode==null ) mFBONode = new DistortedNode(mFBOTex,mFBOEffects,mQuad);
193

  
194
      DistortedFramebuffer fbo = mFBONode.getFramebuffer();
195
      if( fbo!=null ) fbo.resize(width,height);
196
      else
197
        {
198
        android.util.Log.e("stencil", "failed to resize FBO!");
199
        }
206
      /////////////////////////////////////////////////////////////////////////////////////////////////////
207
      // Framebuffer
208
      mFBOEffects.abortEffects(EffectTypes.MATRIX);
209
      mFBOEffects.scale( new Static3D( (float)width/bw, (float)height/bh, 1.0f) );
200 210

  
201
      mScreen.resize(width, height);
211
      mFBONode.resize( (int)((float)width/bw), (int)((float)height/bh) );
212
      mScreen.resize( width,height);
202 213
      }
203 214

  
204 215
///////////////////////////////////////////////////////////////////////////////////////////////////

Also available in: Unified diff