文章目录
简介
OpenGL ES (OpenGL for Embedded Systems)
是以⼿持和嵌⼊式为目标的⾼级3D图形应⽤程序编程接口(API). OpenGL ES 是⽬前智能手机中占据统治地位的图形API.⽀持的平台: iOS, Andriod , BlackBerry ,bada ,Linux ,Windows.
OpenGL ES
开放式图形库(OpenGL的)⽤于可视化的⼆维和三维数据。它是一个多功能开放标准图形库,⽀持2D和3D数字内容创建,机械和建筑设计,虚拟原型设计,飞行模拟,视频游戏等应⽤程序。您可以使用OpenGL配置3D图形管道并向其提交数据。顶点被变换和点亮,组合成图元,并光栅化以创建2D图像。OpenGL旨在将函数调用转换为可以发送到底层图形硬件的图形命令。由于此底层硬件专用于处理图形命令,因此OpenGL绘图通常非常快。
OpenGL for Embedded Systems(OpenGL ES)
是OpenGL的简化版本,它消除了冗余功能,提供了⼀个既易于学习⼜更易于在移动图形硬件中实现的库。
OpenGL ES也分服务端,客户端。我们一般干预的是客户端。
OpenGL ES 3.0图形管线
- 确定图片数据
- 给顶点着色器 - 图形变换,光照计算
- 图元装配,裁剪,光栅化
- 纹理,填充
- 到帧缓冲区
顶点着色器
着色器程序
- 描述顶点上执⾏操作的顶点着⾊器程序源代码/可执行⽂件。attribute(属性)
- ⽤顶点数组提供每个顶点的数据uniform(统一变量)
- 顶点/片元着色器使用的不变数据采样器
- 代表顶点着色器使用纹理的特殊统⼀变量类型.
其内置输出变量
gl_Position
- 每个点坐标gl_PointSize
- 点大小
负责的业务
- 矩阵变换位置
- 计算光照公式⽣成逐顶点颜⾊
- 生成/变换纹理坐标
示例代码
attribute vec4 position;
attribute vec2 textCoordinate;
uniform mat4 rotateMatrix;
varying lowp vec2 varyTextCoord;
void main()
{
varyTextCoord = textCoordinate;
vec4 vPos = position;
vPos = vPos * rotateMatrix;
gl_Position = vPos;
}
图元装配
顶点着⾊器器之后,下⼀个阶段就是图元装配。图元装配
:将顶点数据计算成⼀个个图元.在这个阶段会执行裁剪、透视分割和 Viewport变换操作,然后进入光栅化。
光栅化
在这个阶段绘制对应的图元(点/线/三⻆形). 光栅化就是将图元转化成⼀组二维⽚段的过程.而这些转化的⽚段将由片元着色器处理.这些二维片段就是屏幕上可绘制的像素.
片元着色器/片段着色器
着色器程序
- 描述片段上执行操作的顶点着色器程序源代码/可执行⽂件。输⼊变量(Varing)
- 光栅化单元用插值为每个片段⽣成的顶点着色器输出。统⼀变量量(uniform)
—顶点/⽚元着⾊器使用的不变数据。采样器
- 代表片元着色器使用纹理的特殊统一变量类型。
其内置输出变量:
gl_FragColor
- 每个片元的颜色
负责业务
- 计算颜⾊
- 获取纹理值
- 往像素点中填充颜色值(纹理值/颜⾊值);
代码案例
varying lowp vec2 varyTextCoord;
uniform sampler2D colorMap;
void main()
{
gl_FragColor = texture2D(colorMap, varyTextCoord);
}
逐⽚段操作
- 像素归属测试: 确定帧缓存区中位置(Xw,Yw)的像素目前是不是归属于OpenGL ES所 有. 例如,如果⼀个显示OpenGL ES帧缓存区View被另外⼀一个View所遮蔽.则窗口系统可以确定被遮蔽的像素不属于OpenGL ES上下文.从⽽不全显示这些像素.⽽像素归属测试是OpenGL ES 的一部分,它不由开发者开人为控制,⽽是由OpenGL ES 内部进行.
- 裁剪测试: 裁剪测试确定(Xw,Yw)是否位于作为OpenGL ES状态的⼀部分裁剪矩形范围内.如果该⽚段位于裁剪区域之外,则被抛弃.
- 深度测试: 输⼊⽚段的深度值进步比较,确定片段是否拒绝测试
- 混合: 混合将新生成的⽚段颜⾊与保存在帧缓存的位置的颜色值组合起来.
- 抖动: 抖动可⽤于最⼩化因为使⽤有限精度在帧缓存区中保存颜色值⽽产⽣的伪像.
EGL (Embedded Graphics Library )
OpenGL ES 命令需要渲染上下文和绘制表⾯才能完成图形图像的绘制:
- 渲染上下文: 存储相关OpenGL ES 状态
- 绘制表面: 是⽤于绘制图元的表面,它指定渲染所需要的缓存区类型,例如颜⾊缓存区,深度缓冲区和模板缓存区.
OpenGL ES API 并没有提供如何创建渲染上下文或者上下文如何连接到原⽣窗⼝系统. EGL 是Khronos 渲染API(如OpenGL ES) 和原⽣窗口系统之间的接口. 唯⼀⽀持 OpenGL ES 却不支持EGL 的平台是iOS. Apple 提供⾃己的EGL API的iOS实现,称为EAGL.
由于OpenGL ES是基于C的API,因此它⾮常便携且受到⼴泛⽀持。作为C API,它与Objective-C Cocoa Touch应⽤用程序⽆无缝集成。OpenGL ES规范没有定义窗⼝层,于是苹果提供了GLKView
来进行渲染。
GLKit部分参考后续另一篇博文。
学习不断,有错误请指出,如果对你有帮助,点个?