2014年9月23日 星期二

Unity 5 的全域光照

原文連結:http://blogs.unity3d.com/2014/09/18/global-illumination-in-unity-5/
作者:Jesper Mortensen

Unity5在圖形模擬和光照特效方面做了重大改變。自從3.0版本開始,Unity的光照效果一直局限於烘焙好的光照貼圖。然後我們在全域光照領域有了很大的提升與改進,現在是時候將這個功能從Unity的沙盒中開放出來了。其中之一的新特性就是改善的光照流程為基礎上的全新全域即時光照,也是本文的重點。 


新加坡團隊的Paul Tham採用Unity 5 光跡追蹤後的娃娃模型展示

淺談全域光照(Global Illumination)
全域光照(以下簡稱GI)演算法是基於光傳輸的物理特性的一種模擬。模擬光在3D場景中面與面之間的傳輸的方式,能有效的改善遊戲的模擬度。不僅如此,他還可以傳達一種意境,如果用的好也會有效改善你的遊戲體驗。GI演算法不僅考慮光源的直射光,而且還考慮場景中其他材質表面的反射光。一般來說在遊戲中由於即時運算的關係,間接光照的模擬因效能消耗過大而無法採用。

這些都是源於下面這個淺顯的方程式:


簡單來說,從某一觀察點看到的光是從場景中物體表面點入射的光(Le)與從觀察點上方的半球入射的光疊加。Li描述的是從半球上某一角度w’ 入射的光。反射項p描述的是光線如何反射到觀察點,這項的取值依賴於入射角w’ 和觀察者的角度w。

細心的你可能已經發現L(x,w) 在方程式的兩邊,而且有一個還在在積分式中。如果不是這種情形,我們也許已經計算出全域光照的結果。由於物理規律是不太可能去改變的,研究協會提出了一套解決方案。

其中最流行(最古老的)的是光跡追蹤演算法。這個演算法從根本上改善了GI演算法,在演算最難的部分使用了一些比較耗時的演算技巧。光跡追蹤在電影或電視CG動畫上經常被運用。儘管該領域有大量的研究成果,但是每張圖的渲染還是要花費數秒的時間(哪怕使用非常先進的GPU)。

光跡追蹤通常使用的是螢幕空間,所以一張圖每一幀都需要重新渲染。這代表可以完全支援全動態的場景:燈光、材質、幾何形狀可以自由變換的動畫。但這也是一個缺點,因為每當鏡頭移動的時候,一張全新的圖片需要被渲染,而這張圖像的轉換需要花費數秒鐘的時間,導致這技術無法用於即時的遊戲場景。

一張沒有轉換完全的圖會有很多噪點,所以圖像在完全轉換之前會有嚴重的閃爍。可以使用濾波來降低這種影響,但無法徹底消除。下面是一些在不同轉換程度的圖像。
 

 光跡追蹤圖片在轉換過程各種階段

近期有很多新的圖像混合演算法出現,其中大部分都在GPU中運行,例如體椎追蹤。這些演算法中大部分需要在具有一定記憶體大小的桌上電腦的GPU上運行,只適合高端PC系統。為了讓全域光照在更多的平臺(包括手機)運行,必須做出了一些妥協。

Enlighten介紹:

Enlighten對於這個問題有了一套很好的解決方案。通過優化適用於各種不同的平台,從手機一直到桌上型電腦。已經被運用於戰地風雲4Battlefield 4,榮譽勳章MoH Warfighter等3A級遊戲,證明它是穩定可靠的。

他的運作原理是如果一些可見光是預先計算的(上面那個GL方程右側的積分體),那麼在手機實現即時光照就可行。

Enlighten允許的動態更改:
  • 光源
  • 環境光
  • 材質屬性(漫反射率和表面自發光) 
