整体流程
- 应用阶段:粗细度剔除,进行渲染设置,准备基本数据,输出到几何阶段。(CPU阶段)
- 几何阶段:顶点着色器,曲面细分,几何着色器,顶点裁剪,屏幕映射。(GPU阶段)
- 光栅化阶段:三角形(点/线)设置,三角形(点/线)遍历,片段着色器。(GPU阶段)
- 逐片元操作:裁剪测试,透明度测试,深度测试,模板测试,混合。(GPU阶段)
- 后处理。
每个阶段环环相扣,前一个阶段的输出作为后一个阶段的输入。
应用阶段
该阶段准备的是场景,对象的基本数据。例如场景里面的物体他们的位置朝向,大小以及物体对应的模型里边每一个顶点的位置、法线、切换等,再比如场景光源的位置朝向和一些基本的属性,还有摄像机的位置朝向等。
- 准备基本场景数据
- 场景物体数据
- 摄像机数据
- 光源信息
- 可见光裁剪
- 可见场景物体裁剪
- 其他全局数据
- 加速算法、粗粒度剔除
- 碰撞检测
- 加速算法
- 遮挡剔除
- 其他算法
- 设置渲染状态、准备渲染参数
- 绘制设置
- 绘制顺序
- 渲染目标
- 渲染模式
- 调用 DrawCall、输入渲染图元到显存
- 顶点数据
- 其他数据
基本场景数据
- 场景物体数据
- 物体变换数据:位置、旋转、缩放等
- 物体网格数据:顶点位置、UV 贴图
- 光源信息
- 光源类型:方向光、点光、聚光等
- 位置、方向、角度等其他参数
- 摄像机参数
- 位置、方向
- 远近裁剪平面
- 正交 / 透视
- 视口比例 / 尺寸等
- 可见光裁剪
- 可见场景物体裁剪
- 八叉树
- K-D
- BVH
光源和阴影
- 设置光源
- 方向光:颜色、方向等
- 点光源:颜色、位置、范围等
- 聚光源:颜色、位置、方向、内外圆锥角等
- 设置阴影
- 是否需要阴影:判断该光源可见范围内是否有可投射阴影的物体
- 阴影参数:对应光源序号、阴影强度、级联参数、深度偏移、近平面偏移等
- 逐光源绘制阴影贴图
- 近平面偏移
- 逐级联
- 计算当前光源+级联对应的观察矩阵、投影矩阵,以及对应到阴影贴图里的视口区域
- 绘制到阴影贴图
渲染设置
- 绘制设置
- 合批方式
- 绘制物体的顺序(可以有多种方式)
- 相对摄像机的距离
- 材质 RenderQueue
- UICavas
- 其他方式等
- 渲染目标
- FrameBuffer
- RenderTexture
- 渲染模式
- 前向渲染
- 延迟渲染
输出到显存
- 顶点数据
- 位置
- 颜色
- 法线
- 纹理 uv 坐标
- 其他顶点数据
- 其他数据
- MVP 变换矩阵
- 纹理贴图
- 其他数据
几何阶段
- 顶点着色
来源:顶点数据来自于cpu。
主要工作:坐标变换、逐顶点光照。
GPU在每个输入的网格顶点上都会调用顶点着色器。顶点着色器必须进行顶点的坐标变换,需要时还可以计算和输出顶点的颜色。
顶点着色器会将模型顶点的位置变换到齐次裁剪坐标空间下,进行输出后再由硬件做透视除法得到 NDC 下的坐标。
- 视图变换
-
顶点着色
-
可选顶点处理
- 曲面细分
通过现有顶点生成更多顶点(需要知道现有顶点在模型里的现有信息)。
-
几何着色器
通过现有的图元来做一些几何方面的操作,生成更多的顶点和图元(例如对现有图元的顶点生成法线)
- 曲面细分
-
投影
- 正交
- 透视
- 裁剪
主要工作:裁剪掉那些不在摄像机视野范围的物体(不需要被处理)
只有在单位立方体的图元才需要被继续处理。因此,完全在单位立方体外部的图元(红色三角形)被舍弃,完全在单位立方体内部的图元(绿色三角形)将被保留。和单位立方体相交的图元(黄色三角形)会被裁剪,新的顶点会被生成,原来在外部的顶点会被舍弃。
- cvv
- 正面或者背面剔除(可配置)
- 屏幕映射
主要工作:把每个图元的 坐标转换到屏幕坐标系 (Screen Coordinates) 下
- 从连续到离散
- 坐标系差异(OpenGL/D3D)
光栅化阶段
- 三角形设置
来源:三角网格的顶点数据
主要工作:计算三角网格表示的数据
-
三角形遍历
也叫作扫描变换
主要工作:检查每个像素是否被 个三角网格所覆盖。如果被覆盖的话,就会生成一个片元 (fragment) 。
三角形遍历的过程。根据几何阶段输出的顶点信息,最终得到该三角网格覆盖的像素位置。对应像素会生成一个片元,而片元中的状态是对三个顶点的信息进行插值得到的。
-
抗锯齿
- SSAA
- 渲染到一个分辨率放大 n 倍的 buffer
- 对放大 n 倍的 buffer 下采样
- MSAA
- 在光栅化阶段
- 计算多个覆盖样本
- FXAA / TXAA
- 后处理技术,不在这个渲染阶段
- SSAA
逐片元操作
操作对象变成了光栅化操作输出的片元数据,片元即为屏幕上的一个着色点。
对于所有片元进行一系列测试(透明度测试、深度测试、模板测试),通过的保存否则遗弃。
- 像素着色
输入:输入是上 个阶段对顶点信息插值得到的结果。
输出:是一个或者多个颜色值。
-
颜色混合
-
目标缓冲区