Project

General

Profile

« Previous | Next » 

Revision 4b9fe2e9

Added by Leszek Koltunski over 7 years ago

Introduce concepts of 'in' and 'out' postprocessing qualities.

View differences:

src/main/java/org/distorted/library/effect/PostprocessEffect.java
139 139
 *
140 140
 * @y.exclude
141 141
 */
142
  public abstract int apply(float[] uniforms, int index, DistortedFramebuffer[] buffers);
142
  public abstract int apply(float[] uniforms, int index, int quality, DistortedFramebuffer[] buffers);
143 143

  
144 144
///////////////////////////////////////////////////////////////////////////////////////////////////
145 145
/**
src/main/java/org/distorted/library/effect/PostprocessEffectBlur.java
138 138
 *
139 139
 * @y.exclude
140 140
 */
141
  public int apply(float[] uniforms, int index, DistortedFramebuffer[] buffers)
141
  public int apply(float[] uniforms, int index, int quality, DistortedFramebuffer[] buffers)
142 142
    {
143 143
    if( mProgram1 ==null)
144 144
      {
......
146 146
      mProgram2 = mPrograms.get(mIndex2);
147 147
      }
148 148

  
149
    DistortedFramebuffer buffer = buffers[mQualityLevel];
149
    DistortedFramebuffer buffer = buffers[quality];
150 150

  
151 151
    buffer.setAsOutput();
152 152

  
......
198 198
    GLES30.glVertexAttribPointer(mProgram2.mAttribute[1], TEX_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadTexture);
199 199
    GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
200 200

  
201
    return 2;
201
    return quality;
202 202
    }
203 203

  
204 204
///////////////////////////////////////////////////////////////////////////////////////////////////
src/main/java/org/distorted/library/effect/PostprocessEffectGlow.java
141 141
 *
142 142
 * @y.exclude
143 143
 */
144
  public int apply(float[] uniforms, int index, DistortedFramebuffer[] buffers)
144
  public int apply(float[] uniforms, int index, int quality, DistortedFramebuffer[] buffers)
145 145
    {
146 146
    if( mProgram1 ==null)
147 147
      {
......
149 149
      mProgram2 = mPrograms.get(mIndex2);
150 150
      }
151 151

  
152
    DistortedFramebuffer buffer = buffers[mQualityLevel];
152
    int outQuality = (quality<mQualityLevel ? mQualityLevel:quality);
153 153

  
154
    buffer.setAsOutput();
154
    DistortedFramebuffer  inBuffer = buffers[quality];
155
    DistortedFramebuffer outBuffer = buffers[outQuality];
155 156

  
156
    float w1  = buffer.getWidth();
157
    float h1  = buffer.getHeight();
158
    float near= 1.0f - buffer.getNear();
157
    outBuffer.setAsOutput();
158

  
159
    float w1  = outBuffer.getWidth();
160
    float h1  = outBuffer.getHeight();
161
    float near= 1.0f - outBuffer.getNear();
159 162

  
160 163
    int radius = (int)(uniforms[index]*mQualityScale);
161 164
    if( radius>=MAX_HALO ) radius = MAX_HALO-1;
......
165 168
    radius = (radius+1)/2;
166 169
    GLES30.glViewport(0, 0, (int)w1, (int)h1);
167 170

  
168
    // horizontal blur
171
    // horizontal glow
169 172
    for(int i=0; i<=radius; i++) mOffsets[i] = offsetsCache[offset+i]/h1;
170 173

  
171 174
    mProgram1.useProgram();
172
    buffer.bindForOutput(1);
173
    buffer.setAsInput(0);
175
    outBuffer.bindForOutput(1);
176
    inBuffer.setAsInput(0);
174 177

  
175 178
    GLES30.glUniform1f ( mProgram1.mUniform[0] , near);
176 179
    GLES30.glUniform1i ( mProgram1.mUniform[1] , 0 );
......
181 184
    GLES30.glVertexAttribPointer(mProgram1.mAttribute[1], TEX_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadTexture);
182 185
    GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
183 186

  
184
    // vertical blur
187
    // vertical glow
185 188
    for(int i=0; i<=radius; i++) mOffsets[i] = offsetsCache[offset+i]/w1;
186 189

  
187 190
    mProgram2.useProgram();
188
    buffer.bindForOutput(0);
189
    buffer.setAsInput(1);
191
    outBuffer.bindForOutput(0);
192
    outBuffer.setAsInput(1);
190 193

  
191 194
    GLES30.glColorMask(true,true,true,true);
192 195
    GLES30.glClearColor(0.0f,0.0f,0.0f,0.0f);
......
201 204
    GLES30.glVertexAttribPointer(mProgram2.mAttribute[1], TEX_DATA_SIZE, GLES30.GL_FLOAT, false, 0, mQuadTexture);
202 205
    GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, 4);
