概念:
1. OpenGL(Open Graphics Library开发图形接口)是一个跨平台的图形API,用于指定3D图形处理硬件中的标准软件接口。
2. OpenGl ES(OpenGl for Embedded System)是免费的跨平台的功能完善的2D/3D图形库接口的API,是OpenGL的一个子集。(Android开发环境下,OpenGl提供了android.opengl包,并且提供了GlSurfaceView,GLU,GlUtils等工具类)
优点:手机上做图像处理有很多方式(比如Canvas),但是目前为止最高效的方法是有效地使用 GPU;GPU 可以集中来处理好一件事情,就是并行地做浮点运算。事实上,图像处理和渲染就是在将要渲染到窗口上的像素上做许许多多的浮点运算。也就是说用GPU来分担CPU的工作,提高工作效率。
首先要了解GLSurfaceView类
- GLSurfaceView创建了一个窗口,能处理OpenGL初始化过程中比较基础的操作,可以配置显示设备以及在后台线程中渲染,用来显示底层的OpenGL surface(无动画或变形特效)。
GLSurfaceView提供了下列特性:
- 1> 提供并且管理一个独立的Surface。
- 2> 提供并且管理一个EGL display,它能让opengl把内容渲染到上述的Surface上。
- 3> 支持用户自定义渲染器(Render),通过setRenderer设置一个自定义的Renderer。
- 4> 让渲染器在独立的GLThread线程里运作,和UI线程分离。
- 5> 支持按需渲染(on-demand)和连续渲染(continuous)两种模式。
- 6> GPU加速:GLSurfaceView的效率是SurfaceView的30倍以上,View的绘制onDraw(Canvas canvas)使用Skia渲染引擎渲染,而GLSurfaceView的渲染器Renderer的onDrawFrame(GL10 gl)使用opengl绘制引擎进行渲染。,GLSurfaceView利用GPU加速提高了绘制效率。
- 7>View的绘制onDraw(Canvas canvas)使用Skia渲染引擎渲染,而GLSurfaceView的渲染器Renderer的onDrawFrame(GL10 gl)使用opengl绘制引擎进行渲染。
第一步 创建GLSurfaceView实例
private GLSurfaceView glSurfaceView;
private boolean rendererSet = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mGlSurfaceView = findViewById(R.id.surfaceview);
// 省略了检查系统是否支持OpenGL ES 2.0
mGlSurfaceView.setEGLContextClientVersion(2);
mGlSurfaceView.setRenderer(new FirstRenderer());
setContentView(R.layout.activity_openGL);
}
第二步 通过创建的实例使用这个类,并增加你的Renderer.
public class FirstRenderer implements GLSurfaceView.Renderer {
private static final String TAG = "FirstRenderer";
@Override
public void onSurfaceCreated(GL10 glUnused, EGLConfig config) {
//系统调用这个方法一次创建时GLSurfaceView。使用此方法来执行只需要发生一次的操作
//比如设置OpenGL的环境参数或初始化的OpenGL图形对象。
glClearColor(184.0f/255.0f, 213.0f/255.0f, 238.0f/255.0f, 1.0f););
//设置清除颜色,颜色范围0-1
}
@Override
public void onSurfaceChanged(GL10 glUnused, int width, int height) {
//Surface尺寸变化(横竖屏切换)时,会被调用
glViewport(0, 0, width, height);
}
@Override
public void onDrawFrame(GL10 glUnused) {
//系统调用上的每个重绘此方法GLSurfaceView。
//使用此方法作为主要执行点用于绘制(和重新绘制)的图形对象。
//渲染缓冲区会被交换并显示在屏幕上,如果这里什么也没画,有可能会看到糟糕的闪烁效果。
glClear(GL_COLOR_BUFFER_BIT);//把窗口清除为当前颜色
}
}
效果预览: