Revision acb44099
Added by Leszek Koltunski over 7 years ago
| src/main/java/org/distorted/library/main/DistortedEffects.java | ||
|---|---|---|
| 85 | 85 | 
    }  | 
| 86 | 86 | 
     | 
| 87 | 87 | 
    ///////////////////////////////////////////////////////////////  | 
| 88 | 
      // this has to be at least as big as the number of pixels in
   | 
|
| 89 | 
      // the screen, lest the oitClear() pass overwrite memory.
   | 
|
| 90 | 
      private static int mBufferSize=(0x1<<23);  // 8 million entries
   | 
|
| 88 | 
      // meaning: allocate 1.0 screenful of places for transparent
   | 
|
| 89 | 
      // fragments in the SSBO backing up the OIT render method.
   | 
|
| 90 | 
      private static float mBufferSize=1.0f;
   | 
|
| 91 | 91 | 
     | 
| 92 | 92 | 
    /// OIT CLEAR PROGRAM ///  | 
| 93 | 93 | 
    private static DistortedProgram mOITClearProgram;  | 
| ... | ... | |
| 311 | 311 | 
    mOITBuildSizeH = GLES31.glGetUniformLocation( oitBuildProgramH, "u_Size");  | 
| 312 | 312 | 
    mOITBuildNumRecordsH = GLES31.glGetUniformLocation( oitBuildProgramH, "u_numRecords");  | 
| 313 | 313 | 
     | 
| 314 | 
    if( mLinkedListSSBO[0]<0 )  | 
|
| 315 | 
          {
   | 
|
| 316 | 
    GLES31.glGenBuffers(1,mLinkedListSSBO,0);  | 
|
| 317 | 
    GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, mLinkedListSSBO[0]);  | 
|
| 318 | 
    GLES31.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, mBufferSize*4 , null, GLES31.GL_DYNAMIC_READ|GLES31.GL_DYNAMIC_DRAW);  | 
|
| 319 | 
    GLES31.glBindBufferBase(GLES31.GL_SHADER_STORAGE_BUFFER, 1, mLinkedListSSBO[0]);  | 
|
| 320 | 
    GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, 0);  | 
|
| 321 | 
    }  | 
|
| 322 | 
     | 
|
| 323 | 
    if( mAtomicCounter[0]<0 )  | 
|
| 324 | 
          {
   | 
|
| 325 | 
    GLES31.glGenBuffers(1,mAtomicCounter,0);  | 
|
| 326 | 
    GLES31.glBindBufferBase(GLES31.GL_ATOMIC_COUNTER_BUFFER, 0, mAtomicCounter[0]);  | 
|
| 327 | 
    GLES31.glBindBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER, mAtomicCounter[0] );  | 
|
| 328 | 
    GLES31.glBufferData(GLES31.GL_ATOMIC_COUNTER_BUFFER, 4, null, GLES31.GL_DYNAMIC_DRAW);  | 
|
| 329 | 
    GLES31.glBindBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER, 0);  | 
|
| 330 | 
    }  | 
|
| 331 | 
     | 
|
| 332 | 314 | 
    // OIT COLLAPSE PROGRAM ///////////////////////////  | 
| 333 | 315 | 
    final InputStream oitCollapseVertStream = resources.openRawResource(R.raw.oit_vertex_shader);  | 
| 334 | 316 | 
    final InputStream oitCollapseFragStream = resources.openRawResource(R.raw.oit_collapse_fragment_shader);  | 
| ... | ... | |
| 472 | 454 | 
    mMainOITProgram.useProgram();  | 
| 473 | 455 | 
    GLES31.glUniform1i(mMainOITTextureH, 0);  | 
| 474 | 456 | 
    GLES31.glUniform2ui(mMainOITSizeH, surface.mWidth, surface.mHeight);  | 
| 475 | 
        GLES31.glUniform1ui(mMainOITNumRecordsH, (mBufferSize-surface.mWidth*surface.mHeight)/3 );  // see the fragment shader
   | 
|
| 457 | 
        GLES31.glUniform1ui(mMainOITNumRecordsH, (int)(mBufferSize*surface.mWidth*surface.mHeight) );
   | 
|
| 476 | 458 | 
     | 
