在OpenGL/OpenGL ES中, 我们开发者一般编写的是顶点着色器和片元着色器。下面是图形渲染管线:
顶点着色器
顶点着色器程序用来描述顶点需要执行的模型变换、视变换、投影变换、光照(Transform and lighting)处理的顶点着色器程序源代码/可执行文件。可以作为顶点着色器的输入有:
- 用
attribute
修饰的属性, 可以传递顶点数据、纹理坐标等。 - 用
uniform
修饰的属性, 可以传递变换矩阵等。
顶点着色器常见的输出有:
-
gl_Position
, 将变换后的顶点数据进行输出。 -
gl_PointSize
, 设置点的大小。
在顶点着色器进行的业务处理有:
- 矩阵变换的计算
- 计算光照公式生成逐顶点颜色
- 生成/变换纹理坐标
顶点着色器的代码示例:
attribute vec4 position;
attribute vec2 texCoordinate;
uniform mat4 rotateMatrix;
varying lowp vec2 varyTexCoord;
void main() {
varyTexCoord = texCoordinate;
vec4 vPos = rotateMatrix * position;
gl_Position = vPos;
}
图元装配
顶点着色器的下一个阶段是图元装配。基本的图元(primitive)为点、线、三角形等。
- 将顶点数据计算成一个个图元,在这阶段会执行裁剪,透视分割,视口变换操作后进入光栅化阶段。
光栅化
在这阶段绘制对应的图元,将图元转化成一组二维片段。而这些转化的片段将由着色器处理,这些二维片段就是屏幕上可绘制的像素。
片元着色器
片元着色器程序是用来描述片段上执行操作(如颜色混合)的片元着色器程序源代码/可执行文件。
在片元着色器中的输入有:
- 在光栅化阶段通过插值为每个片段生成的纹理坐标。
- 用
uniform
修饰的属性, 可以传递在片元着色器需要使用的数据等。 - 用
sampler2D
修饰的属性, 传递纹理对象,实际上传递的是对应的纹理单元(texture unit)索引号。
片元着色器的常用输出:
-
gl_FragColor
输出每个片段的颜色。
在片元着色器的业务处理有:
- 计算颜色
- 获取纹素
- 往像素点中填充颜色值
它可以用于图片/视频中每个像素的颜色填充【比如给视频添加滤镜,实际上就是将视频中每个图片的像素点颜色填充进行修改】
片元着色器代码示例:
varying lowp vec2 varyTexCoord;
uniform sampler2D colorMap;
void main() {
gl_FragColor = texture2D(colorMap, varyTexCoord);
}
逐片段操作
像素归属测试: 确定帧缓存区中位置(Xw,Yw)的像素目前是不是归属于OpenGL ES所有. 例如,如果⼀个显示OpenGL ES帧缓存区View被另外⼀个View所遮蔽.则窗口系统可以确定被遮蔽的像素不属于OpenGL ES上下⽂。从而不全显示这些像素。而像素归属测试是OpenGL ES的一部分,它不由开发者开人为控制,而是由OpenGL ES内部进行.
裁剪测试: 裁剪测试确定(Xw,Yw)是否位于作为OpenGL ES状态的一部分裁剪矩形范围 内。如果该⽚段位于裁剪区域之外,则被抛弃。
深度测试: 输⼊片段的深度值进步比较,确定片段是否拒绝测试
混合: 混合将新生成的⽚段颜色与保存在帧缓存的位置的颜色值组合起来
抖动: 抖动可用于最小化因为使用有限精度在帧缓存区中保存颜色值⽽产生的伪像.