翻译一下大家都明白了:Open Graphics Library,简单说就是图形库
着色器语言
仅适合GPU编程,对于顶点着色器和片元着色器的开发都需要用到着色器语言进行开发
顶点着色器
顶点着色器(Vertex Shader)是在GPU上运行的小程序。从名称可以看出,可通过处理它们来处理顶点
片元着色器
片元着色器计算每个像素的颜色和其它属性。它通过应用光照值、凹凸贴图,阴影,镜面高光,半透明等处理来计算像素的颜色并输出。
它也可改变像素的深度(z-buffering)或在多个渲染目标被激活的状态下输出多种颜色。
一个片元着色器不能产生复杂的效果,因为它只在一个像素上进行操作,而不知道场景的几何形状。
(OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机等嵌入式设备而设计
请记住:在OpenGL ES的世界里,没有四边形、多边形,无论多复杂的图形都是由点、线和三角形组成的
了解了OpenGL
,OpenGL ES
后,接下来了解Android中关联OpenGL ES
的几个常用控件
SurfaceView
是Android1.0
得时候就有了,继承自View
,但与View又有所不同
首先SurfaceView也是一个View,它也有自己的生命周期。因为它需要另外一个线程
来执行绘制操作,所以我们可以在它生命周期的初始化阶段开辟一个新线程执行绘制
,当生命周期的结束阶段我们插入结束绘制线程的操作。这些是由其内部一个SurfaceHolder
对象完成的
GLSurfaceView
从Android1.5
(API level 3)开始加入,作为SurfaceView的补充
。它可以看作是SurfaceView的一种典型使用模式
。在SurfaceView基础上,它加入了EGL的管理,并自带了渲染线程
(Renderer)
它得用法也非常简单,只要设置了Renderer
(setRenderer)就可以了,其他得操作全都在Renderer里面执行,从而实现解耦
实际上GLSurfaceView 相当于一块画布,而Renderer是画笔,通过setRenderer把这画布、画笔关联起来
GlSurfaceView继承自SurfaceView。并增加了Renderer接口,提供三个回调方法
GLSurfaceView glSurfaceView = new GLSurfaceView(this);
glSurfaceView.setRenderer(new GLSurfaceView.Renderer() {
// GlSurfaceView 创建的时候回调,可以做一些参数初始化操作
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {}
// GlSurfaceView尺寸发送变化时回调,例如横竖屏切换
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {}
// 此方法频繁回调,我们可以在这个方法里面进行绘制操作
@Override
public void onDrawFrame(GL10 gl) {}
});
为了防止页面退出时,GLSurfaceView仍在绘制中,所以需要增加类似安全代码
@Override
protected void onPause() {
super.onPause();
if (glSurfaceView != null) {
glSurfaceView.onPause();
}
}
@Override
protected void onResume() {
super.onResume();
if (glSurfaceView != null) {
glSurfaceView.onResume();
}
}
SurfaceTexture
从Android 3.0
(API level 11)加入。和SurfaceView不同的是,它对图像流的处理并不直接显示,而是转为GL外部纹理
,因此可用于图像流数据
的二次处理
(如Camera滤镜
,桌面特效等)
也就是说这个东西不是用来显示给用户看的, 它是一个Texture(纹理
), 可以想象成一个View的中间件。通俗举个例子:Camera
把视频采集的内容交给 SurfaceTexture
, SurfaceTexture 在对内容做个美颜
, 然后SurfaceTexture
再把内容交给SurfaceView
或GLSurfaceView
。这就是最后呈现给用户视觉上的美颜内容了
当然实现美容效果远不止这种,Camera+GLSurfaceView + GPUImage(GPUImage 原是iOS下一个开源的基于GPU的图像处理库,提供各种图像处理滤镜,并且支持实时滤镜。GPUImage for Android是Android的实现) 一样也是可以实现美颜
Android4.0的自带Camera源码是用SurfaceView预览的,但到了4.2就换成了GLSurfaceView来预览。4.4又用了自家的TextureView,所以从中也可以猜出新增TextureView的用意
TextureView
是在4.0
(API level 14)引入的,与SurfaceView相比,它不会创建新的窗口来显示内容。它是将内容流直接投放到View中,并且可以和其它普通View一样进行移动,旋转,缩放,动画等变化。TextureView必须在硬件加速
的窗口中使用.(这应该是前两年使用的少的原因吧,因为并不是所有手机都支持硬件加速得)
TextureView被创建后不能直接使用,必须要添加到ViewGroup后,待SurfaceTexture准备就绪才能起作用(看TextureView的源码,TextureView是在绘制的时候创建的内部SurfaceTexture,这个就是上面说的可以对图像流数据进行二次处理的类,也就是说一个TextureView就可以实现图片的滤镜效果了,当然)
PS:开发笔记,后续继续完善