1. 程式人生 > >Unity中Light Probe詳解

Unity中Light Probe詳解

本文節選自洪流學堂公眾號專欄《鄭洪智的Unity2018課》,未經允許不可轉載。

洪流學堂公眾號回覆光照探頭,獲取本文對應的視訊實戰教程。


洪流學堂,讓你快人幾步。你好,我是鄭洪智。

Unity的預計算實時GI或者烘焙照明只對靜態的物體起作用,對於可移動的物體,需要用一種新的技術來解決光照問題。

為了讓動態物體(如互動式場景元素或角色)能夠獲得靜態物體反彈的光線,需要將這些光照資訊記錄下來,並且在執行時能快速讀取和使用。

通過在場景中放置取樣點捕捉各個方向的光線來實現動態物體接收間接光的功能。這些取樣點記錄的光照資訊被編碼成可以在遊戲過程中快速計算值。在Unity中,我們將這些取樣點稱為“光照探頭”。

Light Probe(光照探頭)

這個技術是讓動態物體從場景接收間接光的有效方法。儘管使用該技術的動態物體不會產生反射光,但通常這沒有什麼明顯的影響。因為探測照明的物體往往是較小的物體,能反射的光很少,對周圍環境的影響很有限。

什麼是Probe Lighting(探測照明)?

探測照明是一種用於實時渲染的高階照明技術,常用於場景中的角色或非靜態(Static)物體的照明。探測照明執行時效率非常高並且預計算也很快。

探測照明通過3D空間中的探頭對入射光進行取樣並將這些資訊通過球諧函式編碼處理後儲存成檔案。這些資訊佔用的儲存空間很少並且在執行時解碼非常快。場景中的Shader可以使用這些資訊來模擬物體表面的光照。

當然了,有優勢也會有相應的劣勢。在一定的計算量下,探測照明很難表現變化複雜的照明效果。但是如果增加模擬精度,計算代價也會隨之增高。基於效能的考慮,Unity限制了計算的精度。另外一個,由於一個3D位置只用了一個球來進行模擬,在大模型以及較平的模型表面上的光照效果可能會不太好。

除去這些限制,探測照明在小的、凸狀的物體上有很好的效果,同時效能很好。

放置Light Probe

非靜態物體根據距離最近的探頭來接收光照。光照探頭會將整個空間劃分成一個個四面體,一個物體最終從哪個探頭讀取光照資料這個物體最終落在哪一個四面體中確定的。為了能夠形成這些四面體,探頭在擺放時必須形成三維的立體形狀或者籠子的形狀(不能只在一個平面上擺放)。

光照探頭在編輯器中顯示為球體

探測照明在執行時耗費的資源很少並且預計算也很快。但是,為了儘可能優化效能,在擺放光照探頭時也有一些注意事項。

  • 以整齊的密集網格排列會減少擺放時的工作量,但是這樣會造成很多探頭的浪費,因為很多探頭在相近的位置接收到的光照都類似,在相似的光照位置,只需要一個或幾個探頭就足夠了。
  • 為了提高探頭的效率,應該在光照變化比較大的地方多放置探頭,在光照變化不大的地方少放探頭。比如應該在從明亮到陰影的過渡位置多放探頭,在反射光較強烈的表面多放置探頭,在大的平面上少放探頭。

設定Light Probe的步驟如下:

  • 首先從GameObject選單(GameObject > Light > Light Probe Group)建立一個Light Probe Group。
  • 現在我們將開始放置探頭。在Hierarchy中選擇新建立的Light Probe Group。

  • 在Inspector中,在Light Probe Group元件中選擇“Edit Light Probes ”。

  • 預設創建出來Light Probe Group有8個探頭組成了一個立方體,你可以選中一個小黃球,移動重新擺放這些探頭,也可以刪除所有的探頭重新建立。
  • 選中一個探頭,按Ctrl + D(Mac上的Cmd + D)可以複製一個出來,然後使用Move Tool(W)移動探頭。
  • 一般來說,放置探頭在Y軸至少要放置兩層(上文提到了探頭需要組成三維立體或籠子形狀),接近地面的區域可以多放置一些,空中可以少放置一些

