Unite 2019|Unity的光照烘焙技術(上)

遊資網發表於2019-08-16
本文將分享Unity的技術美術李萬里在Unite Shanghai 2019大會的演講內容,他將深入淺出的帶領你瞭解Unity的光照烘焙技術。

Unite 2019|Unity的光照烘焙技術(上)

演講內容

今天很高興和大家分享我工作這麼多年來對Unity光照的理解和認識。

首先我將介紹一些概念,然後慢慢的深入給大家講解,如何使用Unity的Progressive工具去正確的烘焙光照以及設定一些光照。

為什麼談談Unity光照呢?

因為我發現很多客戶對Unity的光照烘焙技術瞭解都存在問題。他們認為Unity的光照不好,沒有別的引擎效果好,或者存在其它的問題。但大家通過參加Unite 2019大會,看到了不少Unity高品質的一些畫質。

本次演講,我將主要給大家分享在Unity的內建渲染管線和輕量級渲染管線LWRP下,如何正確烘焙光照。

Unite 2019|Unity的光照烘焙技術(上)

Unity的光照和烘焙是每個製作遊戲的人都非常重視的,因為它的效果決定了遊戲品質。

前些年,由於受困於效能限制,很多使用Unity開發的遊戲是沒有光照的,主要是靠手繪貼圖。由於計算效能的提高和移動平臺的高效能,現在我們可以製作出前幾年主機平臺上的遊戲品質。

所以光照烘焙在遊戲開發者領域是一個越來越重要的問題,這也是越來越多公司通過招聘技術美術來提升畫質的重要原因。

Unite 2019|Unity的光照烘焙技術(上)

Unity的光照基本上就是分三種:從早期的Enlighten到Progressive CPU,再到Progressive GPU,從發展軌跡可以看出,大家對光照還是偏向光線追蹤演算法,認為這是未來的發展方向。

因為Enlighten本身不是光線追蹤演算法,它是一種非常複雜的數學模型演算法,而且對美術製作非常不友好,導致很多人使用Enlighten烘焙都效果不佳。

Unite 2019|Unity的光照烘焙技術(上)

我們說了Unity光照,就不得不說Unity的光照技術。

主光源是:Directional Light、Area Light、Spot Light、Point Light。基本上是目前遊戲開發的主流光照,Directional Light和Area Light是使用得最多的,其次是Spot Light常常用於人造光源和特效光源。

SkyLight是Unity很重要的一個功能,這也是很多人烘焙Unity光照最容易出問題的部分。Unity提供Procedural Skybox,這個Skybox基本上會貢獻整體光照烘焙Lightmap的80%左右,所以如果不會使用SkyLight,烘培出來的貼圖將效果很差。

最後是Light Probe和Reflection Probe,它們是用來提升一些特殊效果和優化效能的。

Unite 2019|Unity的光照烘焙技術(上)

說到Unity的光照,我們不得不提到一點:Unity從Gamma空間過渡到線性空間,以及現在一直保留的Gamma空間的支援,是為了一些老的專案有版本升級的可持續性,但未來Gamma空間將被淘汰掉。

線性空間的優點是能夠容納更多亮度細節,不需要壓縮亮部來提高暗部的效果,亮部的表現力更強,更接近真實的光照效果。由於當年OpenGL ES 2.0時代的整個計算能力有限,所以Gamma空間進行了一些壓縮。

Unite 2019|Unity的光照烘焙技術(上)

我們看一下上面這張圖,這就是Procedural Skybox,它重要在哪兒呢?

因為它提供了光照。我們自然界中光照有兩個非常重要的概念,一個概念是它有大氣的厚度,大氣厚度決定色散的情況,對光線的反映。

Sky Tint主要用來計算天空的染色情況,如果空氣密度很高,整個天空又染上一些色,它對光線的反應情況。正常情況下,對地球的Sky Tint,只有沙塵暴時才會出現比較奇怪的效果,如果沒有沙塵暴的情況下,地球的Sky Tint值比較接近灰度的顏色。

如果在製作異星題材的遊戲的話,情況就不太一樣,你可能要根據顏色的調整,讓大氣做一些吸收,這樣折算出來的Sky Light會發生一些改變。

Ground基本上是Skybox在模擬地面對物體的影響,如果值很強會讓地面失去立體感,計算時底部的光照會很強,導致天花板的區域變亮。所以這個值不要調得特別的高,基本上以灰度為主。

