渲染流水线
着色器和操作
- 顶点着色器
- 完全可编程
- 处理单位是顶点,来自CPU
- 每个顶点执行一次顶点着色器
- 无法得知任意两点间是否存在联系
- 可以进行顶点变换
- 顶点位置变成归一化的设备坐标(OpenGL下,为一个边长为2,中心点0,0,0的正方体内部)
- 曲面细分着色器
- 可选
- 确定曲面细分等级
- 将复杂的曲面转换为简单的点,线,三角形等
- 几何着色器
- 可选
- 逐图元着色操作
- 能产生更多的图元
- 裁剪
- 不可编程,但可以自定义配置
- 对不可视的图元进行删除,对部分可视的图元进行裁剪(生成新的顶点)
- 这里的可视/不可视只是对于模型自身而言
- 屏幕映射
- 设备坐标系中的xy转化为屏幕坐标系
- 屏幕坐标系内存储了顶点对应像素的位置,与距离像素有多远
- 设备坐标系中的z坐标和屏幕坐标系一起构成窗口坐标系,z即是深度值
- 三角形设置
- 进入光栅化阶段
- 由上一阶段三角网格的顶点计算三角形的边,获得三角形的网格情况
- 三角形遍历
- 检查每个像素是否被三角形覆盖,如果被覆盖,则产生一个片元
- 片元并不是真正的像素,而是包含了很多状态的集合,包括但不限于屏幕坐标,深度
- 对于三角形的覆盖区域,会用三角形的三个点对每个片元进行插值计算
- 片元着色器
- 片元着色器的输入时上一阶段对顶点信息进行插值得到的结果
- 其输出是一个或多个颜色值
- 期间通常会进行纹理坐标的插值,计算片元的颜色
- 无法获取周边片元的信息
- 逐片元操作
- 对每一个片元进行操作,主要进行测试(如模板测试和深度测试)与混合
- 片元需要通过所有测试才能和颜色缓冲区进行合并(混合)
- 模板测试,通常用来限制渲染区域
- 深度测试,和透明效果有关
- 将通过测试的片元的信息和已在缓冲区内的信息相混合
- 最终输出图像是使用双缓冲模式的