Project

General

Profile

« Previous | Next » 

Revision 5c83f4b4

Added by Leszek Koltunski almost 7 years ago

Progress with Stencil in Postprocessing: stencil during the 1st stage postprocess (buffer1->buffer2) works now, provided quality is HIGHEST.
(lower quality --> render errors, looks like Stencil is not set up correctly then)

View differences:

src/main/java/org/distorted/library/DistortedFramebuffer.java
246 246
      if( depthStencil!= NO_DEPTH_NO_STENCIL && mDepthStencilCreated==DONT_CREATE )
247 247
        {
248 248
        mDepthStencilCreated = NOT_CREATED_YET;
249

  
250
        if( mBuffer1[0]!=null )
251
          for(int i=0; i<EffectQuality.LENGTH; i++) mBuffer1[i].enableDepthStencil(depthStencil);
252

  
253 249
        markForCreation();
254 250
        }
255 251
      if( depthStencil== NO_DEPTH_NO_STENCIL && mDepthStencilCreated!=DONT_CREATE )
256 252
        {
257 253
        mDepthStencilCreated = DONT_CREATE;
258

  
259
        if( mBuffer1[0]!=null )
260
          for(int i=0; i<EffectQuality.LENGTH; i++) mBuffer1[i].enableDepthStencil(depthStencil);
261

  
262 254
        markForCreation();
263 255
        }
264 256
      }
src/main/java/org/distorted/library/DistortedNode.java
259 259

  
260 260
///////////////////////////////////////////////////////////////////////////////////////////////////
261 261

  
262
  int markStencilAndDraw(long currTime, DistortedOutputSurface surface, float marginInPixels)
262
  int markStencilAndDraw(long currTime, DistortedOutputSurface surface, int quality, float marginInPixels)
263 263
    {
264 264
    DistortedInputSurface input = mNumChildren[0]==0 ? mSurface : mData.mFBO;
265 265

  
266 266
    if( input.setAsInput() )
267 267
      {
268
      surface.setAsOutput(currTime);
268
      DistortedFramebuffer buffer1 = surface.mBuffer1[quality];
269
      DistortedFramebuffer buffer2 = surface.mBuffer2[quality];
270
      float w = mSurface.getWidth() /2.0f;
271
      float h = mSurface.getHeight()/2.0f;
269 272

  
270 273
      // Mark area of our object + marginInPixels pixels around with 1s in Stencil buffer
274
      buffer2.setAsOutput(currTime);
271 275
      DistortedRenderState.setUpStencilMark();
272
      mEffects.drawPriv(mSurface.getWidth()/2.0f, mSurface.getHeight()/2.0f, mMesh, surface, currTime, marginInPixels);
276
      mEffects.drawPriv(w, h, mMesh, buffer2, currTime, marginInPixels);
273 277

  
274 278
      // Actually draw our object.
279
      buffer1.setAsOutput(currTime);
275 280
      mState.apply();
276
      mEffects.drawPriv(mSurface.getWidth()/2.0f, mSurface.getHeight()/2.0f, mMesh, surface, currTime, 0);
281
      mEffects.drawPriv(w, h, mMesh, buffer1, currTime, 0);
277 282
      return 1;
278 283
      }
279 284
    return 0;
src/main/java/org/distorted/library/DistortedOutputSurface.java
191 191

  
192 192
          for(int j=0; j<EffectQuality.LENGTH; j++)
193 193
            {
194
            mBuffer1[j] = new DistortedFramebuffer(mDepthStencil      ,TYPE_SYST, (int)(mWidth*mipmap), (int)(mHeight*mipmap) );
195
            mBuffer2[j] = new DistortedFramebuffer(NO_DEPTH_NO_STENCIL,TYPE_SYST, (int)(mWidth*mipmap), (int)(mHeight*mipmap) );
194
            mBuffer1[j] = new DistortedFramebuffer(BOTH_DEPTH_STENCIL,TYPE_SYST, (int)(mWidth*mipmap), (int)(mHeight*mipmap) );
195
            mBuffer2[j] = new DistortedFramebuffer(BOTH_DEPTH_STENCIL,TYPE_SYST, (int)(mWidth*mipmap), (int)(mHeight*mipmap) );
196 196
            mBuffer1[j].mMipmap = mipmap;
197 197
            mipmap *= EffectQuality.MULTIPLIER;
198 198
            }
199 199
          DistortedObject.toDo(); // create the FBOs immediately. This is safe as we must be holding the OpenGL context now.
200 200
          }
201 201

  
202
        numRenders += child.markStencilAndDraw(time,mBuffer1[currP.getQuality()],50);
202
        numRenders += child.markStencilAndDraw(time,this,currP.getQuality(),50);
203 203

  
204 204
        if( i==num-1 )
205 205
          {
src/main/java/org/distorted/library/EffectQueuePostprocess.java
318 318
      GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
319 319

  
320 320
      // after each postprocess, clear the STENCIL
321
      buffer1.setAsOutput(time);
321
      buffer2.setAsOutput(time);
322 322
      GLES30.glClear(GLES30.GL_STENCIL_BUFFER_BIT);
323 323
      }
324 324

  

Also available in: Unified diff