OpenGL ES 是负责 GPU 工做的,目的是经过 GPU 计算,获得一张图片,这张图片在内存中其实就是一块 buffer,存储有每一个点的颜色信息等。而这张图片最终是要显示到屏幕上,因此还须要具体的窗口系统来操做,OpenGL ES 并无相关的函数。因此,OpenGL ES 有一个好搭档 EGL。html
EGL,全称:embedded Graphic Interface,是 OpenGL ES 和底层 Native 平台 视窗系统之间的接口。因此大概流程是这样的:首先,经过 EGL 获取到手机屏幕 的 handle,获取到手机支持的配置(RGBA8888/RGB565 之类,表示每一个像素中包 含的颜色等信息的存储空间是多少位),而后根据这个配置建立一块包含默认 buffer 的 surface(buffer 的大小是根据屏幕分辨率乘以每一个像素信息所占大小计 算而得)和用于存放 OpenGL ES 状态集的 context,并将它们 enable 起来。而后, 经过 OpenGL ES 操做 GPU 进行计算,将计算的结果保存在 surface 的 buffer 中。 最后,使用 EGL,将绘制的图片显示到手机屏幕上。算法
而在 OpenGL ES 操做 GPU 计算的时候,还须要介绍 OpenGL ES 的另一个好搭档 GLSL。小程序
GLSL,全称:OpenGL Shading Language,是 OpenGL ES 中使用到的着色器的 语言,用这个语言能够编写小程序运行在 GPU 上。函数
在这里须要先提到 CPU 和 GPU 的区别,它们的功能都是用于计算,也都是由不少核组成,区别在于 CPU 的核比较少,可是单个核的计算能力比较强,而 GPU 的核不少,可是每一个核的计算能力都不算特别强。目前 GPU 的主要工做是用于生成图片(如今也有经过 GPU 进行高性能运算_并行运算,可是在这里不属于讨论的范围),缘由就是图片是由不少像素组成,每一个像素都包含有颜色、深度等信息,而为了获得这些信息数据,针对每一个像素点的计算,是能够经过统一的算法来完成。GPU 就擅长处理针对这种大规模数据,使用同一个算法进行计算。而这个算法,就是使用 GLSL 写成 Shader,供 GPU 运算使用。性能
在图形学的视角中,全部的图片都是由三角形构成的。因此经过 OpenGL ES 绘制图片的时候,咱们须要经过 OpenGL ES API 建立用于在 GPU 上运行的 shader, 而后将经过 CPU 获取到的图片顶点信息,传入 GPU 中的 Shader 中。在 Vertex Shader 中经过矩阵变换,将顶点坐标从模型坐标系转换到世界坐标系,再到观察坐标系,到裁剪坐标系,最后投影到屏幕坐标系中,计算出在屏幕上各个顶点的坐标。而后,经过光栅化,以插值的方法获得全部像素点的信息,并在 Fragment shader 中计算出全部像素点的颜色。最后,经过 OpenGL ES 的 API 设定的状态,将获得的像素信息进行 depth/stencil test、blend,获得最终的图片。spa
参考连接htm