Project

General

Profile

« Previous | Next » 

Revision c1a38ba3

Added by Leszek Koltunski over 6 years ago

Progress with non-postprocessed OIT.

Status: compiles, but fails to work on both Adreno and Mali. Crashes the app (Adreno) or the whole system (Mali)

View differences:

src/main/java/org/distorted/library/main/Distorted.java
120 120
      {
121 121
      if( version.contains("r12") )
122 122
        {
123
        android.util.Log.e("DISTORTED", "You are running this on a ARM Mali driver r12. This is a buggy driver, please update to r22. Problems with flashing expected.");
123
        android.util.Log.e("DISTORTED", "You are running this on a ARM Mali driver r12.\nThis is a buggy driver, please update to r22. Problems with flashing expected.");
124 124
        }
125 125
      }
126 126
    else if( vendor.contains("Imagination") )
127 127
      {
128 128
      if( renderer.contains("GE8") )
129 129
        {
130
        android.util.Log.e("DISTORTED", "You are running this on a PowerVR GE8XXX. Due to a buggy compiler OIT rendering will not work");
130
        android.util.Log.e("DISTORTED", "You are running this on a PowerVR GE8XXX.\nDue to a buggy compiler OIT rendering will not work");
131 131
        }
132 132
      }
133 133
    }
src/main/java/org/distorted/library/main/DistortedEffects.java
70 70
  private static int mBlitDepthDepthH;
71 71
  private static int mBlitDepthTexCorrH;
72 72

  
73
  /// NORMAL PROGRAM /////
74
  private static DistortedProgram mNormalProgram;
75
  private static int mNormalMVPMatrixH;
76

  
73 77
  /// OIT SSBO BUFFER ///
74 78
  private static int[] mLinkedListSSBO = new int[1];
75 79
  private static int[] mAtomicCounter = new int[1];
......
113 117
  private static int mOITRenderTexCorrH;
114 118
  private static int mOITRenderSizeH;
115 119

  
116
  /// NORMAL PROGRAM /////
117
  private static DistortedProgram mNormalProgram;
118
  private static int mNormalMVPMatrixH;
120
  /// MAIN OIT PROGRAM ///
121
  private static DistortedProgram mMainOITProgram;
122
  private static int mMainOITTextureH;
123
  private static int mMainOITSizeH;
124
  private static int mMainOITNumRecordsH;
119 125
  /// END PROGRAMS //////
120 126

  
121 127
  private static long mNextID =0;
......
228 234

  
229 235
  static void createProgramsOIT(Resources resources)
230 236
    {
237
    // MAIN OIT PROGRAM ////////////////////////////////
238
    final InputStream mainVertStream = resources.openRawResource(R.raw.main_vertex_shader);
239
    final InputStream mainFragStream = resources.openRawResource(R.raw.main_fragment_shader);
240

  
241
    int numF = FragmentEffect.getNumEnabled();
242
    int numV = VertexEffect.getNumEnabled();
243

  
244
    String mainVertHeader= Distorted.GLSL_VERSION +
245
                           ("#define NUM_VERTEX "   + ( numV>0 ? getMax(EffectType.VERTEX  ) : 0 ) + "\n") +
246
                           ("#define OIT\n");
247
    String mainFragHeader= Distorted.GLSL_VERSION +
248
                           ("#define NUM_FRAGMENT " + ( numF>0 ? getMax(EffectType.FRAGMENT) : 0 ) + "\n") +
249
                           ("#define OIT\n");
250

  
251
    String enabledEffectV= VertexEffect.getGLSL();
252
    String enabledEffectF= FragmentEffect.getGLSL();
253

  
254
    try
255
      {
256
      mMainOITProgram = new DistortedProgram(mainVertStream, mainFragStream, mainVertHeader, mainFragHeader,
257
          enabledEffectV, enabledEffectF, Distorted.GLSL, null);
258
      }
259
    catch(Exception e)
260
      {
261
      Log.e("EFFECTS", e.getClass().getSimpleName()+" trying to compile MAIN OIT program: "+e.getMessage());
262
      throw new RuntimeException(e.getMessage());
263
      }
264

  
265
    int mainOITProgramH = mMainOITProgram.getProgramHandle();
266
    EffectQueueFragment.getUniformsOIT(mainOITProgramH);
267
    EffectQueueVertex.getUniformsOIT(mainOITProgramH);
268
    EffectQueueMatrix.getUniformsOIT(mainOITProgramH);
269
    mMainOITTextureH    = GLES31.glGetUniformLocation( mainOITProgramH, "u_Texture");
270
    mMainOITSizeH       = GLES31.glGetUniformLocation( mainOITProgramH, "u_Size");
271
    mMainOITNumRecordsH = GLES31.glGetUniformLocation( mainOITProgramH, "u_numRecords");
272

  
231 273
    // OIT CLEAR PROGRAM ////////////////////////////////////
232 274
    final InputStream oitClearVertStream = resources.openRawResource(R.raw.oit_vertex_shader);
233 275
    final InputStream oitClearFragStream = resources.openRawResource(R.raw.oit_clear_fragment_shader);
......
414 456
    GLES31.glDrawArrays(GLES31.GL_LINES, 0, 2*mesh.numVertices);
415 457
    }
