Project

General

Profile

« Previous | Next » 

Revision ae2802b1

Added by Leszek Koltunski about 6 years ago

Postprocessing buffers mBuffer[] are now shared among all postprocessing operations. This saves a lot of memory, but also means that when doing each particular postprocessing, the textures backing up the mBuffer might be too large. We need to fix two things here: when outputting to those too large textures, we need to adjust the Viewport, and when binding those too large textures as input - we need to adjust the TexCoords to compensate.

This commit does just that. Verified as working by the 'PostprocessTree' app.

View differences:

src/main/java/org/distorted/library/effect/PostprocessEffectGlow.java
161 161
    float h= outBuffer.getHeight();
162 162
    float n= 1.0f - outBuffer.getNear();
163 163

  
164
    float corrW = inBuffer.getWidthCorrection();
165
    float corrH = inBuffer.getHeightCorrection();
166
    float offsetCorrW = corrW/w;
167
    float offsetCorrH = corrH/h;
168

  
164 169
    int radius = (int)(uniforms[index]*mQualityScale);
165 170
    if( radius>=MAX_HALO ) radius = MAX_HALO-1;
166 171
    computeGaussianKernel(radius);
......
172 177
    GLES31.glViewport(0, 0, (int)w, (int)h);
173 178

  
174 179
    // horizontal glow
175
    for(int i=0; i<=radius; i++) mOffsets[i] = offsetsCache[offset+i]/w;
180
    for(int i=0; i<=radius; i++) mOffsets[i] = offsetsCache[offset+i]*offsetCorrW;
176 181

  
177 182
    mProgram1.useProgram();
178 183
    outBuffer.bindForOutput(1);
179 184
    inBuffer.setAsInput(0);
180 185

  
181 186
    GLES31.glUniform1f ( mProgram1.mUniform[0] , n );
182
    GLES31.glUniform1i ( mProgram1.mUniform[1] , 0 );
183
    GLES31.glUniform1fv( mProgram1.mUniform[2] , radius+1, mOffsets,0);
184
    GLES31.glUniform1fv( mProgram1.mUniform[3] , radius+1, weightsCache,offset);
185
    GLES31.glUniform1i ( mProgram1.mUniform[4] , radius);
186
    GLES31.glUniform4f ( mProgram1.mUniform[5] , uniforms[index+1], uniforms[index+2], uniforms[index+3], uniforms[index+4]);
187
    GLES31.glUniform2f ( mProgram1.mUniform[1] , corrW, corrH );
188
    GLES31.glUniform1i ( mProgram1.mUniform[2] , 0 );
189
    GLES31.glUniform1fv( mProgram1.mUniform[3] , radius+1, mOffsets,0);
190
    GLES31.glUniform1fv( mProgram1.mUniform[4] , radius+1, weightsCache,offset);
191
    GLES31.glUniform1i ( mProgram1.mUniform[5] , radius);
192
    GLES31.glUniform4f ( mProgram1.mUniform[6] , uniforms[index+1], uniforms[index+2], uniforms[index+3], uniforms[index+4]);
187 193
    GLES31.glVertexAttribPointer(mProgram1.mAttribute[0], POS_DATA_SIZE, GLES31.GL_FLOAT, false, 0, mQuadPositions);
188 194
    GLES31.glVertexAttribPointer(mProgram1.mAttribute[1], TEX_DATA_SIZE, GLES31.GL_FLOAT, false, 0, mQuadTexture);
189 195
    GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, 4);
190 196

  
191 197
    // vertical glow
192
    for(int i=0; i<=radius; i++) mOffsets[i] = offsetsCache[offset+i]/h;
198
    for(int i=0; i<=radius; i++) mOffsets[i] = offsetsCache[offset+i]*offsetCorrH;
193 199

  
194 200
    mProgram2.useProgram();
195 201
    outBuffer.bindForOutput(0);
196 202
    outBuffer.setAsInput(1);
197 203

  
198 204
    GLES31.glUniform1f ( mProgram2.mUniform[0] , n );
199
    GLES31.glUniform1i ( mProgram2.mUniform[1] , 0 );
200
    GLES31.glUniform1fv( mProgram2.mUniform[2] , radius+1, mOffsets,0);
201
    GLES31.glUniform1fv( mProgram2.mUniform[3] , radius+1, weightsCache,offset);
202
    GLES31.glUniform1i ( mProgram2.mUniform[4] , radius);
203
    GLES31.glUniform4f ( mProgram1.mUniform[5] , uniforms[index+1], uniforms[index+2], uniforms[index+3], uniforms[index+4]);
205
    GLES31.glUniform2f ( mProgram2.mUniform[1] , corrW, corrH );
206
    GLES31.glUniform1i ( mProgram2.mUniform[2] , 0 );
207
    GLES31.glUniform1fv( mProgram2.mUniform[3] , radius+1, mOffsets,0);
208
    GLES31.glUniform1fv( mProgram2.mUniform[4] , radius+1, weightsCache,offset);
209
    GLES31.glUniform1i ( mProgram2.mUniform[5] , radius);
210
    GLES31.glUniform4f ( mProgram1.mUniform[6] , uniforms[index+1], uniforms[index+2], uniforms[index+3], uniforms[index+4]);
204 211
    GLES31.glVertexAttribPointer(mProgram2.mAttribute[0], POS_DATA_SIZE, GLES31.GL_FLOAT, false, 0, mQuadPositions);
205 212
    GLES31.glVertexAttribPointer(mProgram2.mAttribute[1], TEX_DATA_SIZE, GLES31.GL_FLOAT, false, 0, mQuadTexture);
206 213
    GLES31.glDrawArrays(GLES31.GL_TRIANGLE_STRIP, 0, 4);
......
235 242
      "in vec2 a_TexCoord;    \n"+
236 243
      "out vec2 v_TexCoord;   \n"+
237 244
      "uniform float u_Depth; \n"+
245
      "uniform vec2 u_TexCorr;\n"+
238 246

  
239 247
      "void main()                                      \n"+
240 248
      "  {                                              \n"+
241
      "  v_TexCoord = a_TexCoord;                       \n"+
249
      "  v_TexCoord = a_TexCoord * u_TexCorr;           \n"+
242 250
      "  gl_Position= vec4(2.0*a_Position,u_Depth,1.0); \n"+
243 251
      "  }";
244 252

  

Also available in: Unified diff