| 477 | 459 | 
    GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mesh.mAttVBO[0]);  | 
| 478 | 460 | 
    GLES31.glVertexAttribPointer(mMainOITProgram.mAttribute[0], MeshObject.POS_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET0);  | 
| ... | ... | |
| 557 | 539 | 
     | 
| 558 | 540 | 
    static void zeroOutAtomic()  | 
| 559 | 541 | 
        {
   | 
| 542 | 
    if( mAtomicCounter[0]<0 )  | 
|
| 543 | 
          {
   | 
|
| 544 | 
    GLES31.glGenBuffers(1,mAtomicCounter,0);  | 
|
| 545 | 
    GLES31.glBindBufferBase(GLES31.GL_ATOMIC_COUNTER_BUFFER, 0, mAtomicCounter[0]);  | 
|
| 546 | 
    GLES31.glBindBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER, mAtomicCounter[0] );  | 
|
| 547 | 
    GLES31.glBufferData(GLES31.GL_ATOMIC_COUNTER_BUFFER, 4, null, GLES31.GL_DYNAMIC_DRAW);  | 
|
| 548 | 
    GLES31.glBindBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER, 0);  | 
|
| 549 | 
    }  | 
|
| 550 | 
     | 
|
| 560 | 551 | 
    GLES31.glBindBuffer(GLES31.GL_ATOMIC_COUNTER_BUFFER, mAtomicCounter[0] );  | 
| 561 | 552 | 
     | 
| 562 | 553 | 
    ByteBuffer atomicBuf = (ByteBuffer)GLES31.glMapBufferRange( GLES31.GL_ATOMIC_COUNTER_BUFFER, 0, 4,  | 
| ... | ... | |
| 584 | 575 | 
     | 
| 585 | 576 | 
    static void oitClear(DistortedOutputSurface surface)  | 
| 586 | 577 | 
        {
   | 
| 578 | 
    if( mLinkedListSSBO[0]<0 )  | 
|
| 579 | 
          {
   | 
|
| 580 | 
    int size = (int)(surface.mWidth*surface.mHeight*(3*mBufferSize+1)*4);  | 
|
| 581 | 
     | 
|
| 582 | 
    GLES31.glGenBuffers(1,mLinkedListSSBO,0);  | 
|
| 583 | 
    GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, mLinkedListSSBO[0]);  | 
|
| 584 | 
    GLES31.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, size, null, GLES31.GL_DYNAMIC_READ|GLES31.GL_DYNAMIC_DRAW);  | 
|
| 585 | 
    GLES31.glBindBufferBase(GLES31.GL_SHADER_STORAGE_BUFFER, 1, mLinkedListSSBO[0]);  | 
|
| 586 | 
    GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, 0);  | 
|
| 587 | 
    }  | 
|
| 588 | 
     | 
|
| 587 | 589 | 
    mOITClearProgram.useProgram();  | 
| 588 | 590 | 
     | 
| 589 | 591 | 
    GLES31.glViewport(0, 0, surface.mWidth, surface.mHeight );  | 
| ... | ... | |
| 606 | 608 | 
    GLES31.glUniform1i(mOITBuildDepthTextureH, 1);  | 
| 607 | 609 | 
    GLES31.glUniform2f(mOITBuildTexCorrH, corrW, corrH );  | 
| 608 | 610 | 
    GLES31.glUniform2ui(mOITBuildSizeH, surface.mWidth, surface.mHeight);  | 
| 609 | 
        GLES31.glUniform1ui(mOITBuildNumRecordsH, (mBufferSize-surface.mWidth*surface.mHeight)/3 );  // see the fragment shader
   | 
|
| 611 | 
        GLES31.glUniform1ui(mOITBuildNumRecordsH, (int)(mBufferSize*surface.mWidth*surface.mHeight) );
   | 
|
| 610 | 612 | 
    GLES31.glUniform1f(mOITBuildDepthH , 1.0f-surface.mNear);  | 
| 611 | 613 | 
    GLES31.glVertexAttribPointer(mOITBuildProgram.mAttribute[0], 2, GLES31.GL_FLOAT, false, 0, mQuadPositions);  | 
| 612 | 614 | 
    GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, 4);  | 
Also available in: Unified diff
Make the OIT SSBO size independent of screen size.