目前 Unity 提供了多種渲染管道,兩種全局照明系統,四種照明模式,三種燈光模式,以及兩種 Shadowmask 模式,為開發者在創建面向高配PC、主機、移動和XR設備項目的過程中提供了高度靈活性。但是,作為 Unity 新手,如果不熟悉渲染的話,面對這些選擇不免感到茫然,本文來自 Unity Spotlight Team 的分享,XR技術研習社對此進行了編譯。

由於本文篇幅較長,為了方便閱讀,將分兩部分進行論述,以下是本文主題結構:

  • 定義
  • 概述
  • 渲染管線
    • 模板
    • 手動設置
    • 可擴展性
    • 兼容性
  • 全局光照系統
    • 靜態 VS. 動態
    • 警告
  • 燈光模式
    • 混合照明模式
  • 渲染管線對照表
  • 場景照明案例
    • 原型製作/快速預覽
    • 3D移動策略遊戲
    • 3A室內射擊遊戲 (固定日照時間)
    • 大逃殺類遊戲 (日夜循環)
  • 總結

定義

首先介紹幾個重要的圖形渲染概念。

  • 渲染管線決定對象如何在場景中呈現出來,分以下三個階段:
    • 第一階段:剔除(culling)。在此階段列出需要被渲染的對象,優先呈現攝像機可見的範圍,以及未被其它物體遮擋的對象。
    • 第二階段:渲染(rendering)。 在此階段,根據光照設置以及相關的燈光屬性,將對象繪製到基於像素的緩衝區中。
    • 第三階段:後處理(post-processing )。一般在緩衝區上執行操作,比如應用 Color Grading、Bloom、Depth of Field 等效果,將最終輸出到每一幀。

  • 著色器(Shader)是在GPU上運行的程序或程序集合的統稱。比如,在剔除階段完成之後,頂點著色器(vertext shader)將可見對象的頂點坐標從對象空間(object space)變換為剪輯空間(clip space),GPU使用新坐標對場景進行光柵化,即將矢量信息轉換為實際像素。然後,像素(或片段)著色器將這些像素進行著色,像素顏色由材質屬性和光照環境決定。另一種常見的著色器類型被稱為計算著色器(compute shader),這種著色器使開發者能夠利用GPU強大的並行處理能力進行任何類型的數學運算,比如光剔除、粒子物理、體積模擬等。
  • 直接照明指的是來自光源(比如燈泡)的照明,並非光線從物體表面反射的結果。根據光源的大小及其與被照射物體的距離,這種照明通常會產生清晰且明顯的陰影。需要注意以下兩點:
    • 不要將直接照明與定向照明(directional lighting)混淆,定向照明是由無限遠的光源(例如Unity中的平行光)發出的光,定向光的顯著特性是能夠使用平行光線覆蓋整個場景,並且沒有距離衰減(或光衰減),也就是說,隨著到光源距離的增加,物體接收的照明強度不會衰減。
    • 在現實世界中,太陽光與任何其他光源一樣,光照強度與距離成反比。例如,水星上日光的照射強度幾乎是地球的7倍,而火星接收的日光照射是地球的1/2,而冥王星只有地球的0.06%。然而,鑒於地球上有限的海拔高度,相較以上的距離,日光在地球上的衰減是微不足道的。因此,平行光完全能夠模擬Unity場景中的陽光,包括大型的,以行星為中心的開放世界。另外,對於其他類型的光源(比如點光源和聚光燈),Unity 在高清渲染管線(HDRP)中能夠提供基於物理的衰減。
  • 間接照明是由光線從物體表面反射然後通過介質(比如如大氣或半透明材料)傳播和散射而產生的照明。在這種情況下,光線通常通過遮擋物形成相對柔和的陰影。
  • 全局照明(GI)用於在場景中產生間接照明,主要作為直接照明的功能。 在業內,目前實現全局照明存在幾種技術,比如光照貼圖(lightmaps)、Irradiance Volumes、Light Propagation Volumes、光照探頭(light probes)、基於體素的GI和基於距離場的GI等,它們被廣泛應用在像Unity、UE4、CryEngine、COD 等引擎中,對於Unity來說,使用光照貼圖和光照探頭來實現。
    • 光照貼圖技術通過發射光線計算光線反射,然後將生成的光照效果應用到紋理中,以此來生成光照貼圖和光照探頭的數據。因此,使用不同的光照貼圖技術會呈現不同的照明效果。目前,Unity 使用兩種光照貼圖技術:Enlighten 和 Progressive Lightmapper。