GI模擬中的幾何體部分必須被設置為靜態的。但是動態的幾何體可以使用GI根據靜態幾何體產生的光探針進行即時渲染。為了實現這個功能,Enlighten預先計算GI即時模擬需要的資料。這個資料存儲在一個即時模組中,模組適用於大部分平臺:SX, Windows, Linux, iOS, Android, PS Vita, PS3, PS4, Windows Phone, Xbox360 and XboxOne。WebGL目前正在開發中,還不確定何時支援。

Enlighten輸出資料如下:
  • 即時光照
  • 即時光探針
  • 即時立體貼圖 
Enlighten受限於GI對於漫反射傳輸的計算。漫反射是最重要的傳輸方式,因為他包含了全域光照的資訊。由於漫反射是低頻的,所以即時光照貼圖可以是一張即時更新的低解析度圖像。另外通過增加動態更新的立方貼圖來實現鏡面/光滑面的反射。在Heckbert notation中,Enlighten使用了光線追蹤子集L(D)*(S|G)?E。這代表Enlighten包含了大部分的GI效果。而缺失的效果中最重要的是鏡面反射(俗稱散焦),你得用些技巧來達到該效果。

下面是使用Enlighten,兩種不同的光線設置渲染圖像的例子。這些光線設定是完全動態且即時的。

 維京人村莊 - 黎明

接下來的這個鏡頭,使用了更加明亮的藍色天空和更高更強烈的陽光:

 維京人村莊 - 陽光普照

下面這個鏡頭降低了陽光的強度,環境光為灰色且不飽和的。主要為環境光照:

 維京人村莊 - 陰天

最後是一張日落時分溫暖靜謐的畫面:

 維京人村莊 - 夕陽

使用這種技術,可以賦予你遊戲非常逼真的時間週期。

Enlighten預先計算

場景中的大部分幾何體都必須是靜態的,實際上,這些大尺寸的幾何體都會參與到GI的計算。在預計算階段,Enlighten會自動將場景分解為數個子系統。去改變如何生成這些子系統是可行的。這些系統被用於預計算大量的並行通道。通道之間是息息相關的,並解決每一個系統的任務。這裡有個圖例闡述維京人村落如何被自動分解成多個子系統。 
視覺化自動產生的Enlighten子系統 

在預計算完成後,系統之間的相互關係就確定了。這可用在執行時減少對於靜態幾何體的限制。在執行時,不同系統之間傳輸的間接光總量是可以控制的。這可以讓你在系統切換實現淡入淡出,用於實現拆除或開門的效果。

Enlighten運行時:

Enlighten可以有效地在手機設備上執行。它可以在一個執行緒中非同步執行(或多個,如果平臺允許)。手機平臺中最突出的是直接光照或動態光照的陰影貼圖需要在GPU中計算。所以手機平臺中只允許少量的動態光照。但即時調整幾何物體的自發光屬性卻幾乎無消耗。Enlighten將自發光的物體作為可見物體計算。這代表自發光物體可以不耗效能產生品質好的陰影,即使在低解析度配備下。

得益於GPU對於直接光照和陰影投射的支援,Enlighten可以很好的實現動態光照,無論是在桌上型電腦系統還是遊戲機,只要是能支援遊戲的系統。

這裡是一個在ARM架構的平板上使用Enlighten的例子。



關於烘焙

對於某些遊戲來說選擇烘焙貼圖可能更合適,所以Unity將來仍會很好的支援和發展烘焙流程。Unity5中光照的輸入參數有:光源、自發光材質及環境光,你可以選擇使用烘焙或者即時GI。選擇烘焙的光照和Unity之前版本有同樣的參數,它將被烘焙成光照貼圖,而動態光照則由Enlighten運行庫來處理。烘焙和即時GI可以無縫接合。

Unity5中也有些新的烘焙特性。其中之一就是光照貼圖被分散成組件形式。每個圖集都包含5個光照貼圖,它們分別是直接光照、間接光照、直接方向光、間接方向光和AO圖(環境光吸收)。烘焙完成後,它們組合成光照貼圖供遊戲使用。在編輯器中可以指定這些圖的融合參數。你可以調整這些選項來適配你最終的輸出效果。例如,你可以很輕易的增加間接照明,這只需要在重新烘焙之前增加一個合成的工作,當然這個工作會花費你數秒鐘的時間。

