1. 程式人生 > >Unity2018照明流程最佳實踐(上)

Unity2018照明流程最佳實踐(上)

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

定義

首先看幾個重要的圖形渲染概念的定義。

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


1199677-1abe19734311ee6c.jpg

在整個流程中,首先需要選擇渲染管線,然後決定如何生成間接照明並選擇相應的全域性照明系統。在確保所有全域性照明設定都對專案進行了相應調整後,可以繼續在場景中新增燈光、自發光表面、反射探頭,光照探頭以及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渲染如下圖所示:


    1199677-2804233d165a56c6.jpg

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

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

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


1199677-476e5c363c20edb3.jpg

模板

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


1199677-d51c5e832668d4a4.png

手動設定

如果要手動設定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 命令在場景中新增一個場景設定遊戲物件。


1199677-48b6e26943d13f5d.gif

可擴充套件性

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

相容性

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


1199677-62445f2278be01d8.png

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

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

全域性光照系統

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

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

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

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


1199677-5fc8bcbbfde1ea09.jpg

靜態 VS. 動態

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

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

警告

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

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