渲染流水线
渲染流水线
参考书籍《Unity Shader入门精要》
- 渲染流水线是指将场景中的物体从摄像机视角投射到屏幕上,经过各种处理后最终呈现在屏幕上的过程。
- 当前,游戏引擎的渲染流水线一般分为三个阶段:应用阶段、几何阶段、光栅化阶段。另外,游戏引擎还会有一些其他阶段,如屏幕后处理阶段。
应用阶段
- 准备基本场景数据:
- 物体Transform数据:位置、旋转、缩放。
- 物体网格数据:顶点、法线、切线、UV坐标等。
- 光照数据:光源类型(平行光、点光源、聚光灯、环境光)、光源位置、方向、颜色、阴影(光源可见范围内是否有投射阴影的物体)、阴影参数等(光源序号、阴影强度、级联参数、深度偏移、近平面偏移等)。
- 摄相机数据:位置和方向、远近裁剪平面、正交、透视(FOV)、视口比例和尺寸等。
- 加速算法、粗粒度剔除: 使用算法加速场景物体的裁剪,并将不可见的物体剔除出去。
- 设置渲染状态、准备渲染参数:设置渲染状态,如深度测试、混合、模板测试、剔除、深度写入等。准备渲染参数,如光照、阴影、雾效、反射等。设置渲染模式:前向渲染、延迟渲染、光照预计算、混合渲染、自定义渲染路径。这一阶段最重要的输出是渲染所需的几何信息,即渲染图元。
- 调用DrawCall:将顶点数据如位置、颜色、法线、纹理uv坐标等传递给GPU,并调用DrawCall函数进行渲染。
几何阶段
几何阶段负责处理每个渲染图元,进行逐顶点、逐多边形的操作。这一阶段主要任务是将顶点坐标变换到屏幕空间下。
- 顶点着色器:对每个顶点进行处理,如位置、颜色、法线、纹理坐标等。可以利用这一阶段对顶点位置进行变换实现顶点动画,如布料、水面、旗帜等。但是无论怎么变换,顶点着色器都必须把顶点坐标变换到齐次裁剪空间下,然后由硬件设备进行透视除法,得到归一化的设备坐标。
- 裁剪:将物体的几何形状处于摄像机视角之外的部分裁剪掉,以节省渲染时间和资源。这一步不可编程,由硬件控制,但可以配置。
- 屏幕映射:将物体的几何形状从齐次裁剪空间映射到屏幕空间。
光栅化阶段
光栅化阶段负责将渲染图元转化为屏幕上的点、线、面。这一阶段的输出是渲染像素,即“片元”。
- 三角形设置:几何阶段输出的信息是屏幕坐标下顶点的位置和额外信息(深度值、法线、视角方向等)。三角形设置阶段根据这些信息设置三角网格的边界表示方式。
- 三角形遍历:这个阶段会检查每个像素是否被一个三角形所覆盖,如果被覆盖,就会生成一个片元。这个过程就叫做三角形遍历,也称扫描变换。
- 片元着色器:这是一个非常重要的可编程着色器阶段。在DirectX中,它被称为像素着色器,在OpenGL中,它被称为片元着色器。
- 前面光栅化阶段并不会影响屏幕上每个像素的颜色值,而是生成一个片元,每个片元负责存储一个三角形网格是怎样覆盖每个像素的。
- 片元着色器的输入是上一阶段对顶点信息插值得到的结果,它的输出是一个或者多个具体的颜色值。这一阶段是真正上色、贴图的阶段,
- 这一阶段有个比较重要的技术:纹理采样。通常我们会在顶点着色器中输出每个顶点的纹理坐标,然后经过光栅化阶段对三角形网格的3个顶点对应的纹理坐标进行插值后,得到其覆盖的片元的纹理坐标。
- 逐片元操作:DirectX中称输出合并阶段
- 这一阶段有很多测试操作,如模板测试、深度测试、混合、剔除等。
- 模板测试:GPU读取模板缓冲区中该片元位置的模板值,然后将该值和读取到参考值进行比较,比较函数可由开发者决定。如果比较不通过,及没有通过模板测试,则会丢弃该片元。
- 深度测试:高度可配置。如果开启深度测试,GPU会把该片元的深度值和已经存在于深度缓冲中的深度值进行比较,比较函数可由开发者决定,通常是小于等于。如果比较不通过,即被遮挡,则丢弃该片元。开发者还可以开启/关闭深度写入,比较通过后,则会把该片元的深度值写入深度缓冲区。透明效果和深度测试以及深度写入密切相关。
屏幕后处理阶段
屏幕后处理是实现游戏中屏幕特效的常见方法。通常指的是在渲染完整个场景得到屏幕图像后,再对这个图像进行一系列的操作,实现各种屏幕特效。可以为游戏画面添加更多的艺术效果,例如景深、运动模糊等。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 666柯南君的个人Blog!
评论