416 458

  
459
///////////////////////////////////////////////////////////////////////////////////////////////////
460

  
461
  void drawPrivOIT(float halfW, float halfH, MeshObject mesh, DistortedOutputSurface surface, long currTime, float marginInPixels)
462
    {
463
    float halfZ = halfW*mesh.zFactor;
464

  
465
    mM.compute(currTime);
466
    mV.compute(currTime,halfW,halfH,halfZ);
467
    mF.compute(currTime,halfW,halfH);
468
    mP.compute(currTime);
469

  
470
    GLES31.glViewport(0, 0, surface.mWidth, surface.mHeight );
471

  
472
    mMainOITProgram.useProgram();
473
    GLES31.glUniform1i(mMainOITTextureH, 0);
474
    GLES31.glUniform2ui(mMainOITSizeH, surface.mWidth, surface.mHeight);
475
    GLES31.glUniform1ui(mMainOITNumRecordsH, (mBufferSize-surface.mWidth*surface.mHeight)/3 );  // see the fragment shader
476

  
477
    GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mesh.mAttVBO[0]);
478
    GLES31.glVertexAttribPointer(mMainOITProgram.mAttribute[0], MeshObject.POS_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET0);
479
    GLES31.glVertexAttribPointer(mMainOITProgram.mAttribute[1], MeshObject.NOR_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET1);
480
    GLES31.glVertexAttribPointer(mMainOITProgram.mAttribute[2], MeshObject.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET2);
481
    GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0);
482

  
483
    mM.sendOIT(surface,halfW,halfH,halfZ,marginInPixels);
484
    mV.sendOIT();
485
    mF.sendOIT();
486

  
487
    GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, mesh.numVertices);
488

  
489
    if( mesh.mShowNormals ) displayNormals(mesh);
490
    }
491

  
417 492
///////////////////////////////////////////////////////////////////////////////////////////////////
418 493

  
419 494
  void drawPriv(float halfW, float halfH, MeshObject mesh, DistortedOutputSurface surface, long currTime, float marginInPixels)
src/main/java/org/distorted/library/main/DistortedNode.java
293 293
    return 0;
294 294
    }
295 295

  
296
///////////////////////////////////////////////////////////////////////////////////////////////////
297
// Use the Order Independent Transparency method to draw a non-postprocessed child.
298

  
299
  int drawOIT(long currTime, DistortedOutputSurface surface)
300
    {
301
    DistortedInputSurface input = mNumChildren[0]==0 ? mSurface : mData.mFBO;
302

  
303
    if( input.setAsInput() )
304
      {
305
      mState.apply();
306
      mEffects.drawPrivOIT(mSurface.getWidth()/2.0f, mSurface.getHeight()/2.0f, mMesh, surface, currTime, 0);
307
      return 1;
308
      }
309

  
310
    return 0;
311
    }
312

  
296 313
///////////////////////////////////////////////////////////////////////////////////////////////////
297 314
// return the total number of render calls issued
298 315

  
src/main/java/org/distorted/library/main/DistortedOutputSurface.java
395 395
    EffectQueuePostprocess lastQueue=null, currQueue;
396 396
    long lastBucket=0, currBucket;
397 397

  
398
    if( oit && numChildren>0 )
399
      {
400
      oitClear(this);
401
      }
