Unity 2018 照明流程最佳實踐

遊資網發表於2019-02-26


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

以下是本文主題結構:

•定義
•概述
•渲染管線

o模板

o手動設定

o可擴充套件性

o相容性

•全域性光照系統

o靜態VS.動態

o警告

•燈光模式

o混合照明模式

•渲染管線對照表
•場景照明案例

o原型製作/快速預覽

o 3D移動策略遊戲

o 3A室內射擊遊戲(固定日照時間)

o大逃殺類遊戲(日夜迴圈)

•總結

定義

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

•渲染管線決定物件如何在場景中呈現出來,分以下三個階段:

o第一階段:剔除(culling)。在此階段列出需要被渲染的物件,優先呈現攝像機可見的範圍,以及未被其它物體遮擋的物件。

o第二階段:渲染(rendering)。在此階段,根據光照設定以及相關的燈光屬性,將物件繪製到基於畫素的緩衝區中。

o第三階段:後處理(post-processing)。一般在緩衝區上執行操作,比如應用Color Grading、Bloom、Depth of Field等效果,將最終輸出到每一幀。

Unity 2018 照明流程最佳實踐

著色器(Shader)是在GPU上執行的程式或程式集合的統稱。比如,在剔除階段完成之後,頂點著色器(vertext shader)將可見物件的頂點座標從物件空間(object space)變換為剪輯空間(clip space),GPU使用新座標對場景進行光柵化,即將向量資訊轉換為實際畫素。然後,畫素(或片段)著色器將這些畫素進行著色,畫素顏色由材質屬性和光照環境決定。另一種常見的著色器型別被稱為計算著色器(compute shader),這種著色器使開發者能夠利用GPU強大的並行處理能力進行任何型別的數學運算,比如光剔除、粒子物理、體積模擬等。

•直接照明指的是來自光源(比如燈泡)的照明,並非光線從物體表面反射的結果。根據光源的大小及其與被照射物體的距離,這種照明通常會產生清晰且明顯的陰影。需要注意以下兩點:

o不要將直接照明與定向照明(directional lighting)混淆,定向照明是由無限遠的光源(例如Unity中的平行光)發出的光,定向光的顯著特性是能夠使用平行光線覆蓋整個場景,並且沒有距離衰減(或光衰減),也就是說,隨著到光源距離的增加,物體接收的照明強度不會衰減。
o在現實世界中,太陽光與任何其他光源一樣,光照強度與距離成反比。例如,水星上日光的照射強度幾乎是地球的7倍,而火星接收的日光照射是地球的1/2,而冥王星只有地球的0.06%。然而,鑑於地球上有限的海拔高度,相較以上的距離,日光在地球上的衰減是微不足道的。因此,平行光完全能夠模擬Unity場景中的陽光,包括大型的,以行星為中心的開放世界。另外,對於其他型別的光源(比如點光源和聚光燈),Unity在高清渲染管線(HDRP)中能夠提供基於物理的衰減。

•間接照明是由光線從物體表面反射然後通過介質(比如如大氣或半透明材料)傳播和散射而產生的照明。在這種情況下,光線通常通過遮擋物形成相對柔和的陰影。

•全域性照明(GI)用於在場景中產生間接照明,主要作為直接照明的功能。在業內,目前實現全域性照明存在幾種技術,比如光照貼圖(lightmaps)、Irradiance Volumes、Light Propagation Volumes、光照探頭(light probes)、基於體素的GI和基於距離場的GI等,它們被廣泛應用在像Unity、UE4、CryEngine、COD等引擎中,對於Unity來說,使用光照貼圖和光照探頭來實現。

o光照貼圖技術通過發射光線計算光線反射,然後將生成的光照效果應用到紋理中,以此來生成光照貼圖和光照探頭的資料。因此,使用不同的光照貼圖技術會呈現不同的照明效果。目前,Unity使用兩種光照貼圖技術:Enlighten和Progressive Lightmapper。

概述

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

Unity 2018 照明流程最佳實踐

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

Unity 2018 照明流程最佳實踐

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

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

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

Unity 2018 照明流程最佳實踐

模板

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

Unity 2018 照明流程最佳實踐

手動設定

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

Unity 2018 照明流程最佳實踐

可擴充套件性

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

