顶点着色器
顶点着色器是一个可编程的处理单元
执行顶点的变换(透视矩阵)、光照、材质的应用等与计算等顶点的相关操作
每个顶点执行一次顶点着色器
OpenGL ES的工作流程为首先将原始的顶点几何信息及其他属性传送到顶点着色器中
经过顶点着色器处理后产生顶点坐标、颜色、位置等后续流程需要的各项定点属性信息
然后传递给图元装配
图元装配
图元装配不可编程
它主要分为图元组装和图元处理两个阶段
图元组装将顶点着色器处理好的顶点以点绘制、线段绘制或三角形绘制的方式进行组装(常用三角形)
点绘制的图元仅需要一个单独的顶点,每个顶点为一个图元;线段绘制的图元则需要两个顶点,每两个顶点构成一个图元;三角形绘制方式下需要3个顶点构成一个图元
图元处理首先需要消除位于半空间(half-space)之外的部分几何图元,这个半空间是由一个剪裁平面所定义的。例如,点剪裁就是简单地接受或者拒绝顶点,线段或多边形剪裁可能需要增加额外的顶点,具体取决于直线或者多边形与剪裁平面之间的位置关系,剪裁时,若图元完全位于视景体以及自定义剪裁平面的内部,则将图元传递到后面的步骤进行处理;如果其完全位于视景体或者自定义剪裁平面的外部,则丢弃该图元;如果其有一部分位于内部,另一部分位于外部,则需要剪裁该图元。最后如果开启了背面剪裁还需要判断改图元是否是背面面对摄像机,如果是则需要将其剔除。
光栅化
光栅化不可编程
光栅化是将图元转化为一组二维片段的过程(后续这些二维片段将交给片元着色器上色)
二维片元代表着可在屏幕上绘制的像素
从分配给每个图元顶点的顶点着色器输出生成每个片元值的机制称作插值
简单来说就是将3D空间中的物体转换成屏幕上的一个个像素点(其实应该称之为“候选像素点”,因为后面还有深度测试会剔除被挡住的部分)
这些点是没有颜色的只有位置信息和深度信息,颜色需要后续的片元着色器赋予
片元着色器
片元着色器可编程
片元着色器是处理片元值及其相关数据的可编程单元
它执行纹理的采样、颜色的汇总、计算颜色等操作
每个片元(或者纹理图片的每个像素)执行一次
将3D物体中的图元光栅化后产生的每个片元(或者纹理图片的每个像素)的颜色等属性计算出来送入后续阶段(如剪裁测试、深度测试或模板测试)
剪裁测试
启用剪裁测试后,OpenGL ES会检查每个片元在帧缓冲中对应的位置,若对应位置在剪裁窗口中则将此片元送入下一阶段,否则丢弃
也就是可以在屏幕上指定一片区域绘制,不在这片区域不进行绘制
深度测试与模板测试
深度测试是将输入片元的深度值与帧缓冲区中存储的对应位置片元的深度值进行比较
若输入片元的深度值小则将输入片元则送入下一阶段准备覆盖帧缓冲中的原片元或与帧缓冲中的原片元混合,否则丢弃输入片元
模板测试的主要功能为将绘制区域限定在一定的范围内,一般用在湖面倒影、镜像等场合
颜色缓冲混合
若程序中开启了alpha混合,则根据混合因子将上一阶段送来的片元与帧缓冲中对应位置的片元进行alpha混合;否则送入的片元将覆盖帧缓冲中对应位置的片元
帧缓冲(FBO,Frame Buffer Object)
OpenGL ES 中的物体绘制并不是直接在屏幕上进行的,而是预先在帧缓冲区中进行绘制
每绘制完一帧再将绘制的结果交换到屏幕上
每次绘制新的一帧时都需要清除缓冲区中的相关数据,否则有可能产生不正确的绘制效果