1.1 简介
OpenGL是一套多功能开放标准库,用于处理可视化2D和3D数据。OpenGL可以将调用函数转换成图形处理命令并传送给底层图形硬件,因此OpenGL的绘制效率非常快。
OpenGL ES 是OpenGL的简化版本,是以手持和移动设备为目标的高级3D图形图像API,可以直接操作GPU硬件。其苹果官方文档描述如下:
OpenGL ES消除了一些OpenGL中移动端用不到的冗余功能,是目前主流的智能手机图形API,目前支持的平台包括:iOS、Android、BlackBerry、bada、Linux、Windows等。
1.2 OpenGL/OpenGL ES渲染管线及流程
1.2.1 渲染架构
如图所示,应用程序代码通过OpenGL ES Client准备好图元信息(这一部分由CPU完成),将数据传递给OpenGL ES Server进行图像图像的渲染(这一部分由GPU完成)。
有三个通道传递数据给着色器式:Attribute(参数属性)、Uniform(统一值)、Texture Data(采样器)
- Texture:用于传递纹理数据,可以将纹理数据传递给片元着色器,也可以传递给顶点着色器,但是顶点着色器不能处理纹理,所以没有意义;
- Uniform:统一数据,批次传递,将一些不变的数据传递给着色器,既可以传给顶点着色器,也可以传给片元着色器
- Attribute:参数属性传递,只能将数据传递给顶点着色器,再通过顶点着色器间接的传递给片元着色器。
1.2.2 着色器业务
着色器本质上是一段程序代码:
在OpenGL/OpenGL ES中,开发者所能直接编程的着色器只有顶点着色器和片元着色器,其它着色器不能由开发者直接编程,因此这里只介绍顶点着色器和片元着色器业务。
1、 顶点着色器输入数据是顶点数组提供的每个顶点的数据,主要包括以下业务:
- 矩阵位置变换,比如旋转、平移和缩放
- 计算光照公式生成顶点颜色,比如设置点光源或者默认光源
- 生成/变换纹理坐标
2、片元着色器的输入数据来自光栅化后的顶点着色器输出,需要注意的是顶点着色器后并不是片元着色器,而是要经过图元装配、光栅化、裁剪等过程。片元着色器的主要包括以下业务:
- 计算颜色
- 获取纹理值,将纹理坐标与图形坐标进行一一对应
- 往像素点中填充纹理值/颜色值
1.2.3 渲染管线流程
如图所示是苹果官方文档中描述的OpenGL ES渲染流程,主要包括以下几步:
1、顶点着色器进行旋转、平移、缩放的矩阵变换,以及对光照进行设置,之后输出数据
- 图元装配:确定图形显示为什么形状,点、线或者三角形
- 光栅化:将图元转换为二维信息,因为屏幕是二维的
- Clipping: 超出视景体的部分不在屏幕上显示,要进行裁剪
2、片元着色器接收到数据后,进行颜色计算和纹理获取,并进行纹理和颜色的填充
3、逐片段处理,这里部分包括像素归属测试、裁剪测试、深度测试、混合等操作
- 像素归属测试:确定帧缓冲区中的像素是否归属于OpenGL ES上下文所有;例如两个view在一个像素点上有重叠,则在下面的view的像素点会被判定不属于OpenGL ES的Context所有,即被抛弃不显示。
- 裁剪测试:确定一个像素(x, y)是否在矩形区域内,如果不在则被丢弃,不予显示
- 深度测试:对深度值进行比较,确定显示层级
- 混合:将新生成的片段颜色和保存在帧缓冲区的位置的颜色组合起来,例如两个view有重叠,并且上层view存在透明度,则会进行混合,产生一个新的颜色值,因为一个像素只能显示一种颜色
1.3 EGL
OpenGL ES API没有提供如何创建渲染上下文或者上下文如何链接到原生窗口。EGL是渲染API和原生窗口系统之间的接口,比如OpenGL ES和各个平台。iOS系统是唯一支持OpenGL ES但不支持EGL的平台,因为苹果提供了一套自己的EGL API实现,称为EAGL。这有些类似与我们日常开发中对第三方库的二次封装,OpenGL/OpenGL ES对于苹果来说就是他们的第三方库。
二、GLKit简介
GLKit 框架的设计⽬目标是为了了简化基于OpenGL / OpenGL ES 的应⽤用开发. 。它的出现 加快OpenGL ES或OpenGL应⽤程序开发。使⽤数学库,背景纹理加载,预先创建的着 ⾊器效果,以及标准视图和视图控制器来实现渲染循环。
GLKit框架提供了功能和类,可以减少创建新的基于着色器的应⽤用程序所需的⼯工作量量,或者⽀持依赖早期版本的OpenGL ES或OpenGL提供的固定函数顶点或片段处理理的现有应用程序。
GLKit提供的功能:
- 加载纹理
- 提供高性能的数学运算
- 提供常见的着色器
- 提供视图及视图控制器,即GLKView和GLKViewController
GLKit提供的类及接口:
- GLKView:使用OpenGL ES绘制其内容的视图的默认实现。
- GLKViewController:管理OpenGL ES呈现循环的视图控制器。
- GLKTextureLoader:简化从各种图像文件格式加载OpenGL或OpenGL ES纹理数据的实用程序类。
- GLKTextureInfo:关于由GLKTextureInfo类创建的OpenGL纹理的信息。
- GLKBaseEffect:一个简单的照明和阴影系统,用于基于着色的OpenGL渲染。相当于固定管线着色器
三、总结
1、何为OpenGL ES?
OpenGL ES是OpenGL 的子集,提供了一个以移动设备和嵌入式设备为目标的图形处理API.
2、何为EGL?
一个连接OpenGL与原生窗口间的接口,iOS系统不支持EGL,但是有一套自己的实现,成为EAGL。
3、何为GLKit?
苹果对OpenGL ES进行的面向对象的封装,极大简化了OpenGL/OpenGL ES的开发。