Project

General

Profile

« Previous | Next » 

Revision 406e2f6b

Added by Leszek Koltunski almost 6 years ago

Give users API to render OutputSerfaces and attached Nodes in either the 'normal' way of OIT way.

View differences:

src/main/java/org/distorted/library/main/DistortedOutputSurface.java
54 54

  
55 55
  private ArrayList<DistortedNode> mChildren;
56 56
  private int mNumChildren;   // ==mChildren.length(), but we only create mChildren if the first one gets added
57
  private boolean mRenderWayOIT;
57 58

  
58 59
  private class Job
59 60
    {
......
99 100
    {
100 101
    super(width,height,createColor,numfbos,numcolors,type);
101 102

  
103
    mRenderWayOIT = false;
104

  
102 105
    mDepthStencilH = new int[numfbos];
103 106
    mFBOH          = new int[numfbos];
104 107

  
......
379 382
// Otherwise, render to a buffer and on each change of Postprocessing Bucket, apply the postprocessing
380 383
// to a whole buffer (lastQueue.postprocess) and merge it (this.oitBuild).
381 384

  
382
  int renderChildren(long time, int numChildren, ArrayList<DistortedNode> children, int fbo)
385
  int renderChildren(long time, int numChildren, ArrayList<DistortedNode> children, int fbo, boolean oit)
383 386
    {
384 387
    int quality=0, internalQuality = 0, numRenders = 0, bucketChange = 0;
385 388
    DistortedNode child1, child2;
......
406 409
          if( lastBucket==0 )
407 410
            {
408 411
            clonePostprocessingViewport(this);
409
            oitClear(this);
412

  
413
            if( oit )
414
              {
415
              oitClear(this);
416
              }
410 417
            }
411 418
          else
412 419
            {
......
418 425
              }
419 426

  
420 427
            numRenders += lastQueue.postprocess(mBuffer,fbo);
421
            numRenders += oitBuild(time,mBuffer[quality],fbo);
422
            GLES31.glMemoryBarrier(GLES31.GL_SHADER_STORAGE_BARRIER_BIT|GLES31.GL_ATOMIC_COUNTER_BARRIER_BIT);
428

  
429
            if( oit )
430
              {
431
              numRenders += oitBuild(time, mBuffer[quality], fbo);
432
              GLES31.glMemoryBarrier(GLES31.GL_SHADER_STORAGE_BARRIER_BIT | GLES31.GL_ATOMIC_COUNTER_BARRIER_BIT);
433
              }
434
            else
435
              {
436
              numRenders += blitWithDepth(time, mBuffer[quality],fbo);
437
              }
423 438
            mBuffer[quality].clearBuffer(fbo);
424 439
            }
425 440

  
......
441 456
            }
442 457

  
443 458
          numRenders += currQueue.postprocess(mBuffer,fbo);
444
          numRenders += oitBuild(time,mBuffer[quality],fbo);
445
          GLES31.glMemoryBarrier(GLES31.GL_SHADER_STORAGE_BARRIER_BIT|GLES31.GL_ATOMIC_COUNTER_BARRIER_BIT);
446
          numRenders += oitRender(time,fbo);  // merge the OIT linked list
447
          mBuffer[quality].clearBuffer(fbo);
459

  
460
          if( oit )
461
            {
462
            numRenders += oitBuild(time, mBuffer[quality], fbo);
463
            GLES31.glMemoryBarrier(GLES31.GL_SHADER_STORAGE_BARRIER_BIT | GLES31.GL_ATOMIC_COUNTER_BARRIER_BIT);
464
            numRenders += oitRender(time, fbo);  // merge the OIT linked list
465
            mBuffer[quality].clearBuffer(fbo);
466
            }
467
          else
468
            {
469
            numRenders += blitWithDepth(time, mBuffer[quality],fbo);
470
            }
448 471
          }
449 472
        } // end else (postprocessed child)
450 473

  
......
610 633
      numRenders += mChildren.get(i).renderRecursive(time);
611 634
      }
612 635

  
613
    numRenders += renderChildren(time,mNumChildren,mChildren,fbo);
636
    numRenders += renderChildren(time,mNumChildren,mChildren,fbo, mRenderWayOIT);
614 637

  
615 638
    return numRenders;
616 639
    }
......
824 847
    return (mDepthStencilCreated==CREATED && mDepthStencil==BOTH_DEPTH_STENCIL);
825 848
    }
826 849

  
850
///////////////////////////////////////////////////////////////////////////////////////////////////
851
/**
852
 * When rendering this Node, should we use the Order Independent Transparency render more?
853
 * <p>
854
 * There are two modes of rendering: the fast 'normal' way, which however renders transparent
855
 * fragments in different ways depending on which fragments get rendered first, or the slower
856
 * 'oit' way, which renders transparent fragments correctly regardless of their order.
857
 *
858
 * @param oit True if we want to render more slowly, but in a way which accounts for transparency.
859
 */
860
  public void setOrderIndependentTransparency(boolean oit)
861
    {
862
    mRenderWayOIT = oit;
863
    }
864

  
827 865
///////////////////////////////////////////////////////////////////////////////////////////////////
828 866
/**
829 867
 * Adds a new child to the last position in the list of our Surface's children.

Also available in: Unified diff