private void checkRenderThreadState() {
if (mGLThread != null) {
throw new IllegalStateException(
“setRenderer has already been called for this instance.”);
}
}
也就是说,设置了Renderer
后,就不能更换了,那么如果有需求:本来是渲染一个灰度滤镜的,当想变换其他滤镜的时候,又不能重新设置Renderer
,此时应该如何
其实可以这样,Renderer
可以只做一个调度者,Renderer
里面可以写很多的滤镜,也可以变换滤镜,那么就可以满足我们的需求
那么接下来就先来定义一个基础滤镜
首先第一步,创建一个IRender
public interface IRender {
/**
- 创建
*/
void onCreate();
/**
- 设置尺寸
*/
void onChange(int width, int height);
/**
- 绘制
*/
void onDraw(int textureId);
/**
- 释放资源
*/
void onRelease();
}
和Renderer
有些许不同,修改和增加了一些方法
新建BaseRender,实现IRender接口
public class BaseRender implements IRender {
/**
- Context
*/
private Context context;
/**
- 渲染数据
*/
private BaseRenderBean renderBean;
/**
- 顶点坐标
*/
private FloatBuffer vertexBuffer;
/**
- 纹理坐标
*/
private FloatBuffer coordinateBuffer;
/**
- 顶点坐标维数(即x, y, z)
*/
private int vertexSize = 2;
/**
- 纹理坐标维数(即x, y, z)
*/
private int coordinateSize = 2;
/**
- 顶点坐标步长(即维数 * 字节数)
*/
private int vertexStride = vertexSize * 4;
/**
- 纹理坐标步长(即维数 * 字节数)
*/
private int coordinateStride = coordinateSize * 4;
/**
- 顶点个数
*/
private int vertexCount = 4;
/**
- 纹理点个数
*/
private int coordinateCount = 4;
/**
- vertex shader
*/
private int vertexShader;
/**
- frag shader
*/
private int fragShader;
/**
- program
*/
private int program;
/**
- 纹理 id
*/
private int textureId;
/**
- fbo纹理id
*/
private int fboTextureId;
/**
- fbo id
*/
private int fboId;
/**
- vbo id
*/
private int vboId;
/**
- 顶点着色器代码路径
*/
private String vertexFilename;
/**
- 片元着色器代码路径
*/
private String fragFilename;
/**
- 尺寸
*/
private int width;
private int height;
/**
- 是否绑定Fbo
*/
private boolean isBindFbo = false;
/**
- 着色器顶点坐标位置
*/
private int aPosLocation;
/**
- 着色器纹理坐标位置
*/
private int aCoordinateLocation;
/**
- 着色器纹理位置
*/
private int uSamplerLocation;
/**
- 是否执行了onCreate
*/
private boolean isCreate = false;
/**
- 是否执行了onChange
*/
private boolean isChange = false;
public BaseRender(Context context) {
this(context, “render/base/base/vertex.frag”, “render/base/base/frag.frag”);
}
public BaseRender(Context context, String vertexFilename, String fragFilename) {
this.context = context;
this.vertexFilename = vertexFilename;
this.fragFilename = fragFilename;
}
@Override
public void onCreate() {
if (isCreate) {
return;
}
onCreatePre();
onClearColor();
onInitBlend();
onInitVertexBuffer();
onInitCoordinateBuffer();
onInitVbo();
onInitProgram();
onCreateAfter();
isCreate = true;
}
@Override
public void onChange(int width, int height) {
if (isChange) {
return;
}
onChangePre();
setWidth(width);
setHeight(height);
onViewport();
onInitFbo();
onChangeAfter();
isChange = true;
}
@Override
public void onDraw(int textureId) {
if (!onReadyToDraw()) {
return;
}
onDrawPre();
onClear();
onUseProgram();
onInitLocation();
onBindFbo();
onBindVbo();
onActiveTexture(textureId);