2016-04-28 2 views
0

Im Anschluss an die Filterzeichnung ist die OnDraw Methode in GPUImageFilterGroup.java.Sie wissen nicht, warum GPUImageFilterGroup Verwendung Frame-Buffer gekippt, wenn sie in geraden Position

// GPUImageFilterGroup.java 
public void onDraw(final int textureId, final FloatBuffer cubeBuffer, 
        final FloatBuffer textureBuffer) { 
    runPendingOnDrawTasks(); 
    if (!isInitialized() || mFrameBuffers == null || mFrameBufferTextures == null) { 
     return; 
    } 
    if (mMergedFilters != null) { 
     int size = mMergedFilters.size(); 
     int previousTexture = textureId; 
     for (int i = 0; i < size; i++) { 
      GPUImageFilter filter = mMergedFilters.get(i); 
      boolean isNotLast = i < size - 1; 
      if (isNotLast) { 
       GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mFrameBuffers[i]); 
       GLES20.glClearColor(1, 0, 0, 0); 
      } 

      if (i == 0) { 
       filter.onDraw(previousTexture, cubeBuffer, textureBuffer); 
      } else if (i == size - 1) { 
       filter.onDraw(previousTexture, mGLCubeBuffer, (size % 2 == 0) ? mGLTextureFlipBuffer : mGLTextureBuffer); 
      } else { 
       filter.onDraw(previousTexture, mGLCubeBuffer, mGLTextureBuffer); 
      } 

      if (isNotLast) { 
       GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); 
       previousTexture = mFrameBufferTextures[i]; 
      } 
     } 
    } 
} 

mGLTextureBuffer speichert die Positionen der Textur.

public static final float TEXTURE_NO_ROTATION[] = { 
     0.0f, 1.0f, 
     1.0f, 1.0f, 
     0.0f, 0.0f, 
     1.0f, 0.0f, 
}; 

mGLTextureFlipBuffer ist die upside-down von mGLTextureBuffer in vertikaler Richtung.

kann einfach nicht herausfinden, warum auch und ungerade Filter Verwendung unterschiedlicher Puffer filtern als Linie zu folgen?

else if (i == size - 1) 
    filter.onDraw(previousTexture, mGLCubeBuffer, (size % 2 == 0) ? mGLTextureFlipBuffer : mGLTextureBuffer); 

Antwort

0

Wenn Sie GPUImage.setupCamera() aufrufen, werden Sie flipHorizontal und flipVertical passieren. Wenn Sie also eine gerade (oder ungerade) Anzahl von Filtern angewendet haben, wird die Textur gerade (oder ungerade) gewendet. Wenn Sie dies nicht mögen, ändern diese wie ich:

if (i == size - 1) {// the last filter 
     filter.onDraw(previousTexture, mGLCubeBuffer, textureBuffer); 
    } else { 
    //normalTextureBuffer is the not-clipped version of textureBuffer 
     filter.onDraw(previousTexture, mGLCubeBuffer, normalTextureBuffer); 
    } 

den oben stehenden Code verwenden, erhalten Sie einen 90-Grad-Drehung Textur erhalten, wenn Sie einen Filter zur Gruppe hinzufügen, so dass 4 Filter für eine 360-Grad-gedrehte (gleiche Rotation wie die Eingangstextur) Textur. mGLCubeBuffer und textureBuffer haben unterschiedliche Rotationen von 90 Grad.
Möge dies helfen.

Verwandte Themen