當前位置:首頁 >教程首頁 > 遊戲程序 > Unity3D遊戲開發工程師班 >Unity中URP的延遲渲染技術解析

Unity中URP的延遲渲染技術解析

發布時間:2022-05-16 09:40:12

我在2021年Unity Openday深圳站的URP演講中,提到過延遲渲染是海量光照的解決方案,會後就收到許多小夥伴私信希望可以詳細講解下,所以本期講解的內容是關於URP延遲渲染的。

延遲渲染其本質是通過將幾何通道與光照通道分離,能夠以比標準多通道前向渲染器更低的成本渲染更多的燈光。延遲渲染已經廣泛用於大量燈光的遊戲場景中,比如深受海內外玩家青睞的 Made With Unity 作品原神中就采用了延遲渲染技術。

1.png

URP 作為 Unity 重點推廣的渲染管線,其在功能上正逐步與內置渲染管線靠近,並在未來會替換掉內置渲染管線。這就需要增添一些內置渲染管線支持但是 URP 還沒有支持的功能。延遲渲染功能就是其中比較重要的一個。

另一方麵 URP 旨在為遊戲開發人員提供兼容 Unity 所支持的所有平台的渲染管線,所以該管線可在從低端移動設備到高端台式 PC 的大量平台上運行。所以將延遲著色添加到 URP 中意味著需要探索各種方法來解決目標平台的差異,這項工作繁重而緊迫。

一則喜大普奔的消息是:Unity 在 URP 12.0 以及以上版本中添加了對延遲渲染路徑的支持。我們目前可以在 Unity 2021.2 及以上版本中進行體驗這個功能。

Unity中為什麼要設置兩條渲染路徑

雖然我們能夠很簡單的在 URP 中切換前向和延遲渲染路徑(關於如何切換會在下文進行介紹)。但是對於剛入門 Unity 的新手來說,如何在前向和延遲渲染路徑這兩種渲染方法之間進行選擇?則需要更好地理解為什麼 Unity 會有多個渲染路徑,以及了解兩種渲染方法背後的動機。那麼接下來我就帶大家來一起探討下。

一切都與照明有關。我們總是說燈光很昂貴,主要是因為當物體處於燈光範圍內時,必須進行大量計算才能找出像素的有效顏色。在 Unity 中,可以按頂點、按像素或按球諧函數(本篇教程中不做討論)評估燈光。

2.png

在逐像素光照中,每個像素的顏色都是單獨計算的(如左圖)。您可以看到,即使我在此示例中使用低多邊形球體,但是光照仍然使它看起來是圓形的效果。如果不是看低多邊形的邊緣,真的很難發現頂點的位置。

然後是逐頂點光照。它對每個頂點進行一次光照計算。頂點之間的所有其他像素使用常規顏色混合算法評估顏色(無需進一步的光計算。)這是最便宜的照明方法。那麼我們如何在 Unity 中打開像素和頂點照明開關,在 Light 組件中 Render Mode(渲染模式)屬性選項下(如下圖所示)進行選擇,其中 Important 選項是強製燈光為像素光,Not Important 是頂點光,Auto 是使最強的光成為像素光。

3.png

從畫麵對比效果來看,遊戲開發者更加青睞逐像素光照而不是逐頂點光照(URP 不支持逐頂點光照)。但是逐像素光照有一個明顯的缺點,那就是每盞燈光都會導致光照範圍內的每個對象增加額外的渲染通道。可以影響對象的燈光數量是有限的,在最新的 Unity 的版本中我們已經提升了 URP 中的光源限製上限,從每個對象可以受 4 個光源影響增加到了可以受 8 個光源的影響。

延遲渲染過程的刨析

然而有一種技術可以讓您在場景中使用盡可能多的燈光,同時將性能保持在合理的水平。如果場景對象在光照範圍內(投射陰影的對象除外),它不會限製陰影的數量,也不會導致額外的繪製通道。它被稱之為延遲渲染路徑。

那麼延遲渲染為什麼會有這樣的優點呢?為了更好地理解延遲渲染過程,讓我們看一下 Frame Debugger。

我們發現場景渲染從渲染所有幾何圖形開始,沒有應用任何光影信息,如下圖所示:

4.png

那麼顯卡如何知道給這張隻是渲染了幾何圖形的平麵圖像應用光影信息呢?這裏就需要感謝深度緩衝區(Depth Buffer)。深度緩衝區存儲有關每個像素位於相機距離遠近的信息。如下所示:

5.png

但是僅靠深度信息不足以確定應如何在表麵上應用光。我們至少還需要方向。3D 空間中的方向通常由法線表示。正好,除了顏色緩衝區和深度緩衝區之外,還有一個帶法線的緩衝區。

6.png

基於該信息,可以渲染燈光和陰影。場景中有多少物體並不重要。因為一切都隻在最終圖像上完成。最後將光照通道的反轉版本(1–color)與第一個不透明圖像混合以獲得最終結果如下圖所示。

7.png

綜上所述我們了解:延遲渲染之所以具有多燈光、高性能的原因主要是場景中大多數模型是在沒有光照計算的情況下渲染的,當場景渲染接近完成時,光照才會應用於渲染的 2D 圖像。在這個階段進行操作就是我們通常稱為的在屏幕空間中進行操作。知道了這一點,我們可以說延遲渲染中的光照是屏幕空間進行的。

如何在URP中使用延遲渲染路徑

與Accurate G-buffer normals 屬性

首先在你的 URP 工程中在 Project Settings>Graphics 下找到 Scriptable Render Pipeline Settings 中的 URP 資產配置文件 URP Asset。

8.png

