OpenGL ES(OpenGL for Embedded Systems) 是一种免费的跨平台3D图形 API接口,其适用于低功耗设备,可用于嵌入式设备和移动设备(包括手机、车载大屏 和嵌入式电器终端设备)上渲染高效的 2D 、 3D 图形。
其由OpenGL(Open Graphics Library)针对嵌入式设备裁剪而来,去除了OpenGL中许多不是必须冗余特性,比如:GL_QUADS(四边形)、GL_POLYGONS(多边形)绘制模式、glBegin(开始)/glEnd(结束)等特性。
OpenGL ES API接口由 Khronos 组织定义并推广(Khronos 是一个图形软硬件行业协会,致力于为这些 API 建立免费的开发标准),对于OpenGL ES Khronos的官方的描述如下:
OpenGL® ES is a royalty-free, cross-platform API for rendering advanced 2D and 3D graphics on embedded and mobile systems - including consoles, phones, appliances and vehicles. It consists of a well-defined subset of desktop OpenGL suitable for low-power devices, and provides a flexible and powerful interface between software and graphics acceleration hardware.
经过多年的发展,目前OpenGL ES主要分为以下几个主要的版本:。
- 采用
固定渲染管线
的 OpenGL ES 1.x (主要包括1.0与1.1):
固定渲染管线,可以由硬件GPU支持或由软件模拟GPU进行图形渲染,其渲染能力有限。特别是在不包含GPU的终端设备上,由软件模拟GPU进行图形渲染,其渲染性能也较弱(早期的Android设备「2010年以前的Android设备」,部分设备中是不包含GPU硬件的,其图形渲染工作由软件模拟经CPU计算来完成)。 - 采用
可编程渲染管线
OpenGL ES 2.x、3.x:
从OpenGL ES 2.0开始,OpenGL ES引入了可编程渲染管线,渲染能力得到了很大的提升(同时可编程渲染管线,也对终端硬件设备提出了要求,终端硬件设备中必须有相应的GPU硬件单元)。
OpenGL ES 3.0向后兼容OpenGL 2.0,也就是说 为OpenGL 2.0编写的应用程序在OpenGL ES 3.0中可以继续运行。
一、OpenGL ES与OpenGL对应关系
OpenGL ES由OpenGL裁剪而来,因此有必要了解一下两者的对应关系。关于OpenGL ES与OpenGL的各版本的对应关系,我做了如下表格。
OpenGL ES Version | OpenGL Version |
---|---|
OpenGL ES 1.0 | OpenGL 1.3 |
OpenGL ES 1.1 | OpenGL 1.5 |
OpenGL ES 2.0 | OpenGL 2.0 |
OpenGL ES 3.0 | OpenGL 3.3 |
OpenGL ES 3.x | OpenGL 4.x |
- OpenGL ES 1.0 与 OpenGL ES 1.1(合称OpenGL ES 1.x)分别从OpenGL 1.3与OpenGL 1.5规范衍生而来。
OpenGL ES 1.x采用固定渲染管线,渲染能力有限。 - OpenGL ES 2.0 从 OpenGL 2.0 规范衍生而来。
OpenGL ES 2.0开始采用可编程渲染管线,其渲染能力大大提高。 - OpenGL ES 3.0 从 OpenGL 3.3 规范衍生而来。
OpenGL ES 3.x 规范同样采用的可编程渲染管线,同时引入了阴影贴图、体渲染、基于GPU的粒子动画、纹理压缩、变化反馈等重要功能。 - OpenGL ES 3.x 基于 OpenGL 4.x 规范衍生而来。
OpenGL ES 3.x 向下兼容 OpenGL ES 3.0/2.0 规范。
二、Android中OpenGL ES的支持
目前khronos官方网站中,最新的OpenGL ES版本为 OpenGL ES3.2。而移动操作系统Android早在Android 7.0(API 24)已经完成OpenGL ES 3.2相关API的支持。
Khronos目前已经发布的OpenGL ES版本如下:
Android各版本对OpenGL ES的支持情况,我做了如下表格,供大家参考:
OpenGL ES Version | Android 引入版本 | 引入大致时间 |
---|---|---|
OpenGL ES 1.x | Android 1.6(API 4) | 2009.09 |
OpenGL ES 2.0 | Android 2.2.3(API 8) | 2011.09 |
OpenGL ES 3.0 | Android 4.4(API 19) | 2013.10 |
OpenGL ES 3.1 | Android 5.0(API 21) | 2014.09 |
OpenGL ES 3.2 | Android 7.0(API 24) | 2016.17 |
- Android 早在Android 1.6(API 4)已经支持OpenGL ES 1.x;
- Android 在Android 2.2.3(API 8)引入OpenGL ES 2.0支持;
- Android 在Android 4.4(API 19)引入了OpenGL ES 3.0支持;
- Android 在Android 5.0(API 21)引入了OpenGL ES 3.1支持;
- Android 7.0(API 24)引入了OpenGL ES 3.2支持;
三、OpenGL ES渲染初探
OpenGL ES 构建的三维空间,其中的三维
实体由许多的三角形拼接构成
。
如下图左侧所示的三维实体圆锥,其由许多三角形按照一定规律拼接构成。而组成圆锥的每一个三角形,其任意一个顶点由三维空间中 x、y、z 三个坐标分量来定义。
对于我们日常使用的移动手持设备,手机屏幕窗口由不连续的有限的二维像素小格子
构成的,每一个像素格子有x、y两个分量来定义。
因此在OpenGL ES绘制流程中,其主要工作是将三维空间中的坐标点(x,y,z)构成的三维图形,转化为手机屏幕上的二维像素点
。
这个转化过程主要分为两个步骤:
- 一个是顶点的变换;
三维空间中的实体,经过各种变换(主要是通过矩阵相乘进行坐标系的变换),变为可投影在二维平面上的有限的像素点数据; - 二是渲染着色;
根据传入的顶点颜色数据或图片纹理数据,将相应的颜色对应到响应的像素点。
在OpenGL ES中,其大概的绘制流程如下图所示:
- 数据分组
这一阶段是OpenGL ES中数据基本处理阶段,对三维空间中物体的顶点坐标
、顶点对应的颜色
数据进行一个基本处理,并且指定三维实体的绘制方式
为三角形绘制。 - 组装三角形
这一阶段按上一步指定的绘制方式,将三维顶点数据组装成一个三角形实体图元。 - 剪裁
可以理解为将位于视野外的三角形部分排除掉,类似于人眼视角意外的部分排除掉,从而减少不比较的渲染绘制工作。经过剪裁后的三角形,可能会增加顶点数据。 - 光栅化
光栅化是将三维空间的三角形图形
,栅格化为手机二维屏幕上的一个个像素点
。将由三维
顶点信息组成的三角形图元
,栅格化
为由许多像素点
构成的二维图像
- 着色
根据传入的顶点颜色数据或图片纹理数据,将相应的颜色对应到响应的像素点。 - 颜色混合
如若存在多个三维实体,每个三维实体的颜色各有不同,其重叠部分的颜色是两个或者多个颜色叠加而成。
注:
*对于以上OpenGL ES的绘制流程,这里仅是做一个初步的介绍。详细了解OpenGL ES绘制流程,可查看 *《一文读懂OpenGL ES 2.x 渲染流程》:
https://xiaxl.blog.csdn.net/article/details/119960657
三、参考
《OpenGL ES 3.0编程指南》
《OpenGL ES 3.x游戏开发》
khronos:
https://www.khronos.org
维基百科 OpenGL:
https://zh.wikipedia.org/wiki/OpenGL
learnopengl:
https://learnopengl-cn.github.io/01%20Getting%20started/01%20OpenGL/
gl_pipeline:
http://www.songho.ca/opengl/gl_pipeline.html