因为需要EGLTextureView
里面使用的是TextureView
实现,可以满足Android View
的一些特性,而GLSurfaceView
是SurfaceView
实现,对View
的一些特性是不支持的
如何自定义EGLTextureView?
- 新建类
EGLTextureView
- 复制
GLSurfaceView
的所有内容到EGLTextureView
- 修改继承的类的
TextureView
,并实现TextureView.SurfaceTextureListener
接口 - 删除所有报错的地方
- 修改
EGLHelper
里createSurface
里创建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