当前位置:   article > 正文

Android OpenGLES + Camera1 相机预览(2)_opengles 安卓

opengles 安卓

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);
onEnableVertexAttributeArray();
onSetVertexData();
onSetCoordinateData();
onSetOtherData();
onDraw();
onDisableVertexAttributeArray();
onUnBind();
onDrawAfter();
}

@Override
public void onRelease() {
onDeleteProgram(program);
onDeleteShader(vert

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/973441
推荐阅读
相关标签
  

闽ICP备14008679号