前言
今天我们就来说说游戏引擎中的光照算法,从最初的Forward Render,到后来的Deferred Render,再到后来的Clustered Forward Render和Clustered Deferred Render,并分析其实现步骤及其优缺点。
正向渲染
这是最传统的方法,其对多光源的处理比较有限。 其基本算法如下:
一般情况下游戏引擎全局光照技术,为了减少批次和光照处理的数量,游戏引擎会对每个物体影响的光源设置一个上限,比如3个或4个,并且通常直接在一个shader中处理多个光源。 这在最早的游戏引擎中是比较常见的。 目前基本上只在移动平台上使用。 比如Unity和UE4移动平台的低配版就是这样。
延迟着色
随着游戏中支持的光源越来越多游戏引擎全局光照技术,传统的Forward Render已经不能满足游戏的需求,Deferred Shading应运而生。 这项技术基本上从STALKER中的Deferred shading开始进入大家的视野。 基本思路如下图所示:
基本上GBuffe的内容大致如上图所示。 当然,为了支持多种材质,目前大多数引擎都有一个字节用于写入Material ID或Shading Model ID(UE4)来区分不同的着色模型。
平铺延迟着色
Tile Deferred Shading是在Deferred Shading的基础上,分成一定像素大小(比如32x32)的块,并计算每个块中的光源数量。 这样,我们就可以计算多个光源的光照,并且只读取一次GBuffer信息,节省了带宽。
延迟照明
该技术在Cryengine3的早期版本中使用。 一般算法如下图所示:
该算法类似于延迟着色。 目前基本上没有引擎采用这种方式。
前向加着色(平铺前向渲染)
Forward+Rendering 最初流行于 AMD 的论文 Forward+: Bringing Deferred Lighting to the Next Level。 基本算法如下图所示:
集群前向渲染
在Forward+Rendering的基础上,沿着相机深度方向切割了很多切片。
集群延迟渲染
集群前向渲染基于平铺延迟渲染并沿相机深度方向进行切片。
切片算法
总结
到目前为止我们已经讨论了基本的光照算法。 读者可以看到,上面的光照算法无非就是以下几种组合:Forward/Deferred+(Tiled/Clustered)?3D场景,其中? 代表0或1。演化过程是这样的。 一开始只有传统的前向渲染。 为了解决多光源的问题3D植物,引入了延迟渲染,它带来了很多好处,包括各种后期效果。 但是带宽是一个问题,所以Forward Plus (Tiled) Rendering出现了,就是为了解决带宽问题,还有Tiled Deferred Shading,但是还可以进一步优化,就是在Tile的基础上进行切片,所以就有了Clustered Forward Rendering和集群延迟渲染。 下面我们做一个简单的表格来比较它们的优缺点。
从上表可以看出,这些算法的优缺点基本上都是Forward/Deferred和Tiled/Clustered的优缺点的综合体。
文章来源:https://blog.csdn.net/woliuqiangdong/article/details/120262274