整体流程
-
应用阶段:粗粒度剔除,进行渲染设置,准备基本数据,输出到几何阶段
-
几何阶段:顶点着色器,曲面细分,几何着色器,顶点裁剪,屏幕映射
-
光栅化阶段:三角形(点/线)设置,三角形(点/线)遍历,片段着色器
-
逐片元操作:裁剪测试,透明度测试,模板测试,深度测试,混合
-
后处理
CPU和GPU在渲染管线中参与的工作
1.应用阶段
1.1 基本场景数据
(1)场景物体数据
-
物体变换数据:位置、旋转、缩放等
-
物体网格数据:顶点位置、UV贴图等
(2)设置光源和阴影
-
光源:方向光(颜色、方向等);点光源(颜色、位置、范围等);聚光灯(颜色、位置、方向、内外圆锥角灯)
-
阴影:判断是否需要阴影;阴影参数(对应光源序号、阴影强度、级联参数、深度偏移、近平面偏移等)
-
逐光源绘制阴影贴图:近平面偏移;逐级联(计算当前光源+级联对应的观察矩阵、投影矩阵以及对应到阴影贴图里的视口区域);绘制到阴影贴图
(3)摄像机参数
-
位置、方向
-
远近裁剪平面
-
正交/透视(FOV)
-
视交比例/尺寸等
1.2 加速算法与粗粒度剔除
(1)可见光裁剪:灯光光锥体和视锥体不相交可剔除不渲染
(2)可见场景物体裁剪:八叉树、K-D树、BVH
(3)视锥体剔除:物体不在摄像机视锥体内可剔除不参与渲染
(4)遮挡剔除:物体被完全遮挡可剔除不渲染
(5)层级剔除
不同阶段剔除的区别:渲染前CPU和渲染中GPU的裁剪和剔除_粗粒度剔除_刹那X逍遥的博客-CSDN博客
1.3 设置渲染状态
(1)绘制设置:使用着色器,合批方式(GPU Instance,动态批处理)
(2)绘制物体的顺序:相对摄像机的距离,材质RenderQueue,UI Canvas等
(3)渲染目标:帧缓存(FrameBuffer),渲染纹理(RenderTexture)
(4)渲染模式:前向渲染,延迟渲染
1.4 调用DrawCall,输出渲染图元到显存
(1)顶点数据
-
位置
-
颜色
-
法线
-
纹理uv坐标
(2)其他数据
-
MVP变换矩阵
-
纹理贴图
2.几何阶段
2.1 顶点着色器
顶点着色器通常实现顶点的空间变换、着色等功能。一个最基本的顶点着色器必须完成的工作是,把顶点坐标从模型空间转换到齐次裁剪空间。
2.2 曲面细分着色器
可选的着色器,主要用来增加模型的面数,提高模型精度。
2.3 几何着色器
可选的着色器,主要是基于给定的图元来产生一系列操作,增加图元等。
2.4 投影裁剪
GPU将顶点从摄像机观察空间转换到裁剪空间(又被称为齐次裁剪空间),将不满足 x,y,z∈[-w,w]这个条件的顶点裁剪掉,同时会在边界处产生新的顶点代替。
2.5 屏幕映射
屏幕映射负责把NDC空间下的顶点坐标映射到屏幕空间下,映射后的结果与显示器的分辨率有关,一般是1920*1080。
3.光栅化阶段
3.1 三角形设置
光栅化的第一个流水线阶段,这个阶段会计算光栅化一个三角形网格所需的信息。具体来说,我们目前只得到三角形的顶点数据,如果要得到整个三角网格对像素的覆盖情况,就必须计算每条边上的像素坐标。为了能够计算边界像素的坐标信息,我们就需要得到三角形边界的表示方式。这样一个计算三角网格表示数据的过程就叫做三角形设置。
3.2 三角形遍历
三角形遍阶段将会检查每个像素是否被一个三角网格所覆盖。如果被覆盖的话,就会生成一个片元,而这样一个找到哪些像素被三角网格覆盖的过程就是三角形遍历。三角形遍历阶段会根据上一个阶段的计算结果来判断一个三角网格覆盖了哪些像素,并使用三角网格3个顶点的顶点信息对整个覆盖区域的像素进行插值。
3.3 片段着色器
片元着色器的输入是上一个阶段对顶点信息插值得到的结果,输出则是一个或者多个颜色值。主要用于给像素着色。
3.4 合并阶段(逐片元操作)
(1)决定每个片元的可见性。这涉及了很多测试工作,主要为:透明度测试→模板测试→深度测试。
(2)如果一个片元通过了所有的测试,就需要把这个片元的颜色值和已经存储在颜色缓冲区中的颜色值进行混合。
4.后处理
前面的渲染完成后,最后对输出的缓冲区/渲染贴图进行处理,可以看成是对一张照片进行后期的打磨修改。