简介
OpenGL ES (OpenGL for Embedded Systems)是以手持和嵌入式为⽬标的高级 3D 图形应用程序编程接口(API)。OpenGL ES 是目前智能手机中占据统治地位的图形 API。支持的平台: iOS,Andriod,BlackBerry,bada,Linux,Windows。其中安卓主要还是采用 OpenGL ES,而 iOS 在 iOS 12开始被废弃,但是仍然可用,官方主推 Metal,但是有很多应用还是基于 OpenGL ES 写的,还没那么快直接迁移至 Metal,就像 Swift 和 OC 一样。
Metal 的也是采取了 OpenGL ES 的思想和做法自己开发的一个图形接口集合,因为高度封装所以使用很方便,但是想要熟悉了解还得深入底层,那么了解和学习 OpenGL ES 是很有必要的,毕竟这也是 iOS12之前的做法。
渲染流程
OpenGL ES允许应用程序利用底层图形处理器的强大功能。iOS 设备上的 GPU 可以执⾏复杂的 2D 和 3D 绘图,以及最终图像中每个像素的复杂着⾊计算。
OpenGL ES 图形管道
- Application:提供图元装配的顶点、纹理信息
- Vertex(顶点着色器):处理顶点的平移、旋转、缩放
- GeoMetry:图元装配,超出屏幕部分裁剪
- Fragment:片元着色器,处理纹理、蒙版
- Framebuffer Operations:帧缓冲区,颜色混合、模版、深度测试
顶点着色器
着色器程序是执行顶点操作的顶点着色器程序源代码/可执行文件。
接收方式
Attribute:接收顶点数组数据
Uniform:接收顶点/片元着色器使用的不变化的数据
采样器:接收纹理的特殊统一变量
主要任务
计算矩形变换位置
根据光照公式计算颜色
生成/变换纹理,片元着色器是没有办法传入属性即attribute的,可以通过顶点着色器桥接,间接将纹理坐标属性传递到片元着色器
图元装配
根据图元类型和顶点数据计算生成一个个的图元,裁剪、透视分割和视口变换操作都是在这个阶段进行,之后进入光栅化阶段
光栅化
把装配后的图元(点、线、三角形等)转化成一组二维片段的过程(屏幕是 2D 的)。二维片段有屏幕坐标、颜色属性、纹理坐标等数据。
片元着色器
接收方式
输入变量:光栅化单元用插值为每个⽚段生成的顶点着色器输出
Uniform:接收顶点/片元着色器使用的不变化的数据
采样器:⽚元着色器器使⽤纹理的特殊统一变量量类型
主要任务
- 计算颜色
- 获取纹理值
- 往像素中填充颜色值【纹理值/颜色值】
它可以用于图片/视频/图形中每个像素的颜色填充(比如给视频添加滤镜,实际上就是将视频中每个图片的像素点颜色填充进⾏修改)。
顶点着色器、片元着色器都是代码段,类似于iOS中的函数/方法,有返回值。顶点着色器的返回值会被复制给 gl_Position,片元着色器的结果会赋值给 gl_fragColor。这两个返回值都属于 GLSL中 的内建变量,是封装好的,直接将数据赋值给它即可。
- gl_Position:顶点着色器中某一个顶点经过一系列处理后得到的结果
- gl_fragColor:经过片元着色器对某一个像素点来进行处理之后的结果
EGL(Embedded Graphics Library)
- OpenGL ES 命令需要渲染上下文和绘制表面才能完成图形图像的绘制
- 渲染上下⽂: 存储相关OpenGL ES状态,是一个状态机
- 绘制表面:⽤于绘制图元的表面,需要指定渲染的缓存区,例如颜⾊缓、深度和模板
- OpenGL ES API 并没有提供如何渲染上下文或者上下文如何连接到原生窗口系统,EGL 是 Khronos 渲染 API(OpenGL ES)和原生窗口的之间的接口,iOS 是唯一支持 OpenGL ES 却不支持 EGL 的平台,因为 Apple 提供自己的 EGL API 实现— EAGL。
- 因为每个窗⼝系统都有不同的定义,所以EGL提供基本的不透明类型—EGLDisplay, 这 个类型封装了所有系统相关性,用于和原生窗⼝系统接⼝