相容性

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

Unity 2018 照明流程最佳實踐

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

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

全域性光照系統

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

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

烘焙全域性光照(以下簡稱烘焙GI):照明資訊被烘焙到光照貼圖和光照探頭中,烘焙GI系統可以使用以下兩種技術之一:

o Progressive Lightmapper
o Enlighten

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

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

Unity 2018 照明流程最佳實踐

靜態VS.動態

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

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

警告

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

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

燈光模式

燈光的模式通常容易混淆,最重要的是,只有使用烘焙GI時,燈光模式的設定才有意義。在燈光元件的屬性皮膚中有三種模式可供選擇:

1.Baked:燈光的直接和間接照明被烘焙成光照貼圖。設定為該模式後,該燈光在程式執行時將不佔用效能成本,同時,將生成的光照貼圖應用到場景中的成本也較低。

2.Realtime:燈光的直接照明和陰影需要實時計算,並且不會烘焙到光照貼圖。設定為該莫時候,該燈光在程式執行時將佔用一定的效能成本,具體取決於場景的複雜程度、需要投射陰影的燈光數量、光照交疊的燈光數量等。此外,如果啟用實時GI,將進一步帶來效能消耗,用於在程式執行時更新場景中的間接照明。

3.Mixed:一種提供烘焙和實時功能的混合模式,例如對燈光的間接照明進行烘焙,同時對直接照明進行實時計算。場景中混合模式燈光的行為和效能影響取決於我們將在後面介紹到的全域性混合照明模式的選擇。

如果不使用任何GI技術,或者僅使用實時GI,那麼所有Baked和Mixed模式的燈光都將被作為Realtime進行處理。

Unity 2018 照明流程最佳實踐

下圖為讀者提供了一個決策樹和對照表,當為場景新增燈光時,有助於選擇合適的燈光模式。

Unity 2018 照明流程最佳實踐

混合照明模式

如上所述,混合模式的燈光兼具烘焙和實時功能,具體取決於在Lighting視窗中選擇的Lighting Mode,如下圖所示:

Unity 2018 照明流程最佳實踐

Unity有如下四種照明模式可供選擇:

1.Subtractive

2.Baked Indirect

3.Shadowmask Mode:Shadowmask

4.Shadowmask Modeistance Shadowmask

Unity 2018 照明流程最佳實踐

可以在Edit>Project Settings>Quality下選擇Shadowmask和Shadow Distance,若專案使用的是HDRP,則在Graphics Settings中指定的HDRenderPipelineAsset中,預設已經啟用了Shadowmask模式,同時可以在場景中的Scene Settings遊戲物件(若沒有,需要建立)中可以設定Max Distance的值,如下圖所示:

Unity 2018 照明流程最佳實踐

HDRP支援一種新的混合Shadowmask模式,可以通過燈光元件的Additional Settings中的Non Lightmapped Only選項,控制該燈光是否投射實時陰影,如下圖所示。若勾選此項,當攝像機處於Fade Distance內時,燈光將投射實時動態陰影,若不勾選此項,將使用烘焙的Shadowmask來產生陰影。

Unity 2018 照明流程最佳實踐

渲染管線對照表

LWRP和HDRP目前仍處於預覽狀態,這也就意味著,一方面帶來了新的功能,另一方面,原來內建管線提供的某些功能目前在LWRP或HDRP中不被支援。下表列出了在Unity 2018.3中各渲染管線的特性對比。

Unity 2018 照明流程最佳實踐

場景照明案例

以上介紹了各渲染管線及其主要特性,下面將通過幾個示例專案具體說明如何應用Unity中的照明技術,每個專案均具有一定的代表性,讀者可據此對應到自己的專案。

1.原型製作/快速預覽

Unity 2018 照明流程最佳實踐

如果專案重度依賴Asset Store中的資源來構建產品原型,使用內建渲染管線可能是目前唯一適用的方案,因為資源商店中的大多數資源多數與HDRP和LWRP不完全相容,儘管如此,這種情況將隨著時間的推移而得到改善。如果專案中的資源由團隊內部自建,並且已經清楚瞭解專案需求,那麼可以選擇兩個SRP中的一個(即LWRP或HDRP),或這建立自定義的SRP。

