顶点着⾊器
顶点着⾊器 输⼊:
- 着⾊器程序 —— 描述顶点上执⾏操作的顶点着⾊器程序源代码/可执⾏⽂件
- 顶点着⾊器输⼊(属性) —— ⽤顶点数组提供每个顶点的数据
- 统⼀变量(uniform) —— 顶点/⽚元着⾊器使⽤的不变数据
- 采样器 —— 代表顶点着⾊器使⽤纹理的特殊统⼀变量类型
顶点着⾊器 业务:
- 矩阵变换位置
- 计算光照公式⽣成逐顶点颜⾊
- ⽣成/变换纹理坐标
总结: 它可以⽤于执⾏⾃定义计算,实施新的变换,照明或者传统的固定功能所不允许的基于顶点的效果。
顶点着⾊代码案例
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;
}
图元装配
- 顶点着⾊器之后,下⼀个阶段就是图元装配。
- 图元(Primitive): 点,线,三⻆形等。
- 图元装配: 将顶点数据计算成⼀个个图元。在这个阶段会执⾏裁剪、透视分割和Viewport变换操作。
- 图元类型和顶点确定将被渲染的单独图元。对于每个单独图元及其对应的顶点,图元装配阶段执⾏的操作包括:将顶点着⾊器的输出值执⾏裁剪、透视分割、视⼝变换后进⼊光栅化阶段。
光栅化
在这个阶段绘制对应的图元(点/线/三⻆形)。光栅化就是将图元转化成⼀组⼆维⽚段的过程。⽽这些转化的⽚段将由⽚元着⾊器处理。这些⼆维⽚段就是屏幕上可绘制的像素。⽚段着⾊器/⽚元着⾊器
⽚元着⾊器/⽚段着⾊器 输⼊:
- 着⾊器程序 —— 描述⽚段上执⾏操作的片元着⾊器程序源代码/可执⾏⽂件
- 输⼊变量 —— 光栅化单元⽤插值为每个⽚段⽣成的顶点着⾊器输出
- 统⼀变量(uniform) —— 顶点/⽚元着⾊器使⽤的不变数据
- 采样器 —— 代表⽚元着⾊器使⽤纹理的特殊统⼀变量类型
⽚元着⾊器业务:
- 计算颜⾊
- 获取纹理值
- 往像素点中填充颜⾊值(纹理值/颜⾊值)
总结: 它可以⽤于图⽚/视频/图形中每个像素的颜⾊填充(⽐如给视频添加滤镜,实际上就是将视频中每个图⽚的像素点颜⾊填充进⾏修改)
⽚元着⾊代码案例:
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。
- 因为每个窗⼝系统都有不同的定义,所以EGL提供基本的不透明类型—EGLDisplay,这个类型封装了所有系统相关性,⽤于和原⽣窗⼝系统接⼝。