Exposure曝光度的值非常重要,它是天光的強度,基本上可以達到8或更高的倍數,它可以讓整個天光變得更強,更強的結果是整個Skybox會非常強。好處是帶來更多間接光的強度,但也會帶來讓受光比較多的地方產生過曝的問題,這是大家需要控制的。

關於Exposure曝光度,建議大家可以跟Atmosphere厚度的值一起調整。如果曝光度增強的時候,可以將大氣密度提高,它會形成比較奇怪的現象。在大氣足夠密的情況下,曝光度很強,大氣密度底部會對光線的吸收特別的強,會發生右側圖片發紅的情況,這樣會計算出一些接近於早晨、晚上的效果。

像左側這張圖,基本上它的大氣密度值在1,Exposure值在3,而值在2是另一種效果,它的厚度值在2時,產生了色彩上的變化,這個變化是在模擬物理的效果。

Unite 2019|Unity的光照烘焙技術(上)

Directional Light在移動遊戲開發中常常用作太陽和月亮的首選光源,因為它能夠覆蓋整個場景,計算的時候非常節省效能。

直接光強度線上性空間下,我們建議白天為1.5-2.0,夜晚為0.4-1.0。Indirect Multiplier值,白天為0.6-1.0,夜晚為0.3-0.7。白天獲得的直接光照比晚上的要強,這樣白天會產生更好的間接光亮度。

Unite 2019|Unity的光照烘焙技術(上)

我們看一看烘焙的效果。如上圖所示,在白天的設定下,Intensity是1.8,Indirect Multiplier是1,Atmosphere Thickness是1,Exposure是3,這樣我們獲得了白天光照很好的房間。

如果設定正確,它應該會出現很好的GI效果,而且不會之前認為,在Unity光照中,有些暗部和間接光不是很好,缺乏全域性照明的層次感。

Unite 2019|Unity的光照烘焙技術(上)

上圖就是夜晚的設定效果。在設定中,Intensity是0.4,Indirect Multiplier是0.25,Atmosphere Thickness是1,Exposure是0.1,基本上設定的數值都會往下降。特別是降低曝光度後,我們會得到月光的效果,但是它也有間接照明。

Unite 2019|Unity的光照烘焙技術(上)

上圖是人造光源的效果。Unity提供的除了常用的Point Light、Spot Light,還有一個就是Emissive自照明。Unity支援物體的畫素照明,可以將物體的Emissve HDR值提高,提高以後就形成一個光源。

像燈管基本上就是一個Emissve照明的效果,它對房間進行了增強和補亮。為了體現夜晚效果的疊加,上圖設定沒有調得特別強,如果你希望更亮一些,可以在上面增加Area Light,進行補光。

如下圖所示,我們可以看到Area Light關掉和開啟的效果對比。

Unite 2019|Unity的光照烘焙技術(上)

Area Light主要用途是什麼呢?

如果大家比較觀察細節,可以發現窗戶的採光,除了太陽光照,有可能窗戶外面世界亮的東西,都會發射光線進入房間。但是在計算機不會這樣計算。因此,我們需要在窗戶邊上做一個同樣大小的Area Light,往房間裡面補光。

在補光之後,你會看到,尤其是在光照貼圖的一側,Area Light關掉和開啟會有明顯的視覺效果差異。這是因為右側的區域沒有Area Light,它不是非常模擬物理效果,如果加了Area Light,它會很模擬物理。

Unite 2019|Unity的光照烘焙技術(上)

光照貼圖的一個問題是,它們做的都是間接光,間接光一定不能將光照貼圖曝掉,或者曝光度嚴重不足。所以我們需要一個間接光的空間去儲存這些間接光資訊。

如上圖所示,如果間接光非常的亮,會導致我們看到的最右側的影象效果。曝光那麼多的時候,間接光貼圖就損失掉了。

我們建議把Light Intensity設為1.8,HDR Exposure為16,或者Intensity等於3,HDR Exposure為16的曝光度效果。這樣既能保證場景的亮度,又能讓整體光照沒什麼問題。

Unite 2019|Unity的光照烘焙技術(上)

瞭解一些Unity光照概念後,我們應該如何烘培呢?

如果你設定了很多烘培,但基於效能考慮可能不需要那麼多物體需要烘培,不優化會導致場景中很多不需要烘培的物體烘培了光照貼圖。

烘培完成後,光照貼圖可能會非常大,特別對於一些移動遊戲,沒辦法使用那麼多貼圖,所以正確的烘培也是非常重要的。

Unite 2019|Unity的光照烘焙技術(上)

首先說一下Unity的Enlighten系統,它的一個優點是支援實時光GI。在構建過程中,構建光照條件後,我們可以調節光照的強度和方向,還可以移動光源。

