OpenGL 和 OpenGLES 简介
OpenGL(Open Graphics Library)意为开放图形库,是一个跨平台的图形 API,用于指定 3D 图
形处理硬件中的软硬件编程接口。OpenGL 一般用于图形工作站,PC 端使用。由于性能和可
移植性等各方面原因,在移动端使用起来相对比较麻烦。为此,Khronos 公司就为 OpenGL
提供一个子集,OpenGL ES(OpenGL for Embedded System)。OpenGL ES 是免费的跨平台且功
能完善的 2D/3D 图形库接口 API,是 OpenGL 的一个子集。
使用 OpenGLES 可以直接用 GPU 进行运算,专门来处理图像,会加速整体的性能,这是它存
在的意义。
在 Android 里面,GLSurfaceView 承载这个任务。GLSurfaceView 在 SurfaceView 的上面,将
Surface 用 EGL 进行处理,完成了可以使用 OpenGLES 绘制,关联到对应的 Surface。使用 GLSurfaceView
下来我们讲解下,如何使用它。
1 在 AndroidManifest.xml 中设置版本,
关
然后在主界面里面:
glSurfaceView = (GLSurfaceView) findViewById(R.id.glSurfaceView);
//GLContext 设置 OpenGLES2.0
glSurfaceView.setEGLContextClientVersion(2);
// 在 setRenderer 之前,可以调用以下方法进行 EGL 设置
// glSurfaceView.setEGLConfigChooser(true);//颜色,深度,模板等等设置
// glSurfaceView.setEGLWindowSurfaceFactory(new GLSurfaceView.EGLWindowSurfaceFactory() { //窗口设置
// @Override
// public EGLSurface createWindowSurface(EGL10 egl10, EGLDisplay eglDisplay, EGLConfig eglConfig, Object o) {
// return null;
// }
//
// @Override
// public void destroySurface(EGL10 egl10, EGLDisplay eglDisplay, EGLSurface eglSurface) {
//
// }
// });
glSurfaceView.setRenderer(new TriangleRender());
/* 渲 染 方 式 , RENDERMODE_WHEN_DIRTY 表 示 被 动 渲 染 , 只 有 在 调 用
requestRender 或者 onResume 等方法时才会进行渲染。RENDERMODE_CONTINUOUSLY 表
示持续渲染*/
glSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
两种渲染方式,持续渲染是在需要高速显示的情况下才需要,默认直接选择只有脏了才需要。
这里我们主要的任务,就是设置一个渲染器。
public class BackgroundRender extends BaseRenderer implements GLSurfaceView.Renderer
{
private String TAG = BackgroundRender.class.getSimpleName();
@Override
public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) {
//surface 被创建后需要做的处理
//Set the background frame color
GLES20.glClearColor(0.0f,0.0f,0.0f,1.0f);
}
@Override
public void onSurfaceChanged(GL10 gl10, int width, int height) {
// 渲染窗口大小发生改变或者屏幕方法发生变化时候回调
GLES20.glViewport(0,0,width,height);
}
@Override
public void onDrawFrame(GL10 gl10) {
//执行渲染工作
//Redraw background color
GLES20.glClearColor(GLES20.GL_COLOR_BUFFER_BIT,0f,0f,0f); 这里是完成每一帧
的渲染动作
}
}
在实际的使用过程中,会遇见所谓的 OpenGL 编程语言,牵扯到顶点渲染和着色渲染,这块
属于专门的 OpenGLES 的知识,在做 GPU 特效的时候,可以去研究。
这里推荐一个库 GPUImage ,是一个安卓的图片处理特效库,当我们后面学会了解析视频,
渲染每一帧的时候,可以给它使用特效。