2016年10月19日 星期三

ReCore開發系列:全域光照

作者:Raymond Graham 原文
潤稿:Kelvin Lo

*註:ReCore是一款由Armature Studio在Xbox平台上所發行的動作冒險遊戲

*註:LPPVs(Light Probe Proxy Volumes)必須要支援Shader Model 4以上的硬體以及支援32位元的浮點運算和線性過濾(Linear filtering)的3D材質,可參考之前的文章

眾所皆知,我們樂於聽到從開發者給的建議,從功能需求到各種建議,Unity社群推動Unity不斷的改進,幫助開發者更好更滿的完成工作。但真的要做好坐滿,我們認為自己也要用自家引擎開發過遊戲才行,因此當我們聽到有個機會和Armature、Xbox的Microsoft Game Studio和Windows game ReCore合作時,當然不會錯過這個機會。

接下來的幾個月裡,我們會分享一些從我們內部一些關於改進和我們支援功能的看法,以及我們如何計劃將這些經驗帶回引擎本身。今天我們主要重點介紹Unity 5.4如何幫助團隊實現ReCore的全域光照。首先來看看一張ReCore的畫面:



Unity支援多種計算場景全域光照的方法。其中一種是用Enlighten來為場景表面計算烘培包含全域光照資訊的光照貼圖。另一種方法是將全域光照資訊烘焙到光照探針(Light probes)中。這兩個系統可以整合使用實現場景中各種不同效果。光照貼圖適合用於大型靜態物件,光照探針則適合用於動態物件。對於大型的室外場景,光照貼圖會比光照探針消耗更多的記憶體。
Armature希望全域光照系統的烘培時間很短,並且烘培光照貼圖不要額外增加記憶體消耗。為了實現這個目的,我們開發了一個透過捕捉光照探針六面貼圖(Cubemap),將光的反射資料烘到光照探針的全域光照方案。那麼光照探針就可以作為場景中所有物件的全域光照的唯一來源。但是,使用Unity的光照探針系統幫很大的環境物件計算全域光照時會導致不同物件的光照結果不一致。

本文將討論在ReCore中如何使用Unity 5.4新功能"光照探頭代理器 (LPPV)"來解決這個問題的過程,並分享一些最佳實踐。想知道什麼是LPPV以及如何使用它?請閱讀我們之前的文章(中文)。

在ReCore中使用光照探針的問題



Unity光照探針系統基於物件的世界座標幫物件指派光照探針,如果一個物件距離多個光照探針都很近,那麼光照的效果將混合這些光照探針。對於小的動態物件如人物角色效果會很好。然而對於能覆蓋大區域的大物件來說,這個系統會因為光探針差值和用於渲染整個物件的錨點不同會產生很不一致的結果。理論上,你需要針對光照探針插值每個像素去修正來獲得較好的位置坡度對照來為物件著色。這問題在光照變化明顯的大物件表面上特別明顯。

ReCore中的效果如下圖1:

圖1 – 光照探針全域光照


在圖1中,紅框區域明顯接受了不一樣的全域光照,這看起來是不對的。為了獲得一致的光照,需要一種將全域光照效果平滑應用到物件表面的方法。而LPPV可以解決這個問題!


在ReCore中設定LPPV



在Unity中,LPPV可以作為元件(Component)加在任何有MeshRenderer元件的物件上,或者MeshRenderer可以被強制使用場景中特定的LPPV。

幫每個渲染器附加不同的LPPV是不切實際的,這會導致記憶體消耗過度,還會導致物件之間的光照不一致。ReCore就使用單一LPPV來包覆關卡大部分的區域,多個渲染器共用相同的LPPV。LPPV作為元件被加到Light Probe Groups及自訂腳本,腳本用於將MeshRenderer指定到包含該MeshRenderer的LPPV。我們發現在網格模式(grid pattern)安排光照探針可以獲得較好的結果,我們還寫了一些自訂腳本來自動執行這個過程。這是ReCore關卡中典型的LPPV設定的俯視圖:


Light probe group和mesh renderer的設定如下:


結果


在美術設定好LPPV並烘焙完光照之後,全域光照的結果將更加一致,如下圖2:

圖2 – 使用了LPPV的全域光照


在圖2中,你可以看到紅框區域全域光照更加一致。全域光照對大型岩石結構的作用也更加平滑。ReCore中的光照是靜態的,而且LPPV更新的消耗僅在於它們載入的時候。這將使用LPPV的CPU消耗維持在最低狀態。而且傳送到GPU的LPPV貼圖也很小,只在g-buffer傳遞時增加了3個貼圖樣本,總體上說對GPU時間的影響幾乎沒有感覺。

Unity 5.4和LPPV使ReCore的自訂全域光照解決方案在不犧牲品質下得以解決。敬請繼續關注部落格,瞭解更多使用Unity開發ReCore的其它技術。

沒有留言:

張貼留言

著作人