今天咱们来聊一下游戏引擎中的光照算法,从最开始的Forward Render,到后来的Deferred Render再到后面的Clustered Forward Render以及Clustered Deferred Render,分析一下实现步骤以及它们的优缺点。html
这个是最传统的方法,对于多光源的处理比较有限,它的基本算法以下所示:算法
通常游戏引擎为了减小批次和处理光照的次数,会让每一个物体受影响的光源有个上限好比3个或者4个,并且通常是在一个shader里面直接处理多个光源的状况。这个在最开始的游戏引擎中比较常见。目前基本上只会使用在移动平台上。好比Unity和UE4移动平台的低配版本都是这样的。ide
随着游戏中支持光源的数量愈来愈多,传统的Forward Render已经不能知足游戏的需求,Deferred Shading应运而生,这个技术基本上是从Deferred shading in S.T.A.L.K.E.R. 进入你们的视野的。基本思路以下图所示:wordpress
基本上GBuffe的内容大致如上图所示,固然目前大多数引擎为了支持多材质一个会有一个字节用于写入Material ID或者Shading Model ID(UE4)来区分不一样的着色模型。性能
Tile Deferred Shading就是在Deferred Shading基础上按必定像素大小分块(好比32x32),计算每一块中光源的数量,这样咱们能够对多个光源计算光照只读取一次GBuffer信息,节省了带宽。优化
Cryengine3早期版本中使用过该技术,大致算法以下图所示:spa
这个算法跟Deferred Shading差很少,目前基本上没有引擎再使用这个方法。.net
Forward+ Rendering最初是从AMD的论文Forward+: Bringing Deferred Lighting to the Next Level开始流行起来的。基本算法以下图所示:3d
在Forward+ Rendering的基础上又沿着相机深度的方向切了不少片。htm
Clustered Forward Rendering也便是在Tiled Deferred Rendering的基础上又沿着相机深度的方向上进行了切片。
切片算法
到这里咱们把基本的光照算法都讲一遍了,读者能够看到上面的这些光照算法无非就是下面的几种组合:Forward/Deferred + (Tiled/Clustered)?,这里?表明0或1。演进过程是这样的,最开始只有传统的Forward Rendering,为了解决多光源的问题,引入了Deferred Rendering,带来了不少好处,包括各类后期效果。可是带宽是个问题,因而出现了Forward Plus(Tiled) Rendering解决带宽问题,也就有了Tiled Deferred Shading,可是还能够进一步优化,那就是在Tile的基础上再切片,因而就有了Clustered Forward Rendering和Clustered Deferred Rendering。下面咱们列个简单的表格来对比下他们的优缺点。
光照算法 |
优势 |
缺点 |
Forward Rendering |
|
|
Deferred Shading |
|
|
Forward+ Rendering |
|
|
Tiled Deferred Shading |
|
|
Clustered Forward Rendering |
|
|
Clustered Deferred Shading |
|
一、带宽消耗大 二、MSAA和透明渲染支持不友好。 三、显存消耗大。 |
从上表能够看出,这些算法的优缺点基本就是Forward/Deferred以及Tiled/Clustered优缺点的组合。