本文主要介绍渲染流程
相关的类图
GPUImageVIew类
主要创建了显示的图片的界面,根据不同的类型,分别创建SurfaceView或者TextureView。它还创建了图片处理类GPUImage,以及根据用户选择创建的GPUImageFilter
GPUImage类
负责图片的解码,filter的应用以及图片的保存
GPUImageGLSurfaceView和GPUImageGLTextureView用于图片的显示
关键的流程图
图片生成纹理
glTextureId = OpenGlUtils.loadTexture(
resizedBitmap != null ? resizedBitmap : bitmap, glTextureId, recycle);
public static int loadTexture(final Bitmap img, final int usedTexId, final boolean recycle) {
int textures[] = new int[1];
if (usedTexId == NO_TEXTURE) {
GLES20.glGenTextures(1, textures, 0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, img, 0);
} else {
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, usedTexId);
GLUtils.texSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0, img);
textures[0] = usedTexId;
}
if (recycle) {
img.recycle();
}
return textures[0];
}
透过GLUtils把一张bitmap生成纹理
Vertext shader 和 fragment shader
public GPUImageFilter(final String vertexShader, final String fragmentShader) {
runOnDraw = new LinkedList<>();
this.vertexShader = vertexShader;
this.fragmentShader = fragmentShader;
}
GPUImageFilter是父类,各种filter通过继承他,并改变相应的vertex shader和fragement shader应用不同的效果。
应用Filter后的图片保存
GPUImage.java:
public void saveToPictures(final Bitmap bitmap, final String folderName, final String fileName,
final OnPictureSavedListener listener) {
new SaveTask(bitmap, folderName, fileName, listener).execute();
}
@Override
protected Void doInBackground(final Void... params) {
Bitmap result = getBitmapWithFilterApplied(bitmap);
saveImage(folderName, fileName, result);
return null;
}
public Bitmap getBitmapWithFilterApplied(final Bitmap bitmap, boolean recycle) {
GPUImageRenderer renderer = new GPUImageRenderer(filter);
renderer.setRotation(Rotation.NORMAL,
this.renderer.isFlippedHorizontally(), this.renderer.isFlippedVertically());
renderer.setScaleType(scaleType);
PixelBuffer buffer = new PixelBuffer(bitmap.getWidth(), bitmap.getHeight());
buffer.setRenderer(renderer);
renderer.setImageBitmap(bitmap, recycle);
Bitmap result = buffer.getBitmap();
filter.destroy();
renderer.deleteImage();
buffer.destroy();
PixelBuffer.java:
eglSurface = egl10.eglCreatePbufferSurface(eglDisplay, eglConfig, attribList);
egl10.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);
通过创建离屏渲染的PixelBuffer来保存应用filter的图片。