Android OpenGLES + Camera1 相机预览(2)

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值