然後找到對應的 URP 渲染器資產 Universal Renderer Data,在 Renderering> Rendering Path。選擇 Rendering Path 為 Deferred,這樣我們就開啟了延遲渲染路徑。

9.png

值得注意的是選擇 Deferred Rendering Path 後,Unity 會顯示 Accurate G-buffer normals 屬性。

通過 Accurate G-buffer normals 屬性,可以配置 Unity 在將法線存儲在幾何緩衝區(Gbuffer)中時如何對法線進行編碼。那麼 Accurate G-buffer normals 屬性有什麼作用呢,我們來看下:

Accurate G-buffer normals 關閉:關閉這個選項可提高性能,尤其是在移動端 GPU 上,但可能會導致光滑表麵上出現色帶瑕疵。

Accurate G-buffer normals 開啟:Unity 使用八麵體編碼將法線矢量的值存儲在法線紋理的 RGB 通道中。通過這種編碼,法線矢量的值更加準確,但編碼和解碼操作會給 GPU 帶來額外的負擔。對於麵向 desktop 和 consoles 平台的開發人員,啟用“AccurateG-buffer normals”應該是默認設置。

我們在場景中創建一個球體 Sphere,調節球體的光滑度,我們來觀察下打開 Accurate G-buffer normals 屬性前後,球體表麵效果對比。如下圖所示:

10.png

URP中兩種延遲渲染解決方案

與內置管線延遲渲染解決方案性能對比

目前沒有一種完美的延遲算法可以完全適配 URP 的多平台性。所以為了適應目標平台的多樣化以及不斷變化的 GPU 硬件的限製和特殊性,URP 中的延遲渲染算法有兩種實現方式。分別是經典的 Stencil-based 延遲渲染算法和目前在台式機 GPU 上比較流行的 Tiled-based 延遲渲染算法(其中基於 Stencil-based 解決方案在所有平台上成熟穩定,基於 Tiled-based 的延遲解決方案目前還在更多平台上進行測試)。

關於這兩種算法的具體內容不是我們本教程所講的重點,我們來看一組實驗數據:同場景下基於 URP 的兩種延遲解決方案與內置渲染管線下的延遲解決方案在不同平台上的性能對比。

我們創建了一個有著 1 個主 directional light, 64 point lights, 燈光模式為 baked lighting 的測試場景。

11.png

在 Nvidia Gfx Geforce 1050 上與 iPhone 8 A11 Bionic 性能對比。

12-1.png12-2.png

從數據表中我們不難發現首先:URP 中延遲渲染技術性能要優於內置渲染管線,其次,在 URP 中的兩種延遲渲染解決方案性能在不同平台上性能各有優勢。

延遲渲染管線的限製

與下一代多光照渲染技術Forward+

說到這裏,大家是不是對使用新的延遲渲染路徑充滿熱情,保持冷靜。延遲渲染並不是萬能的。它還存在一些限製。都有哪些限製呢?我們來看下:

首先,延遲渲染不允許我們渲染半透明對象。這是因為如果場景中存在半透明的東西,則無法記錄通過半透明對象可見的對象和當前對象本身的深度和法線。Unity 在整個過程結束時使用前向渲染路徑處理此限製渲染半透明對象。

第二個限製是缺乏抗鋸齒支持。原因類似於半透明對象的問題,您可以使用屏幕空間 SMAA 算法,但效果可能不太好看。

還有一個就是 URP 中的相機堆疊 Camera Stack 使用也是有限製的,Unity 使用延遲渲染路徑僅渲染 Base Camera,Unity 使用前向渲染路徑渲染所有 Overlay Camera。也就是說隻允許 Base Camera 相機使用延遲渲染模式。Overlay Camera 疊加相機將恢複到正向渲染模式。

那麼有沒有一種解決方案可以克服前向渲染與延遲渲染的限製還能夠有延遲渲染處理多光照的優點。這就是下一代多光照渲染技術Forward+,也稱為基於Tile的前向渲染,是結合了前向渲染和基於Tile燈光剔除來減少著色過程中燈光數量的一種渲染技術。這將顯著改善URP中的前向渲染器對著色時使用的燈光數量的限製。借助URP中 Forward+的可用性,我們可以在場景中合並比當前前向渲染中每個對象8個燈光的限製更多的燈光。同時,隨著燈光和對象數量的增加,我們的項目中的渲染性能將得到更好的擴展。

目前 URP 團隊也在緊鑼密鼓地實現Forward+技術,應該很快大家就能體驗的到。到時候我們將能夠選擇Forward+作為可供選擇的渲染器,就如當前的 Forward和Deferred渲染器之間切換一樣。關於Forward+的相關內容我會在後續的教程中繼續給大家進行分享。

本文轉自公號:Unity

作者:李鵬鵬

华体会hth体育网 賞析
  • 2101期學員李思庭作品

    2101期學員李思庭作品

  • 2104期學員林雪茹作品

    2104期學員林雪茹作品

  • 2107期學員趙淩作品

    2107期學員趙淩作品

  • 2107期學員趙燃作品

    2107期學員趙燃作品

  • 2106期學員徐正浩作品

    2106期學員徐正浩作品

  • 2106期學員弓莉作品

    2106期學員弓莉作品

  • 2105期學員白羽新作品

    2105期學員白羽新作品

  • 2107期學員王佳蕊作品

    2107期學員王佳蕊作品

專業問題谘詢

你擔心的問題,火星幫你解答

微信掃碼入群領福利

掃碼領福利最新AI資訊

點擊谘詢
添加老師微信,馬上領取免費課程資源

1. 打開微信掃一掃,掃描左側二維碼

2. 添加老師微信,馬上領取免費課程資源

×

同學您好!

您已成功報名0元試學活動,老師會在第一時間與您取得聯係,請保持電話暢通!
確定