Android OpenGLES + Camera1 相机预览,大学生android开发项目实例

因为需要EGLTextureView里面使用的是TextureView实现,可以满足Android View的一些特性,而GLSurfaceViewSurfaceView实现,对View的一些特性是不支持的

如何自定义EGLTextureView?

  • 新建类EGLTextureView
  • 复制GLSurfaceView的所有内容到EGLTextureView
  • 修改继承的类的TextureView,并实现TextureView.SurfaceTextureListener接口
  • 删除所有报错的地方
  • 修改EGLHelpercreateSurface里创建EGLSurface的地方

如果觉得麻烦,可以参考笔者定义的EGLTextureView

到此,我们将环境搭建好了,那么接下来Renderer就是关键,如果你看了笔者定义的EGLTextureView,你会发现Renderer有些不一样,这个是因为我觉得既然都自定义EGLTextureView了,那么Renderer自然弄简单一点,也好理解一点

public interface Renderer {
void onCreate();

void onChange(int width, int height);

void onDraw();
}

三、BaseRender

注意到,EGLTextureView里面,setRenderer方法只能调用一次,因为在调用setRenderer的时候,如果发现GLThread已经存在了,则直接抛出异常

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值