概述

以下流程圖從內容創作者的角度展示了在Unity中設置照明的過程。

在整個流程中,首先需要選擇渲染管線,然後決定如何生成間接照明並選擇相應的全局照明系統。在確保所有全局照明設置都對項目進行了相應調整後,可以繼續在場景中添加燈光、自發光表面、反射探頭,光照探頭以及Light Probe Proxy Volumes (LPPVs)。詳細介紹所有這些照明對象的用法和功能超出了本文的討論範圍,因此建議讀者閱讀Unity手冊中關於光照部分的相關介紹,以了解如何在項目中正確使用它們。

渲染管線

在 Unity 2018 之前,只有一種渲染管線,現在稱之為「內置渲染管線(Built-In Render Pipeline)」,該管線提供前向(forward)和延遲(deferred)兩種渲染模式供用戶選擇。

  • 在(多通道)前向渲染模式中,場景中的所有對象按照一個統一的順序逐個渲染,在多通道渲染過程中,當多個光源照亮對象時,渲染成本會顯著增加,具體取決於影響每個對象的光源數量。這種類型的渲染器通常提供多種著色器,並且能夠輕鬆處理透明度。
  • 在延遲渲染模式下,所有(包括不透明)幾何體首先渲染到存儲有關其材質信息(顏色、反射、平滑度等)的緩衝區中。稍後(在此體現延遲),每個像素被順序著色,同時,渲染時間主要取決於影響每個像素的光源數量。透明對象和具有複雜著色器的對象仍需要額外的前向渲染通道進行渲染。在處理包含很多動態燈光的場景時,建議使用延遲渲染,例如人工照明的室內場景,或需要室內外組合照明的項目。

在2018年1月,Unity 推出了 Scriptable Render Pipeline(SRP),允許開發者通過C#腳本自定義渲染流程。這實際上是遊戲引擎領域的一次變革——用戶能夠自由控制對象的剔除、繪製和後處理,而無需使用像C ++這樣的底層編程語言。

Unity提供了兩種SRP,目前為預覽版,其設計充分考慮了硬體規格及性能:

  • 高清渲染管線(以下簡稱 HDRP)是一個綜合了Deferred/Forward、Tile/Cluster 渲染方式的渲染器,提供高級渲染和著色功能,適用於需要展示高品質視覺效果的PC和主機項目。Tile渲染和Cluster渲染對比如下圖所示:

其中,一個 Tile 代表幀中一小塊二維正方形區域中的像素,一個 Cluster 代表攝像機兩個截平面之間的三維空間。Tile 和 Cluster 渲染技術均依賴於影響每個Tile或Cluster的燈光,然後在一個通道中根據與其相關燈光來計算照明。不透明對象最有可能使用Tile系統進行著色,而透明對象則依靠Cluster系統。與內置渲染管道(延遲模式)相比,HDRP 的主要優勢是更快的照明處理和更低的帶寬使用。

  • 輕量級渲染管線(LWRP)是一種快速單通道前向渲染器,適用於具有較低實時照明要求的設備,例如智能手機、平板電腦和VR/AR設備。在該渲染管線中,會對燈光進行逐對象剔除,並在一個通道中進行光照計算。與內置渲染管線相比,該管線能夠減少繪製調用的次數。

通過使用以下決策樹,讀者可以使用幾個關鍵條件判斷決定使用何種渲染管線。

模板

可以通過 Unity 的 Package Manager (Window > Package Manager) 下載最新版本的 HDRP 和 LWRP應用到項目中。在項目中應用某個 SRP 比較快捷的方式是,在使用Unity Hub創建一個新項目時,選擇相應的模板(Template),如下圖所示。

手動設置

如果要手動設置HDRP或LWRP項目,請確保已安裝所需的 package。以使用HDRP為例,可通過 Create > Rendering > High Definition Render Pipeline Asset 命令在 Project 面板中新建對應的資源,然後將此資源拖到 Graphics Settings 面板的 Scriptable Render Pipeline Settings 屬性中,如果此處不指定任何資源,Unity 將默認使用內置渲染管線。如果使用 HDRP,需要確保在 Player Settings 中選擇了線性(linear)色彩空間,並使用 Rendering > Scene Settings 命令在場景中添加一個場景設置遊戲對象。

可擴展性

對於理解渲染技術並熟悉C#的開發者,如果需要為項目完全定製渲染器,建議嘗試使用SRP的相關概念創建自己的渲染管線。鑒於LWRP擁有較小的著色器庫且易於注入、移除、切換渲染通道,使得LWRP具有極強的可擴展性。