402

  
398 403
    for(int i=0; i<numChildren; i++)
399 404
      {
400 405
      child1 = children.get(i);
......
404 409
      if( currBucket==0 )
405 410
        {
406 411
        setAsOutputFBO(time,fbo);
407
        numRenders += child1.draw(time,this);
412

  
413
        if( oit )
414
          {
415
          numRenders += child1.drawOIT(time, this);
416
          GLES31.glMemoryBarrier(GLES31.GL_SHADER_STORAGE_BARRIER_BIT | GLES31.GL_ATOMIC_COUNTER_BARRIER_BIT);
417
          }
418
        else
419
          {
420
          numRenders += child1.draw(time, this);
421
          }
408 422
        }
409 423
      else
410 424
        {
......
415 429
          if( lastBucket==0 )
416 430
            {
417 431
            clonePostprocessingViewport(this);
418

  
419
            if( oit )
420
              {
421
              oitClear(this);
422
              }
423 432
            }
424 433
          else
425 434
            {
......
467 476
            {
468 477
            numRenders += oitBuild(time, mBuffer[quality], fbo);
469 478
            GLES31.glMemoryBarrier(GLES31.GL_SHADER_STORAGE_BARRIER_BIT | GLES31.GL_ATOMIC_COUNTER_BARRIER_BIT);
470
            numRenders += oitRender(time, fbo);  // merge the OIT linked list
471 479
            mBuffer[quality].clearBuffer(fbo);
472 480
            }
473 481
          else
......
481 489
      lastBucket= currBucket;
482 490
      } // end main for loop
483 491

  
492
    if( oit && numChildren>0 )
493
      {
494
      numRenders += oitRender(time, fbo);  // merge the OIT linked list
495
      }
496

  
484 497
    return numRenders;
485 498
    }
486 499

  
src/main/java/org/distorted/library/main/EffectQueueFragment.java
31 31
  {
32 32
  private static final int NUM_UNIFORMS = FragmentEffect.NUM_UNIFORMS;
33 33
  private static final int INDEX = EffectType.FRAGMENT.ordinal();
34

  
34 35
  private static int mNumEffectsH;
35 36
  private static int mNameH;
36 37
  private static int mUniformsH;
37
  
38

  
39
  private static int mNumEffectsOITH;
40
  private static int mNameOITH;
41
  private static int mUniformsOITH;
42

  
38 43
///////////////////////////////////////////////////////////////////////////////////////////////////
39 44
   
40 45
  EffectQueueFragment(long id)
......
51 56
    mUniformsH  = GLES31.glGetUniformLocation( mProgramH, "fUniforms");
52 57
    }
53 58

  
59
///////////////////////////////////////////////////////////////////////////////////////////////////
60

  
61
  static void getUniformsOIT(int mProgramH)
62
    {
63
    mNumEffectsOITH= GLES31.glGetUniformLocation( mProgramH, "fNumEffects");
64
    mNameOITH      = GLES31.glGetUniformLocation( mProgramH, "fName");
65
    mUniformsOITH  = GLES31.glGetUniformLocation( mProgramH, "fUniforms");
66
    }
67

  
54 68
///////////////////////////////////////////////////////////////////////////////////////////////////
55 69
  
56 70
  void compute(long currTime,float halfX, float halfY)
......
95 109
      GLES31.glUniform4fv( mUniformsH,(NUM_UNIFORMS/4)*mNumEffects, mUniforms,0);
96 110
      }  
97 111
    }
112

  
113
///////////////////////////////////////////////////////////////////////////////////////////////////
114

  
115
  void sendOIT()
116
    {
117
    GLES31.glUniform1i( mNumEffectsOITH, mNumEffects);
118

  
119
    if( mNumEffects>0 )
120
      {
121
      GLES31.glUniform1iv( mNameOITH    ,                 mNumEffects, mName    ,0);
122
      GLES31.glUniform4fv( mUniformsOITH,(NUM_UNIFORMS/4)*mNumEffects, mUniforms,0);
123
      }
124
    }
98 125
  }
src/main/java/org/distorted/library/main/EffectQueueMatrix.java
43 43
  private static float mMiny;
44 44
  private static float mMaxy;
45 45

  
46
  private static int mObjDH;      // This is a handle to half a Object dimensions
