今天咱們來聊一下游戲引擎中的光照算法,從最開始的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優缺點的組合。