但是它不能移動物體。如果靜態模型要移動,Enlighten實時GI是不支援的,因為它需要構建光照環境,這就限制了Enlighten不是一個純實時的GI,它是半實時的。

如果Enlighten使用不好,烘培速度會非常慢,我們通常會發現烘培卡在一個地方不動,慢到都想把電腦砸了,這種情況非常常見。所以大家必須按照Enlighten正確的方法去烘培才會比較快。

Enlighten好處是噪點控制非常好,如上圖所示,畫面的邊緣沒有太多的噪點,因為Enlighten的計算方式是不太會出現噪點的,它不是光線追蹤演算法,也不依賴於光子彈射。

Unity 5開始整合Enlighten,但Unity 2020 LTS版將是在內建渲染器包含Enlighten系統的最後一個版本,Unity 2021.1將完全移除Enlighten。

Unite 2019|Unity的光照烘焙技術(上)

Progressive烘焙基於光線追蹤,發射的一個光子彈射了多少次,彈射時分裂多少光子,再進行彈射。

Progressive的優點是:真實、GPU烘焙、烘培速度快。在同等的模型數量下,Progressive的計算速度比Enlighten快很多。Progressive的缺點是噪點控制比較差,當光子發射量不夠時,它無法充滿整個場景,因此無法計算出正確的光照。

Unite 2019|Unity的光照烘焙技術(上)

如上圖所示,我們來看看Progressive和Enlighten的烘培的差異。

Progressive和Enlighten的烘培時間基本上是相等的。Progressive會有一些斑點,Enlighten幾乎沒有斑點。但Enlighten的問題的缺乏細節,效果過於程式化。如果這是一個深邃的洞穴,過渡到最後面畫面會變成黑色,幾乎沒有了。

Unite 2019|Unity的光照烘焙技術(上)

如上圖所示,這是我們提高Progressive的計算光子時烘培效果對比。Progressive會更加立體,更真實一些,Enlighten比較輕一些,或者說立體感不是那麼足。

Unite 2019|Unity的光照烘焙技術(上)

如上圖所示,這是Progressive和Enlighten烘培後整體的預覽效果,差異還是比較明顯的。

Unite 2019|Unity的光照烘焙技術(上)

如上圖所示,這是一些烘培引數,當Direct Samples=40和Indirect Samples=400,對比Direct Samples=100和Indirect Samples=800,我們可以看到效果差異明顯。

Direct Samples和Indirect Samples等同於直接光的取樣數量和間接光的取樣數量。如果取樣越多,光子出現得越多,它就會將整個環境填得更加均勻,更加符合真實的世界。

真實世界的光子是無限的,在計算機模擬的時候是靠光子的數量來模擬的,所以我們儘可能在烘培的時候要把光子數量提高,這樣會得到較好的效果。

使用Progressive時最大的問題是:在室內的情況下,要儘可能把整個烘培的精度提高,因為室內低頻光比較多,間接光受到的影響比較多,室外可以稍微降低該值,提高烘焙效率。

現在談談Unity的光照方案。

Unite 2019|Unity的光照烘焙技術(上)

移動遊戲方面,建議大家使用混合光照技術,效率更高和更為逼真。近景可以使用動態陰影,遠景使用Shadow Mask,這樣可以降低Shadow Pass的壓力。

例如:5-20米是使用動態陰影,遠景全部使用Shadow Mask,這樣手機平臺上既可以獲得動態陰影,又可以獲得高的效能,不至於手機玩一會兒就會很燙的情況發生。

我們看一看混合光照的拆分情況。

Unite 2019|Unity的光照烘焙技術(上)

如上圖所示,Baked Lightmap和Shadow Mask在烘培後,一個是RGB通道的圖,另一個是單通道。如果大家有能力修改,我們可以將單通道的圖變成四通道來進行變化。

我們烘焙一個Lightmap的時候,Shadow Mask可以烘培四個時間段,例如:8點、11點、15點、17點。烘培完成後,我就可以通過Lit的方式把它Lit成變化,使它有間接光照。

Lightmap只使用一套,但我們可以對它進行擴充套件。Shadow Mask根據晝夜變化的時間,做成四套帶有間接光照的,這樣便可以根據專案進行深度的改進。

小結

受篇幅限制,我們將本次演講內容分為上下二篇。在下一篇中,我們將分享不同的場景案例如何進行光照烘培的優化。


來源:Unity官方平臺
原地址:https://mp.weixin.qq.com/s/k9QNzM4QfEuCCiej_nDtPg

相關文章