這樣的垂直佈置光照探頭的原因是為了能夠從角色的頭部高度或更高的空中接收從地面反射的間接光。當我們在場景複製這些光照探頭來組成四面體時,確保任何物體都能落入四面體內。探頭之間繪製的洋紅線可以視覺化這些四面體。

圖中顯示了光照探頭的位置和它們位置之間構成的四面體。

可以通過Ctrl+點選多選或框選,選擇多個探頭進行復制並佈置。將複製出來的探頭移動到場景中光照“敏感”的區域。

光照“敏感”的區域有哪些呢?

尋找光影變化的區域,或者材質顏色變化較大的區域。記住,我們的目標是在整個場景中取樣。為了保證新增的光照探頭是合理的,我們需要確保它正在取樣的地方照明有明顯的變化。如果使用光照探頭來取樣沒有特點或其他探頭已取樣過的區域,那麼當動態物體通過這些探頭獲取光照資訊時,不會看到太多變化,所以這些探頭也沒什麼必要。基於遊戲優化方面的考慮,我們應該儘可能讓放進去場景的東西發揮一定的作用。

  • 重複複製探頭並將它們放置在合適的位置,直到所有探頭形成的稀疏籠式佈局,覆蓋玩家可到達的區域。
  • 在放置探頭時,記住檢查最底端的探頭是否高於地面(在地面以下可能會造成地面上的物體光照資訊錯誤)。

一個場景中可以建立多個Light Probe Group,比如一個光影複雜的城市中使用一個較密集的Light Probe Group,城市周邊使用一個較稀疏的Light Probe Group。場景中有多個Light Probe Group時,Unity在執行時會將這些Group自動合併,並且會移除位置重複的Probe。

如圖中有兩個Light Probe Group,一個探頭稠密用於較複雜的區域,一個探頭稀疏用於簡單的周邊環境

預計算完成後,我們才能看見光照探頭對場景中物體的作用。如果Lighting視窗中的Auto Generate複選框是選中的,預計算會自動開始;如果沒有選中,可以點選右側的Generate Lighting來啟動預計算。

計算完成後,你就能看到場景中的非靜態物體上的燈光和整個場景更契合了。

在GI烘焙中,大量的小物體會增加非常多的計算量,但是這些小物體反射的光基本上對場景沒有影響。所以如果能將這些小物體排除在外,只接收間接光,不反射光,可以將預計算的時間減少很多。這也是光照探頭針對GI的一個優化點。

物體Renderer上的Light Probe

Light Probe與計算完畢後,選中一個非Static的物體,你可以在場景中看到:

圖中顯示了包圍物體的4個Probe

如果沒有顯示成上圖那樣,Lighting面板的Debug Settings按下圖所示設定。

還記得MeshRenderer中關於Light Probe的設定麼?(通常保持預設值即可)

  • Off 不使用Light Probe,即不會從Probe中獲取光照資訊
  • Blend Probes 預設值。使用混合後的Probe。
  • Use Proxy Volume 用到的較少。當大的物體使用Blend Probes光照效果不好時,可以嘗試使用。具體用法可以參考官方文件
    Custom Provided 用於在Shader中自定義Probe,後面Shader模組會講到。

總結

今天學習了使用Unity中的光照系統中的Light Probe,希望你能記住以下幾點:

  • Light Probe能給動態物體提供高質量光照
  • 放置Light Probe時儘量放到光影變化多的地方

今日思考題

構建一個簡單場景,在烘焙GI的基礎上,新增Light Probe和動態物體,看看動態物體的效果如何~
歡迎在留言區分享你的收穫,和大家一起討論。

別忘了分享給你學Unity的朋友,也許能夠幫到他。

洪流學堂公眾號回覆光照探頭,獲取本文對應的視訊實戰教程。



《鄭洪智的Unity2018課》,傾盡我8年的開發經驗,結合最新的Unity2018,帶你從入門到精通。