當專案處於開發的早期階段,如果需要快速的迭代並且在照明方面獲得最大的靈活性,使用完全實時的方案可能更加實際,即關閉烘焙和實時GI,如下圖所示,這樣就不需要進行任何光照預計算的過程。在這種情況下,為了檢視間接照明效果,可以考慮使用Unity的Post Processing Stack V2外掛,啟用Ambient Occlusion效果實時檢視由間接光照產生的陰影效果。

Unity 2018 照明流程最佳實踐

2.3D移動策略遊戲

Unity 2018 照明流程最佳實踐

如果專案的目標平臺是移動裝置,LWRP可能是確保遊戲效能穩定的絕佳選擇。如果需要定製渲染管線以更好地適應遊戲,圖形開發人員可直接擴充套件LWRP。

如果專案使用LWRP並烘焙GI,需要注意的是,目前只有Subtractive照明模式可用於Mixed模式的燈光,Unity將在以後的版本中新增Baked Indirect和Shadowmask照明模式對Mixed燈光的支援。

如果出於某些原因而使用了之前的內建渲染管線,比如,專案過多依賴Asset Store中的資源,或者希望支援所有混合照明模式,在這種情況下,使用Shadowmask照明模式將能夠提供烘焙陰影,同時動態物件仍然能夠投射實時陰影。如果Shadowmasks對於專案來說效能成本較大,可以退而選擇更加節能Subtractive照明模式。最後,如果場景中的燈光數量非常少,並且專案的目標平臺更多考慮低端硬體裝置,建議使用前向渲染。

3.3A室內射擊遊戲(固定日照時間)

Unity 2018 照明流程最佳實踐

如果專案為了在PC和主機上為第一人稱射擊遊戲呈現3A級視覺效果,那麼HDRP是首選渲染管線。同樣,圖形開發人員也可以開發自定義SRP。如果場景中包含許多投射實時陰影的燈光(比如可被擊毀或移動的燈光道具),那麼使用使用Baked Indirect照明模式烘焙GI,能夠使Mixed和Baked模式的燈光產生良好的間接照明效果。如果場景中投射靜態陰影的燈光佔比較多,推薦使用Shadowmasks照明模式,因為HDRP提供了一個很好的混合Shadowmask模式,可以更好地混合實時陰影和烘焙陰影。

由於執行這類遊戲的硬體配置和效能較高,所以可同時使用烘焙和實時GI技術。但是,正如全域性照明部分所述,同時使用這兩種技術將顯著增加效能成本和烘焙時間,並且建議由瞭解所有技術細節的團隊成員進行設定。

4.大逃殺類遊戲(日夜迴圈)

Unity 2018 照明流程最佳實踐

如果專案是執行在PC和主機上的大逃殺類遊戲,建議選擇HDRP或者自定義擴充套件HDRP,因為這類遊戲通常具有大規模場景和完全動態的照明。如果專案不是為了實現3A級的視覺效果,並且針對的是移動裝置或配置較低的裝置,可以考慮使用LWRP。

為了實現晝夜迴圈效果,如果選擇了HDRP,則需要使用實時GI,以便在一天中的任何時間點模擬間接照明。為了在某些密集照明的室內場景中實現最佳效能並最大限度地降低渲染成本,可以將某些燈光的Indirect Multiplier設定為0,如下圖所示:

Unity 2018 照明流程最佳實踐

LWRP暫不支援實時GI,晝夜迴圈必須使用自定義指令碼來處理,比如,在一天中調整太陽和環境光的顏色。

對於這種型別的遊戲,不建議同時使用烘焙和實時GI技術,因為效能和場景管理方面產生的巨大開銷,對專案來說是一個不可忽視的關鍵因素。另外一個原因是,這類大型多人遊戲的不可預測性,比如,效能消耗可能比密集指令碼開發的單人遊戲更高。

總結

由於引入了Scriptable Render Pipelines,在過去的幾個月中,Unity的渲染水平發生了根本性的變化,希望本指南能夠使讀者更好地瞭解每個渲染管線的功能,以便在自己的專案中使用合適的照明方案。

歡迎關注我的微信公眾號:XR技術研習社(ID:XRStudy)

專欄地址:https://zhuanlan.zhihu.com/p/50753337

相關文章