光照流程

Elighten不僅僅提供遊戲中的即時GI。其中一個很重要的改進就是,Elighten為美術提供了全新的光照流程。當美術需要看到更高品質的細節的時候,它提供了更快的反覆運算模式。它使用反覆運算取代了完全重新的烘焙。不需要使用者的操作,場景會被重新預計算與烘焙的效果替換,而這些預計算與烘焙都是在背景完成的。編輯器會自動檢測場景的改變,並且執行所需的步驟來修復光照。大多數情況下,對光照的反覆運算幾乎是瞬間完成的。

下面是一個使用新的光照流程的影片教學(英文):


什麼類型的遊戲需要用到Enlighten?

之前提過,即時GI的局限性在於大規模的場景設定必須是預先確定的。是追求只適用于高端系統完全動態光照的解決方案,還是覆蓋儘量多的場景並且可以在手機平臺使用達到更廣的市場解決方案,我們只能二選一。在5.0中我們選擇了後者。下面是使用即時GI會存在一定困難的遊戲類型列表:

Q:可以實現開門效果嗎?
A:上文探討過,場景會被自動劃分為子系統,所以這取決於你的門,某些情況下是可以的。而另外一些就要借助腳本了。 (相關腳本會在5.x的版本中發佈)

Q:支持銷毀嗎?
A:Enlighten支援場景中物體的動態透明。這代表遊戲中要被銷毀的物體需要首先被標注。當然這不是最理想的解決方案。(功能會在5.x中提供)

Q:我可以通過串流一塊塊載入關卡嗎?
A:當然,子系統可以通過串流載入。你可以載入你的場景塊,然後手動或者通過腳本載入。(該功能會出現在5.0)

Q:可以使用一些預先做好的模組半自動產生場景嗎?(類似無盡的跑者)
A:可以的,如果預先計算好模組所在位置不同的組合,你可以實現各模組之間的切換。這個就類似於你製作跑酷時的光照烘焙(無縫)。(這裡所需要預計算的API會在5.x中提供)。

Q:可以用程式化建立像是創世神(Minecraft)這樣的遊戲世界嗎?
A:長話短說,不可以。然而我們也在做很多專案,其中使用了Imagination TechnologiesPowerVR Ray Tracing然而來實現GI預覽和混合。這可能是一個備選的方案用來解決由程式或者玩家創建場景的問題。PowerVR Ray Tracing技術支援全動態場景的GI。他不是全即時的,而且開始出現的數幀裡可能會有噪點,但這是一個非常有前景的方向。在允許一定的延遲的情況下,它非常適用於用戶自訂場景的光線渲染。(因項目還在研發階段,暫時還沒有案例)

哪些是Free版,哪些是Pro版所擁有?

這些特性在Free版和Pro版中的界限目前還不清晰,我們會在後續的文章中公佈。

5.0中有哪些?

下面是5.0中的主要功能:


  • 遊戲即時GI組件Enlighten
  • 反覆運算流程(服務於即時GI與烘焙)
  • 反射探針
5.0後續:

由於我們正對光照流程和生成做了很多的改變,其中一些存在一些潛在bug可能會導致5.0的崩潰,後續我們會努力修復。下面這些是在5.x系列週期內會出現的特性:
  • 即時光照和烘焙光照的PowerVR追蹤演算法(查看詳細
  • 控制即時GI子系統間切換的API
  • Enlighten即時立方貼圖
  • GI的即時透明支持
  • 預計算/烘焙的雲/集群計算

更多資料請查看slides for the Unite 2014 talk on GI, video of the Unite 2014 talk on GI, Unite 2014 keynote (graphics part)。(英文)

讓我們知道你們的想法。

來自Unity的Graphics團隊。

沒有留言:

張貼留言

關於我自己

我的相片
Unity台灣官方部落格 請上Facebook搜尋Unity Taiwan取得Unity中文的最新資訊