遊戲引擎中的光照算法

前言

今天咱們來聊一下游戲引擎中的光照算法,從最開始的Forward Render,到後來的Deferred Render再到後面的Clustered Forward Render以及Clustered Deferred Render,分析一下實現步驟以及它們的優缺點。html

Forward Render

這個是最傳統的方法,對於多光源的處理比較有限,它的基本算法以下所示:算法

通常遊戲引擎爲了減小批次和處理光照的次數,會讓每一個物體受影響的光源有個上限好比3個或者4個,並且通常是在一個shader裏面直接處理多個光源的狀況。這個在最開始的遊戲引擎中比較常見。目前基本上只會使用在移動平臺上。好比Unity和UE4移動平臺的低配版本都是這樣的。ide

Deferred Shading

隨着遊戲中支持光源的數量愈來愈多,傳統的Forward Render已經不能知足遊戲的需求,Deferred Shading應運而生,這個技術基本上是從Deferred shading in S.T.A.L.K.E.R. 進入你們的視野的。基本思路以下圖所示:wordpress

基本上GBuffe的內容大致如上圖所示,固然目前大多數引擎爲了支持多材質一個會有一個字節用於寫入Material ID或者Shading Model ID(UE4)來區分不一樣的着色模型。性能

Tiled Deferred Shading

Tile Deferred Shading就是在Deferred Shading基礎上按必定像素大小分塊(好比32x32),計算每一塊中光源的數量,這樣咱們能夠對多個光源計算光照只讀取一次GBuffer信息,節省了帶寬。優化

Deferred Lighting

Cryengine3早期版本中使用過該技術,大致算法以下圖所示:spa

這個算法跟Deferred Shading差很少,目前基本上沒有引擎再使用這個方法。.net

Forward Plus Shading(Tiled Forward Rendering

Forward+ Rendering最初是從AMD的論文Forward+: Bringing Deferred Lighting to the Next Level開始流行起來的。基本算法以下圖所示:3d

Clustered Forward Rendering

在Forward+ Rendering的基礎上又沿着相機深度的方向切了不少片。htm

Clustered Deferred Rendering

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

  1. 實現最簡單。
  2. MSAA和透明渲染都能正常工做。
  3. 帶寬消耗小。
  1. 對大規模點光源支持很差。
  2. 對各類須要深度和法線的後期處理算法不友好。

Deferred Shading

  1. 支持大規模點光源。
  2. 對各類須要深度和法線的後期處理算法很友好。
  1. 帶寬消耗大。
  2. MSAA和透明渲染支持不友好。
  3. 顯存消耗大。

Forward+ Rendering

  1. MSAA和透明渲染都能正常工做。
  2. 帶寬消耗小。
  3. 支持大規模光源。
  1. 對各類須要深度和法線的後期處理算法不友好。
  2. 強制須要一個Pre-Z Pass

Tiled Deferred Shading

  1. 支持大規模點光源
  2. 對各類須要深度和法線的後期處理算法很友好。
  3. 相對Deferred Shading帶寬消耗在光源計算的時候會減小。
  1. 帶寬消耗大
  2. MSAA和透明渲染支持不友好。
  3. 顯存消耗大。

Clustered Forward Rendering

  1. MSAA和透明渲染都能正常工做。
  2. 帶寬消耗小。
  3. 支持大規模光源。
  4. 相對Forward+ Rendering在光源多的時候會有效率提高。
  1. 對各類須要深度和法線的後期處理算法不友好。
  2. 強制須要一個Pre-Z Pass

Clustered Deferred Shading

  1. 支持大規模點光源
  2. 對各類須要深度和法線的後期處理算法很友好。
  3. 相對Deferred Shading帶寬消耗在光源計算的時候會減小。
  4. 相對Tiled Deferred Rendering在光源不少的狀況下會有性能提高。

一、帶寬消耗大

二、MSAA和透明渲染支持不友好。

三、顯存消耗大。

從上表能夠看出,這些算法的優缺點基本就是Forward/Deferred以及Tiled/Clustered優缺點的組合。

參考文章

  1. http://download.nvidia.com/developer/presentations/2004/6800_Leagues/6800_Leagues_Deferred_Shading.pdf
  2. https://www.slideshare.net/guest11b095/a-bit-more-deferred-cry-engine3
  3. https://developer.nvidia.com/gpugems/GPUGems2/gpugems2_chapter09.html
  4. http://www.yosoygames.com.ar/wp/2016/11/clustered-forward-vs-deferred-shading/
  5. https://www.gdcvault.com/play/1014915/Lighting-in-Crysis
  6. https://pydonzallaz.wordpress.com/2013/08/23/gdc-europe-2013-shining-the-light-on-crysis-3/
  7. https://developer.nvidia.com/gpugems/GPUGems2/gpugems2_chapter09.html
  8. https://takahiroharada.files.wordpress.com/2015/04/forward_plus.pdf
  9. https://www.3dgep.com/forward-plus/
  10. https://www.slideshare.net/takahiroharada/forward-34779335
  11. http://www.cse.chalmers.se/~uffe/clustered_shading_preprint.pdf
  12. http://www.humus.name/Articles/PracticalClusteredShading.pdf
  13. Forward+: A Step Toward Film-Style Shading in Real Time -- GPU Pro 4
  14. https://www.gdcvault.com/play/1025420/Cluster-Forward-Rendering-and-Anti
  15. http://www.dice.se/wp-content/uploads/2014/12/GDC11_DX11inBF3_Public.pdf
相關文章
相關標籤/搜索