Following is the onDraw method in GPUImageFilterGroup.java.
// 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 stores the positions of the texture.
public static final float TEXTURE_NO_ROTATION[] = {
0.0f, 1.0f,
1.0f, 1.0f,
0.0f, 0.0f,
1.0f, 0.0f,
};
mGLTextureFlipBuffer is the upside-down of mGLTextureBuffer in vertical direction.
Just can't figure out why even filter and odd filter use different buffer as following line?
else if (i == size - 1)
filter.onDraw(previousTexture, mGLCubeBuffer, (size % 2 == 0) ? mGLTextureFlipBuffer : mGLTextureBuffer);
When you call
GPUImage.setupCamera()
, you will passflipHorizontal
andflipVertical
. So, if you applied even (or odd) number of filters, the texture will be flipped even(or odd) times. If you don't like this, modify this as I do:Using the code above, you will get a 90-degree-rotated texture whenever you add one filter to the group, thus 4 filters for a 360-degree-rotated(same rotation as the input texture) texture.
mGLCubeBuffer
andtextureBuffer
have different rotations differing 90 degrees.May this help.