I modified the Grishu demo project: here Screen recording , then some explanation: 
(Image rotated, with three effects applied - horizontal flip, cross-process, fisheye)
1) To apply an effect on the result, your proposal works fine. I really don't understand what you mean by the effect of changing progress. "Do you want to adjust the effect parameters?
2) To have gestures, you must extend GLSurfaceView and implement GestureDetector.OnGestureListener and / or ScaleGestureDetector.OnScaleGestureListener depending on your needs. See TouchGLView here: Source or snippet below:
private class TouchGLView extends GLSurfaceView implements GestureDetector.OnGestureListener, ScaleGestureDetector.OnScaleGestureListener { private TextureRenderer mRenderer; private GestureDetector mTapDetector; private ScaleGestureDetector mScaleDetector; private float mLastSpan = 0; TouchGLView(Context c) { super(c);
3) You can rotate the image by changing the coordinates of the vertices and taking into account the viewports. In addition, you can apply different turns. You can rotate (and enlarge) the image (the coordinates of the vertices) directly (which does not affect the original texture buffer), or you can rotate the pixels in the texture buffer (which is easy for 90 ยฐ, 180 ยฐ, etc.), and then update vertex coordinates corresponding to the new image width / height.
Here is an example of vertex coordinate manipulation:
private void computeOutputVertices() { if (mPosVertices != null) { float imgAspectRatio = mTexWidth / (float)mTexHeight; float viewAspectRatio = mViewWidth / (float)mViewHeight; float x0, y0, x1, y1; // Set initial vertex coords based in texture aspect if (imgAspectRatio > 1.0f) { x0 = -1.0f ; y0 = -1.0f / imgAspectRatio; x1 = 1.0f ; y1 = 1.0f / imgAspectRatio; } else { x0 = -1.0f *imgAspectRatio; y0 = -1.0f; x1 = 1.0f *imgAspectRatio; y1 = 1.0f; } float[] coords = new float[] { x0, y0, x1, y0, x0, y1, x1, y1 }; // Scale coordinates with mZoom for (int i = 0; i < 8; i++) { coords[i] *= mZoom; } // Rotate coordinates with mRot float cosa = (float)Math.cos(mRot); float sina = (float)Math.sin(mRot); float x,y; for (int i = 0; i < 8; i+=2) { x = coords[i]; y = coords[i+1]; coords[i] = cosa*x-sina*y; coords[i+1] = sina*x+cosa*y; } // Finally scale again to match screen aspect if (viewAspectRatio > 1.0f) { for (int i = 0; i < 8; i+=2) { coords[i] = coords[i]/viewAspectRatio; } } else { for (int i = 1; i < 8; i+=2) { coords[i] = coords[i]*viewAspectRatio; } } mPosVertices.put(coords).position(0); } }
I suggest you dive into OpenGL matrices and use all these transformations using them.
I changed the TextureRenderer class to implement GLSurfaceView.Renderer and changed renderMode to RENDERMODE_CONTINUOUSLY .
Finally, the source for the modified demo is here .