203 206

  
204
    return 2;
207
    return outQuality;
205 208
    }
206 209

  
207 210
///////////////////////////////////////////////////////////////////////////////////////////////////
src/main/java/org/distorted/library/main/DistortedEffects.java
231 231

  
232 232
///////////////////////////////////////////////////////////////////////////////////////////////////
233 233

  
234
  int postprocess(DistortedOutputSurface surface)
234
  int postprocess(DistortedOutputSurface surface,int quality)
235 235
    {
236
    return mP.postprocess(surface);
236
    return mP.postprocess(surface,quality);
237
    }
238

  
239
///////////////////////////////////////////////////////////////////////////////////////////////////
240

  
241
  int getNumRenders()
242
    {
243
    return mP.getNumRenders();
237 244
    }
238 245

  
239 246
///////////////////////////////////////////////////////////////////////////////////////////////////
src/main/java/org/distorted/library/main/DistortedOutputSurface.java
250 250

  
251 251
  int renderChildren(long time, int numChildren, ArrayList<DistortedNode> children)
252 252
    {
253
    int quality=0, numRenders = 0, bucketChange = 0;
253
    int inQuality=0, outQuality, numRenders = 0, bucketChange = 0;
254 254
    DistortedNode child1, child2;
255 255
    DistortedEffects lastEffects=null, currEffects;
256 256
    long lastBucket=0, currBucket;
......
277 277
            for(int j=bucketChange; j<i; j++)
278 278
              {
279 279
              child2 = children.get(j);
280
              numRenders += child2.markStencilAndDepth(time,mBuffer[quality],lastEffects);
280
              numRenders += child2.markStencilAndDepth(time,mBuffer[inQuality],lastEffects);
281 281
              }
282 282

  
283
            numRenders += lastEffects.postprocess(this);
284
            numRenders += blitWithDepth(time, mBuffer[quality]);
283
            outQuality  = lastEffects.postprocess(this,inQuality);
284
            numRenders += lastEffects.getNumRenders();
285
            numRenders += blitWithDepth(time, mBuffer[outQuality]);
285 286
            }
286 287

  
287
          quality = currEffects.getQuality();
288
          inQuality = currEffects.getQuality();
288 289
          bucketChange = i;
289 290
          }
290 291

  
291
        numRenders += child1.draw(time,mBuffer[quality]);
292
        numRenders += child1.draw(time,mBuffer[inQuality]);
292 293

  
293 294
        if( i==numChildren-1 )
294 295
          {
295 296
          for(int j=bucketChange; j<numChildren; j++)
296 297
            {
297 298
            child2 = children.get(j);
298
            numRenders += child2.markStencilAndDepth(time,mBuffer[quality],currEffects);
299
            numRenders += child2.markStencilAndDepth(time,mBuffer[inQuality],currEffects);
299 300
            }
300 301

  
301
          numRenders += currEffects.postprocess(this);
302
          numRenders += blitWithDepth(time,mBuffer[quality]);
302
          outQuality  = currEffects.postprocess(this,inQuality);
303
          numRenders += currEffects.getNumRenders();
304
          numRenders += blitWithDepth(time, mBuffer[outQuality]);
303 305
          }
304 306
        }
305 307

  
src/main/java/org/distorted/library/main/EffectQueuePostprocess.java
91 91
    }
92 92

  
93 93
///////////////////////////////////////////////////////////////////////////////////////////////////
94
// TODO: for now, we assume each postprocessing effect issues 2 drawing calls (this is for statistical
95
// purposes only anyway)
94 96

  
95
  int postprocess(DistortedOutputSurface surface)
97
  int getNumRenders()
96 98
    {
97
    int numRenders = 0;
99
    return 2*mNumEffects;
100
    }
101

  
102
///////////////////////////////////////////////////////////////////////////////////////////////////
98 103

  
104
  int postprocess(DistortedOutputSurface surface, int quality)
105
    {
99 106
    DistortedRenderState.useStencilMark();
100 107

  
101 108
    for(int i=0; i<mNumEffects; i++)
102 109
      {
103
      numRenders += ((PostprocessEffect)mEffects[i]).apply(mUniforms,NUM_UNIFORMS*i, surface.mBuffer);
110
      quality = ((PostprocessEffect)mEffects[i]).apply(mUniforms,NUM_UNIFORMS*i, quality, surface.mBuffer);
104 111
      }
112

  
105 113
    DistortedRenderState.unuseStencilMark();
106 114

  
107
    return numRenders;
115
    return quality;
108 116
    }
109 117
  }

Also available in: Unified diff