47
  private static int mMVPMatrixH; // the transformation matrix
48
  private static int mMVMatrixH;  // the modelview matrix.
46
  private static int mObjDH;         // This is a handle to half a Object dimensions
47
  private static int mMVPMatrixH;    // the transformation matrix
48
  private static int mMVMatrixH;     // the modelview matrix.
49

  
50
  private static int mObjDOITH;      //
51
  private static int mMVPMatrixOITH; // Same like above, but in main OIT program.
52
  private static int mMVMatrixOITH;  //
49 53

  
50 54
///////////////////////////////////////////////////////////////////////////////////////////////////
51 55
   
......
108 112
    mMVMatrixH = GLES31.glGetUniformLocation(mProgramH, "u_MVMatrix"); 
109 113
    }
110 114

  
115
///////////////////////////////////////////////////////////////////////////////////////////////////
116

  
117
  static void getUniformsOIT(int mProgramH)
118
    {
119
    mObjDOITH     = GLES31.glGetUniformLocation(mProgramH, "u_objD");
120
    mMVPMatrixOITH= GLES31.glGetUniformLocation(mProgramH, "u_MVPMatrix");
121
    mMVMatrixOITH = GLES31.glGetUniformLocation(mProgramH, "u_MVMatrix");
122
    }
123

  
111 124
///////////////////////////////////////////////////////////////////////////////////////////////////
112 125

  
113 126
  void compute(long currTime)
......
162 175
    GLES31.glUniformMatrix4fv(mMVMatrixH , 1, false, mViewMatrix, 0);
163 176
    GLES31.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix , 0);
164 177
    }
178

  
179
///////////////////////////////////////////////////////////////////////////////////////////////////
180

  
181
  void sendOIT(DistortedOutputSurface projection, float halfX, float halfY, float halfZ, float marginInPixels)
182
    {
183
    Matrix.setIdentityM(mViewMatrix, 0);
184
    Matrix.translateM(mViewMatrix, 0, -projection.mWidth/2, projection.mHeight/2, -projection.mDistance);
185
    float mipmap = projection.mMipmap;
186
    if( mipmap!=1 ) Matrix.scaleM(mViewMatrix, 0, mipmap, mipmap, mipmap);
187

  
188
    for(int i=0; i<mNumEffects; i++) ((MatrixEffect)mEffects[i]).apply(mViewMatrix,mUniforms,i);
189

  
190
    Matrix.translateM(mViewMatrix, 0, halfX,-halfY,-halfZ);
191
    if( marginInPixels!=0 ) magnify(projection,halfX,halfY,halfZ, marginInPixels);
192
    Matrix.multiplyMM(mMVPMatrix, 0, projection.mProjectionMatrix, 0, mViewMatrix, 0);
193

  
194
    GLES31.glUniform3f( mObjDOITH , halfX, halfY, halfZ);
195
    GLES31.glUniformMatrix4fv(mMVMatrixOITH , 1, false, mViewMatrix, 0);
196
    GLES31.glUniformMatrix4fv(mMVPMatrixOITH, 1, false, mMVPMatrix , 0);
197
    }
165 198
  }
src/main/java/org/distorted/library/main/EffectQueueVertex.java
31 31
  { 
32 32
  private static final int NUM_UNIFORMS = VertexEffect.NUM_UNIFORMS;
33 33
  private static final int INDEX = EffectType.VERTEX.ordinal();
34

  
34 35
  private static int mNumEffectsH;
35 36
  private static int mNameH;
36 37
  private static int mUniformsH;
37
  
38

  
39
  private static int mNumEffectsOITH;
40
  private static int mNameOITH;
41
  private static int mUniformsOITH;
42

  
38 43
///////////////////////////////////////////////////////////////////////////////////////////////////
39 44
   
40 45
  EffectQueueVertex(long id)
......
51 56
    mUniformsH  = GLES31.glGetUniformLocation( mProgramH, "vUniforms");
52 57
    }
53 58

  
59
///////////////////////////////////////////////////////////////////////////////////////////////////
60

  
61
  static void getUniformsOIT(int mProgramH)
62
    {
63
    mNumEffectsOITH= GLES31.glGetUniformLocation( mProgramH, "vNumEffects");
64
    mNameOITH      = GLES31.glGetUniformLocation( mProgramH, "vName");
65
    mUniformsOITH  = GLES31.glGetUniformLocation( mProgramH, "vUniforms");
66
    }