兼容性

在Unity中將項目中的材質從內置渲染管線切換到HDRP或LWRP比較容易,使用 Edit > Render Pipeline > Upgrade xxx... 相關命令即可完成,如下圖所示。需要注意的是,此操作不可逆,建議事先做好項目備份。

儘管如此,自定義著色器需要進行手動移植,此過程相對比較耗時,具體取決於自定義著色器的數量。由於LWRP 和 HDRP 在物理表現上比內置渲染管道更加準確,尤其是在光衰減和分布方面,所以切換前後的項目看上去會有一些不同。此外,HDRP和LWRP之間互不兼容,因為它們沒有相同的渲染特性,兩者可以相互轉換,但不是一鍵操作,需要手動重新設置照明、材質和著色器。

最後需要說明的是,HDRP和LWRP目前仍處於預覽中,並非所有功能都已針對兩種管線實現。比如,某些照明模式尚未完全適用於LWRP,並且HDRP目前尚不支持VR/AR,但是在未來版本中將逐步實現。

全局光照系統

Unity 提供兩種全局照明系統,可在 Window > Rendering > Lighting Settings 中啟用它們。

  • 實時全局光照(以下簡稱實時GI):該系統完全依賴於第三方照明中間件Enlighten。在Unity的預計算過程中,Enlighten先後經過兩個階段,包括:集群化和光傳輸。第一階段將場景分解簡化為以「集群」為單位進行組織的集合,在第二階段計算集群與集群之間的可見性。預計算後的數據在運行時用於交互性地生成場景的間接照明。 Enlighten的優勢在於能夠實時改變間接照明效果,因為預計算的數據依賴於集群之間的關係。但是,與其他光照貼圖技術一樣,改變場景中的靜態幾何體將觸發新的預計算。
  • 烘焙全局光照(以下簡稱烘焙GI): 照明信息被烘焙到光照貼圖和光照探頭中,烘焙GI 系統可以使用以下兩種技術之一:
    • Progressive Lightmapper
    • Enlighten

Progressive Lightmapper 優先計算對於攝像機可見物體的照明,並大大提高的照明計算速度,但代價是增加整個場景的總體烘焙時間。 該技術使用CPU通過路徑追蹤演算法計算間接照明。基於GPU加速的 Progressive Lightmapper 能夠大幅縮短場景的烘焙時間,目前正在處在研發中,在 Unity 2018.3.05b 中集成了該技術測試版。由於Enlighten和Progressive Lightmapper 使用了不同的技術計算光照,所以兩者產生的光照效果會有不同。

下圖列出了各全局光照系統的主要優缺點,可根據決策樹選擇項目需要使用的全局光照系統。

靜態 VS. 動態

無論您使用哪種全局照明系統,Unity 都只會考慮標記為「Lightmap Static」的遊戲對象。動態遊戲對象需要藉助場景中放置的光照探頭來接收間接照明。

由於全局光照計算是一個相對緩慢的過程,因此只有具有明顯光照變化的大型複雜資源才需要應標記為「Lightmap Static」。接收均勻光照的較小網格可保持為動態設置,然後通過使用 Light Probes 為其提供近似效果的間接照明效果。較大的動態遊戲對象可以使用 Light Probe Proxy Volume(LPPV),以便在局部接收更好的間接照明。限制場景中靜態遊戲對象的數量對於提高烘焙時間同時保持足夠照明品質至關重要。

警告

在Unity中可以同時使用烘焙和實時GI技術,但是,必須注意,同時使用會大大增加烘焙時間和程序運行時的內存消耗,因為這兩個系統不使用相同的數據。此外,間接照明在運行時的互動式更新將給CPU帶來額外的壓力,並且在視覺上,烘焙和實時GI提供的間接照明效果會有差異,因為它們使用了不同的技術來模擬間接照明,並且通常在完全不同的解析度下執行。若同時使用這兩種技術,建議將使用範圍限制在高端平台或具有可預測性能成本且嚴格把控場景的項目中,同時,建議由對所有照明設置有很好理解的團隊成員負責,因為管理這兩個系統相對複雜。

因此,對於大多數項目而言,盡量避免同時使用兩種GI技術,選擇其一是相對比較穩妥的做法。

未完待續……

歡迎關注我的公眾號:

weixin.qq.com/r/UTgDG3f (二維碼自動識別)


推薦閱讀:
相关文章