OpenGL ES
OpenGL ES 是 OpenGL 三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,OpenGL 的结构可以从逻辑上划分为下面 3 个部分:图元、缓冲区、光栅化。
图元
在 OpenGL 的世界里,我们只能画点、线、三角形这三种基本图形,而其它复杂的图形都可以通过三角形来组成。所以这里的图元指的就是这三种基础图形:
- 点:点存在于三维空间,坐标用(x,y,z)表示。
- 线:由两个三维空间中的点组成。
- 三角形:由三个三维空间的点组成。
缓冲区
OpenGL 中主要有 3 种 Buffer:
- 帧缓冲区(Frame Buffers) 帧缓冲区:这个是存储 OpenGL 最终渲染输出结果的地方,它是一个包含多个图像的集合,例如颜色图像、深度图像、模板图像等。
- 渲染缓冲区(Render Buffers) 渲染缓冲区:渲染缓冲区就是一个图像,它是 Frame Buffer 的一个子集。
- 缓冲区对象(Buffer Objects) 缓冲区对象就是程序员输入到 OpenGL 的数据,分为结构类和索引类的。前者被称为“数组缓冲区对象”或“顶点缓冲区对象”(“Array Buffer Object”或“Vertex Buff er Object”),即用来描述模型的数组,如顶点数组、纹理数组等; 后者被称为“索引缓冲区对象”(“Index Buffer Object”),是对上述数组的索引。
光栅化(Rasterize)
光栅化也叫栅格化或者像素化,就是把矢量图形转化成像素点儿的过程。我们屏幕上显示的画面都是由像素组成,而三维物体都是点线面构成的。要让点线面,变成能在屏幕上显示的像素,就需要Rasterize这个过程。就是从矢量的点线面的描述,变成像素的描述。
比如一个放大了1200%的屏幕,前面是告诉计算机我有一个圆形,后面就是计算机把圆形转换成可以显示的像素点。这个过程就是Rasterize。
渲染管线(Pipeline)
指的是三维渲染的过程中 显卡执行的、从几何体到最终渲染图像的、数据传输处理计算的过程。
着色器(Shader)
画画的时候我们经常有这么一个过程:先打线稿,再上色。着色器就是用来做这个工作的。
通常着色器分两种:
1.顶点着色器(vertex shader)这个是告诉电脑如何打线稿的——如何处理顶点、法线等的数据的小程序。
2.片面着色器(fragment shader)这个是告诉电脑如何上色的——如何处理光、阴影、遮挡、环境等等对物体表面的影响,最终生成一副图像的小程序。
采用了这两种着色器小程序 的 **数据传输处理计算的渲染过程,**称之为 可编程管线。
坐标系
OpenGL ES 采用的是右手坐标,选取屏幕中心为原点,从原点到屏幕边缘默认长度为 1,也就是说默认情况下,从原点到(1,0,0)的距离和到(0,1,0)的距离在屏幕上展示的并不相同。坐标系向右为 X 正轴方向,向左为 X 负轴方向,向上为 Y 轴正轴方向,向下为 Y 轴负轴方向,屏幕面垂直向上为 Z 轴正轴方向,垂直向下为 Z 轴负轴方向。
通俗的讲,在 OpenGL 中,世界就是一个坐标系,一个只有 X、Y 和 Z 三个纬度的世界,其它的东西都需要你自己来建设,你能用到的原材料就只有点、线和面(三角形),当然还会有其他材料,比如阳光(光照)和颜色(材质)。
相机
OpenGL 中的“相机”和现实世界中的相机不是一个东西,但概念的相同的,都是捕获世界的景像呈现到二维平面上。可以将这里的“相机”想像成人眼,人眼看到的是什么样子,相机呈现的就是什么样子。
纹理
纹理是表示物体表面的一幅或几幅二维图形,也称纹理贴图(texture)。当把纹理按照特定的方式映射到物体表面上的时候,能使物体看上去更加真实。当前流行的图形系统中,纹理绘制已经成为一种必不可少的渲染方法。在理解纹理映射时,可以将纹理看做应用在物体表面的像素颜色。在真实世界中,纹理表示一个对象的颜色、图案以及触觉特征。纹理只表示对象表面的彩色图案,它不能改变对象的几何结构。
EGL
EGL(Embedded Graphics Library)实际上是OpenGL和设备(又或者叫操作系统)间的中间件,因为 OpenGL 是平台无关的,是标准的,但设备是千奇百怪的,要对接就需要一个中间件做协调。也就是说一个设备要支持 OpenGL,那么它需要开发一套相对应的 API 来对接。在 Android 中就是 EGL。EGL 主要负责初始化 OpenGL 的运行环境和设备间的交互,简单的说就是 OpenGL 负责绘图,EGL 负责和设备交互。
实际上,OpenGL ES 定义了一个渲染图形的 API,但没有定义窗口系统。因为不同的操作系统,窗口机制可能不相同。
为了让 GLES 能够适合各种平台,通常 GLES 都与特定库结合使用,这些库可创建和访问操作系统的窗口。在 Android 系统中,这个库是 EGL。调用 GLES 渲染纹理多边形,调用 EGL 将渲染放到屏幕上。
由上面的内容可知,在 Android 系统中,GLESxxx(如 GLES20、GLES30 等等)实现的是标准的 OpenGL 接口,而 EGLxxx(如 EGL10、EGL14 等等)实现的是 OpenGL 如何与 Android 系统交互。