67

  
54 68
///////////////////////////////////////////////////////////////////////////////////////////////////
55 69
  
56 70
  void compute(long currTime,float halfX, float halfY, float halfZ)
......
96 110
      GLES31.glUniform4fv( mUniformsH,(NUM_UNIFORMS/4)*mNumEffects, mUniforms,0);
97 111
      }
98 112
    }
113

  
114
///////////////////////////////////////////////////////////////////////////////////////////////////
115

  
116
  void sendOIT()
117
    {
118
    GLES31.glUniform1i( mNumEffectsOITH, mNumEffects);
119

  
120
    if( mNumEffects>0 )
121
      {
122
      GLES31.glUniform1iv( mNameOITH    ,                 mNumEffects, mName    ,0);
123
      GLES31.glUniform4fv( mUniformsOITH,(NUM_UNIFORMS/4)*mNumEffects, mUniforms,0);
124
      }
125
    }
99 126
  }
src/main/res/raw/main_fragment_shader.glsl
18 18
//////////////////////////////////////////////////////////////////////////////////////////////
19 19

  
20 20
precision highp float;
21
precision highp int;
21 22

  
22 23
in vec3 v_Position;                     // Interpolated position for this fragment.
23 24
in vec3 v_Normal;                       // Interpolated normal for this fragment.
......
93 94
      }
94 95
    }
95 96
  }
97

  
98
//////////////////////////////////////////////////////////////////////////////////////////////
99

  
100
uint convert(vec4 c)
101
  {
102
  return ((uint(255.0*c.r))<<24u) + ((uint(255.0*c.g))<<16u) + ((uint(255.0*c.b))<<8u) + uint(255.0*c.a);
103
  }
104

  
96 105
#endif   // OIT
97 106

  
98 107
//////////////////////////////////////////////////////////////////////////////////////////////
......
118 127
#endif
119 128

  
120 129
#ifdef OIT
121
  if( frag.a > 0.95 )
130
  if( color.a > 0.95 )
122 131
    {
123 132
    fragColor= vec4(color.rgb * (1.0 + 7.0*v_Normal.z) * 0.125, color.a);
124 133
    }
125 134
  else
126 135
    {
127
    if( frag.a > 0.0 )
136
    if( color.a > 0.0 )
128 137
      {
129 138
      const float S= 2147483647.0; // max signed int. Could probably be max unsigned int but this is enough.
130
      insert(v_Pixel, uint(S*(1.0-depth)/2.0), convert(frag) );
139
      insert(v_Pixel, uint(S*(1.0-gl_FragCoord.z)/2.0), convert(color) );
131 140
      }
132 141
    discard;
133 142
    }
src/main/res/raw/main_vertex_shader.glsl
18 18
//////////////////////////////////////////////////////////////////////////////////////////////
19 19

  
20 20
precision highp float;
21
precision highp int;
21 22

  
22 23
in vec3 a_Position;                  // Per-vertex position.
23 24
in vec3 a_Normal;                    // Per-vertex normal vector.
src/main/res/raw/oit_build_fragment_shader.glsl
95 95

  
96 96
void main()                    		
97 97
  {
98
  vec4  frag = texture(u_Texture     , v_TexCoordinate);
98
  vec4  color= texture(u_Texture     , v_TexCoordinate);
99 99
  float depth= texture(u_DepthTexture, v_TexCoordinate).r;
100 100

  
101
  if( frag.a > 0.95 )
101
  if( color.a > 0.95 )
102 102
    {
103 103
    gl_FragDepth = depth;
104
    fragColor    = frag;
104
    fragColor    = color;
105 105
    }
106 106
  else
107 107
    {
108
    if( frag.a > 0.0 )
108
    if( color.a > 0.0 )
109 109
      {
110 110
      const float S= 2147483647.0; // max signed int. Could probably be max unsigned int but this is enough.
111
      insert(v_Pixel, uint(S*(1.0-depth)/2.0), convert(frag) );
111
      insert(v_Pixel, uint(S*(1.0-depth)/2.0), convert(color) );
112 112
      }
113 113
    discard;
114 114
    }

Also available in: Unified diff