一、OpenGL ES简介
OpenGL ES (OpenGL for Embedded Systems) 是以⼿持和嵌⼊式为⽬标的⾼级3D图形应⽤程序编程接⼝(API). OpenGL ES 是⽬前智能⼿机中占据统治地位的图形API.
OpenGL ES 开放式图形库(OpenGL的)⽤于可视化的⼆维和三维数据。它是⼀个多功能开放标准图形库,⽀持2D和3D数字内容创建,机械和建筑设计,虚拟原型设计,⻜⾏模拟,视频游戏等应⽤程序。您可使⽤OpenGL配置3D图形管道并向其提交数据。顶点被变换和点亮,组合成图元,并光栅化以创建2D图像。OpenGL旨在将函数调⽤转换为可以发送到底层图形硬件的图形命令。由于此底层硬件专⽤于处理图形命令,因此OpenGL绘图通常⾮常快。
OpenGL for Embedded Systems(OpenGL ES)是OpenGL的简化版本,它消除了冗余功能,提供了⼀个既易于学习⼜更易于在移动图形硬件中实现的库。
OpenGL ES 3.0实现了具有可编程着色功能的图形管线,由两个规范API和着色语言组成,下图概述OpenGL ES 图形管线的各个阶段。

1.1 顶点着色器
顶点着色器实现了顶点操作的通用可编程方法。
顶点着色器输入包括:
- 着色器程序:描述顶点上执行操作的顶点着色器程序源代码或者可执行文件。
- 属性:用顶点数组停工的每个顶点的数据
- 统一变量(uniform):顶点/片段着色器使用的不变数据
- 采样器:纹理的特殊统一变量数据。
顶点着色器输出主要由两种类型
gl_Position和gl_PointSize
顶点着色器业务: - 矩阵变换位置
- 计算光照共识生成逐顶点颜色
- 生成/变换纹理坐标。
1.2 图元装配
顶点着⾊器之后,下⼀个阶段就是图元装配.
图元(Primitive): 点,线,三⻆形等.
图元装配: 将顶点数据计算成⼀个个图元.在这个阶段会执⾏裁剪、透视分割和Viewport变换操作。
图元类型和顶点索确定将被渲染的单独图元。对于每个单独图元及其对应的顶点,图元装配阶段执⾏的操作包括:将顶点着⾊器的输出值执⾏裁剪、透视分割、视⼝变换后进⼊光栅化阶段。
1.3 光栅化
下一阶段就是光栅化,在此阶段绘制对应的图元(点、直线、三角形)。光栅化是将图元转化为一组二维片段(像素)的过程,这些片段由片段着色器处理
1.4 片段/片元着色器
光栅化阶段生成的片段执行这个着色器。
- 着⾊器程序—描述⽚段上执⾏操作的⽚元着⾊器程序源代码/可执⾏⽂件
- 输⼊变量— 光栅化单元⽤插值为每个⽚段⽣成的顶点着⾊器输出
- 统⼀变量(uniform)—顶点/⽚元着⾊器使⽤的不变数据
- 采样器—代表⽚元着⾊器使⽤纹理的特殊统⼀变量类型.
⽚元着⾊器业务: - 计算颜⾊
- 获取纹理值
- 往像素点中填充颜⾊值(纹理值/颜⾊值);
总结: 它可以⽤于图⽚/视频/图形中每个像素的颜⾊填充(⽐如给视频添加滤镜,实际上就是将视频中每个图⽚的像素点颜⾊填充进⾏修改.)
1.5逐片段操作

- 像素归属测试: 确定帧缓存区中位置(Xw,Yw)的像素⽬前是不是归属于OpenGL ES所 有. 例如,如果⼀个显示OpenGL ES帧缓存区View被另外⼀个View 所遮蔽.则窗⼝系统可以确定被遮蔽的像素不属于OpenGL ES 上下⽂.从⽽不全显示这些像素. ⽽像素归属测试是OpenGL ES 的⼀部分,它不由开发者开⼈为控制,⽽是由OpenGL ES 内部进⾏.
- 裁剪测试: 裁剪测试确定(Xw,Yw)是否位于作为OpenGL ES状态的⼀部分裁剪矩形范围内.如果该⽚段位于裁剪区域之外,则被抛弃.
- 深度测试: 输⼊⽚段的深度值进步⽐较,确定⽚段是否拒绝测试
- 混合: 混合将新⽣成的⽚段颜⾊与保存在帧缓存的位置的颜⾊值组合起来.
- 抖动: 抖动可⽤于最⼩化因为使⽤有限精度在帧缓存区中保存颜⾊值⽽产⽣的伪像.
1.6EGL (Embedded Graphics Library )
- OpenGL ES 命令需要渲染上下⽂和绘制表⾯才能完成图形图像的绘制.
- 渲染上下⽂: 存储相关OpenGL ES 状态.
- 绘制表⾯: 是⽤于绘制图元的表⾯,它指定渲染所需要的缓存区类型,例如颜⾊缓存区,深度缓冲区和模板缓存区.
- OpenGL ES API 并没有提供如何创建渲染上下⽂或者上下⽂如何连接到原⽣窗⼝系统. EGL 是Khronos 渲染API(如OpenGL ES) 和原⽣窗⼝系统之间的接⼝. 唯⼀⽀持OpenGL ES 却不⽀持EGL 的平台是iOS. Apple 提供⾃⼰的EGL API的iOS实现,称为EAGL.
- 因为每个窗⼝系统都有不同的定义,所以EGL提供基本的不透明类型—EGLDisplay, 这个类型封装了所有系统相关性,⽤于和原⽣窗⼝系统接⼝.
网友评论