Unity光照系統(tǒng)的發(fā)展
從早期的Enlighten到Progressive CPU 兜喻,再到Progressive GPU泡仗,從發(fā)展軌跡可以看出埋虹,大家對光照還是偏向光線追蹤算法,認(rèn)為這是未來的發(fā)展方向
Enlighten
Enlighten本身不是光線追蹤算法娩怎,它是一種非常復(fù)雜的數(shù)學(xué)模型算法搔课,而且對美術(shù)制作非常不友好,導(dǎo)致很多人使用Enlighten烘焙都效果不佳截亦。
Enlighten根據(jù)官方所講:2019.4中正式棄用爬泥。
Enlighten核心概念
Systems
Clustering
UV Charts
我們可以把Systems作為Unity讓Enlighten把場景中的部件按照光照和它的距離關(guān)系來構(gòu)建出來一個承接光照的最大單元。我們會看到它的顏色不同崩瓤,代表是不同的System袍啡,這種依存關(guān)系決定Enlighten構(gòu)建的復(fù)雜度。
Enlighten會根據(jù)使用什么材質(zhì)却桶,哪個光照對它有影響境输,它和哪個物體位置比較近,自動構(gòu)建System。構(gòu)建得越復(fù)雜嗅剖,計算量也會越多蛋逾。
Clustering是最核心的Enlighten概念。Enlighten本身光照進(jìn)行照明是不需要計算的窗悯,它計算的是光照環(huán)境。所以構(gòu)建光照環(huán)境時偷拔,才可以創(chuàng)造這些Clustering蒋院。
UV Chart是Lightmap光照貼圖的UV,而構(gòu)建光照環(huán)境最核心的東西是UV Chart莲绰,如果沒有UV Chart欺旧,它就沒有空間可以存儲Clustering作為計算單元。
- 缺點
Enlighten不適合用于植被和樹
一個樹蛤签,有多少片樹葉辞友,就有多少UV Charts,每個UV Chart都要進(jìn)行光照計算震肮,光照計算最低代價是4x4称龙,即4個像素乘4個像素的代價去生成整個計算UV Chart的光照空間。
計算Clustering時戳晌,每個至少保留16個像素鲫尊。如果一棵樹還好,如果有500片葉子钳垮,還可以接受叁丧。如果有一片樹林煤蚌,那就使用Enlighten計算不動了,所以不建議使用Enlighten對樹木進(jìn)行間接光照計算搔驼。
我們需要盡可能的縮減單個物體的Lightmap的UV區(qū)塊來降低UV Charts,在分Lightmap UV時一定要注意侈询,盡可能將UV連在一起舌涨,這樣會讓Enlighten計算量降低。
Clustering基本上用每個色塊作為一個計算單元妄荔,它可以發(fā)射低頻光對周圍進(jìn)行影響泼菌,精度越高,塊越小啦租,整體的計算量就會加大哗伯,整個計算間接光的時間就會更長一些。
Unity光照技術(shù)
- Directional Light篷角、
- Area Light焊刹、
- Spot Light、
- Point Light
- SkyLight
skyLight是Unity很重要的一個功能,這也是很多人烘焙Unity光照最容易出問題的部分虐块。Unity提供Procedural Skybox俩滥,這個Skybox基本上會貢獻(xiàn)整體光照烘焙Lightmap的80%左右,所以如果不會使用SkyLight贺奠,烘培出來的貼圖將效果很差霜旧。
- Light Probe
- Reflection Probe,
用來提升一些特殊效果和優(yōu)化性能的
Unity的光照,必須要講Unity從Gamma空間過渡到線性空間儡率,以及現(xiàn)在一直保留的Gamma空間的支持
線性空間的優(yōu)點是能夠容納更多亮度細(xì)節(jié)挂据,不需要壓縮亮部來提高暗部的效果,亮部的表現(xiàn)力更強(qiáng)儿普,更接近真實的光照效果崎逃。
Procedural Skybox,它重要在哪兒呢眉孩?
因為它提供了光照个绍。我們自然界中光照有兩個非常重要的概念,一個概念是它有大氣的厚度浪汪,大氣厚度決定色散的情況巴柿,對光線的反映。
Sky Tint主要用來計算天空的染色情況吟宦,如果空氣密度很高篮洁,整個天空又染上一些色,它對光線的反應(yīng)情況殃姓。正常情況下袁波,對地球的Sky Tint,只有沙塵暴時才會出現(xiàn)比較奇怪的效果蜗侈,如果沒有沙塵暴的情況下篷牌,地球的Sky Tint值比較接近灰度的顏色。
如果在制作異星題材的游戲的話踏幻,情況就不太一樣枷颊,你可能要根據(jù)顏色的調(diào)整,讓大氣做一些吸收该面,這樣折算出來的Sky Light會發(fā)生一些改變夭苗。
Ground基本上是Skybox在模擬地面對物體的影響,如果值很強(qiáng)會讓地面失去立體感隔缀,計算時底部的光照會很強(qiáng)题造,導(dǎo)致天花板的區(qū)域變亮。所以這個值不要調(diào)得特別的高猾瘸,基本上以灰度為主界赔。
Exposure曝光度的值非常重要丢习,它是天光的強(qiáng)度,基本上可以達(dá)到8或更高的倍數(shù)淮悼,它可以讓整個天光變得更強(qiáng)咐低,更強(qiáng)的結(jié)果是整個Skybox會非常強(qiáng)。好處是帶來更多間接光的強(qiáng)度袜腥,但也會帶來讓受光比較多的地方產(chǎn)生過曝的問題见擦,這是大家需要控制的。
關(guān)于Exposure曝光度羹令,建議大家可以跟Atmosphere厚度的值一起調(diào)整锡宋。如果曝光度增強(qiáng)的時候,可以將大氣密度提高特恬,它會形成比較奇怪的現(xiàn)象。在大氣足夠密的情況下徐钠,曝光度很強(qiáng)癌刽,大氣密度底部會對光線的吸收特別的強(qiáng),會發(fā)生右側(cè)圖片發(fā)紅的情況尝丐,這樣會計算出一些接近于早晨显拜、晚上的效果。
像左側(cè)這張圖爹袁,基本上它的大氣密度值在1远荠,Exposure值在3,而值在2是另一種效果失息,它的厚度值在2時譬淳,產(chǎn)生了色彩上的變化,這個變化是在模擬物理的效果盹兢。
Directional Light在移動游戲開發(fā)中常常用作太陽和月亮的首選光源邻梆,因為它能夠覆蓋整個場景,計算的時候非常節(jié)省性能绎秒。
直接光強(qiáng)度在線性空間下浦妄,我們建議白天為1.5-2.0,夜晚為0.4-1.0见芹。Indirect Multiplier值剂娄,白天為0.6-1.0,夜晚為0.3-0.7玄呛。白天獲得的直接光照比晚上的要強(qiáng)阅懦,這樣白天會產(chǎn)生更好的間接光亮度。
我們看一看烘焙的效果把鉴。如上圖所示故黑,在白天的設(shè)置下儿咱,Intensity是1.8,Indirect Multiplier是1场晶,Atmosphere Thickness是1混埠,Exposure是3,這樣我們獲得了白天光照很好的房間诗轻。
如果設(shè)置正確钳宪,它應(yīng)該會出現(xiàn)很好的GI效果,而且不會之前認(rèn)為扳炬,在Unity光照中吏颖,有些暗部和間接光不是很好,缺乏全局照明的層次感恨樟。
上圖就是夜晚的設(shè)置效果半醉。在設(shè)置中,Intensity是0.4劝术,Indirect Multiplier是0.25,Atmosphere Thickness是1养晋,Exposure是0.1衬吆,基本上設(shè)置的數(shù)值都會往下降灯谣。特別是降低曝光度后,我們會得到月光的效果蛔琅,但是它也有間接照明胎许。
上圖是人造光源的效果。Unity提供的除了常用的Point Light罗售、Spot Light辜窑,還有一個就是Emissive自照明。Unity支持物體的像素照明寨躁,可以將物體的Emissve HDR值提高穆碎,提高以后就形成一個光源。
像燈管基本上就是一個Emissve照明的效果职恳,它對房間進(jìn)行了增強(qiáng)和補(bǔ)亮所禀。為了體現(xiàn)夜晚效果的疊加方面,上圖設(shè)置沒有調(diào)得特別強(qiáng),如果你希望更亮一些色徘,可以在上面增加Area Light恭金,進(jìn)行補(bǔ)光。
如下圖所示褂策,我們可以看到Area Light關(guān)掉和開啟的效果對比横腿。
Area Light主要用途是什么呢?
如果大家比較觀察細(xì)節(jié)斤寂,可以發(fā)現(xiàn)窗戶的采光耿焊,除了太陽光照,有可能窗戶外面世界亮的東西遍搞,都會發(fā)射光線進(jìn)入房間罗侯。但是在計算機(jī)不會這樣計算。因此溪猿,我們需要在窗戶邊上做一個同樣大小的Area Light歇父,往房間里面補(bǔ)光。
在補(bǔ)光之后再愈,你會看到,尤其是在光照貼圖的一側(cè)护戳,Area Light關(guān)掉和開啟會有明顯的視覺效果差異翎冲。這是因為右側(cè)的區(qū)域沒有Area Light,它不是非常仿真物理效果媳荒,如果加了Area Light抗悍,它會很仿真物理。
光照貼圖的一個問題是钳枕,它們做的都是間接光缴渊,間接光一定不能將光照貼圖曝掉,或者曝光度嚴(yán)重不足鱼炒。所以我們需要一個間接光的空間去存儲這些間接光信息衔沼。
如上圖所示,如果間接光非常的亮昔瞧,會導(dǎo)致我們看到的最右側(cè)的圖像效果指蚁。曝光那么多的時候,間接光貼圖就損失掉了自晰。
我們建議把Light Intensity設(shè)為1.8凝化,HDR Exposure為16,或者Intensity等于3酬荞,HDR Exposure為16的曝光度效果搓劫。這樣既能保證場景的亮度瞧哟,又能讓整體光照沒什么問題。
烘焙
- 什么是烘焙
- 該如何烘焙
你設(shè)置了很多烘培枪向,但基于性能考慮可能不需要那么多物體需要烘培勤揩,不優(yōu)化會導(dǎo)致場景中很多不需要烘培的物體烘培了光照貼圖。
烘培完成后遣疯,光照貼圖可能會非常大雄可,特別對于一些移動游戲,沒辦法使用那么多貼圖缠犀,所以正確的烘培也是非常重要的数苫。
- Enlighten系統(tǒng)
首先說一下Unity的Enlighten系統(tǒng),它的一個優(yōu)點是支持實時光GI辨液。在構(gòu)建過程中虐急,構(gòu)建光照條件后,我們可以調(diào)節(jié)光照的強(qiáng)度和方向滔迈,還可以移動光源止吁。
但是它不能移動物體。如果靜態(tài)模型要移動燎悍,Enlighten實時GI是不支持的敬惦,因為它需要構(gòu)建光照環(huán)境,這就限制了Enlighten不是一個純實時的GI谈山,它是半實時的俄删。
如果Enlighten使用不好,烘培速度會非常慢奏路,我們通常會發(fā)現(xiàn)烘培卡在一個地方不動畴椰,慢到都想把電腦砸了,這種情況非常常見鸽粉。所以大家必須按照Enlighten正確的方法去烘培才會比較快斜脂。
Enlighten好處是噪點控制非常好,如上圖所示触机,畫面的邊緣沒有太多的噪點帚戳,因為Enlighten的計算方式是不太會出現(xiàn)噪點的,它不是光線追蹤算法儡首,也不依賴于光子彈射销斟。
Unity 5開始集成Enlighten,但Unity 2020 LTS版將是在內(nèi)置渲染器包含Enlighten系統(tǒng)的最后一個版本椒舵,Unity 2021.1將完全移除Enlighten蚂踊。
- Progressive烘焙
Progressive烘焙基于光線追蹤,發(fā)射的一個光子彈射了多少次笔宿,彈射時分裂多少光子犁钟,再進(jìn)行彈射棱诱。
Progressive的優(yōu)點是:真實、GPU烘焙涝动、烘培速度快迈勋。在同等的模型數(shù)量下,Progressive的計算速度比Enlighten快很多醋粟。Progressive的缺點是噪點控制比較差靡菇,當(dāng)光子發(fā)射量不夠時,它無法充滿整個場景米愿,因此無法計算出正確的光照厦凤。 -
Progressive和Enlighten區(qū)別
Progressive和Enlighten的烘培時間基本上是相等的。Progressive會有一些斑點育苟,Enlighten幾乎沒有斑點较鼓。但Enlighten的問題的缺乏細(xì)節(jié),效果過于程序化违柏。如果這是一個深邃的洞穴博烂,過渡到最后面畫面會變成黑色,幾乎沒有了漱竖。
我們提高Progressive的計算光子時烘培效果對比禽篱。Progressive會更加立體,更真實一些馍惹,Enlighten比較輕一些躺率,或者說立體感不是那么足。
這是Progressive和Enlighten烘培后整體的預(yù)覽效果讼积,差異還是比較明顯的
這是一些烘培參數(shù),當(dāng)Direct Samples=40和Indirect Samples=400脚仔,對比Direct Samples=100和Indirect Samples=800勤众,我們可以看到效果差異明顯。
Direct Samples和Indirect Samples等同于直接光的采樣數(shù)量和間接光的采樣數(shù)量鲤脏。如果采樣越多们颜,光子出現(xiàn)得越多,它就會將整個環(huán)境填得更加均勻猎醇,更加符合真實的世界窥突。
真實世界的光子是無限的,在計算機(jī)模擬的時候是靠光子的數(shù)量來模擬的硫嘶,所以我們盡可能在烘培的時候要把光子數(shù)量提高阻问,這樣會得到較好的效果。
使用Progressive時最大的問題是:在室內(nèi)的情況下沦疾,要盡可能把整個烘培的精度提高称近,因為室內(nèi)低頻光比較多第队,間接光受到的影響比較多,室外可以稍微降低該值刨秆,提高烘焙效率凳谦。
Unity光照方案
移動游戲方面,建議大家使用混合光照技術(shù)衡未,效率更高和更為逼真尸执。近景可以使用動態(tài)陰影,遠(yuǎn)景使用Shadow Mask缓醋,這樣可以降低Shadow Pass的壓力如失。
例如:5-20米是使用動態(tài)陰影,遠(yuǎn)景全部使用Shadow Mask改衩,這樣手機(jī)平臺上既可以獲得動態(tài)陰影岖常,又可以獲得高的性能,不至于手機(jī)玩一會兒就會很燙的情況發(fā)生葫督。
我們看一看混合光照的拆分情況竭鞍。
如上圖所示,Baked Lightmap和Shadow Mask在烘培后橄镜,一個是RGB通道的圖偎快,另一個是單通道。如果大家有能力修改洽胶,我們可以將單通道的圖變成四通道來進(jìn)行變化晒夹。
我們烘焙一個Lightmap的時候,Shadow Mask可以烘培四個時間段姊氓,例如:8點丐怯、11點、15點翔横、17點读跷。烘培完成后,我就可以通過Lit的方式把它Lit成變化禾唁,使它有間接光照效览。
Lightmap只使用一套,但我們可以對它進(jìn)行擴(kuò)展荡短。Shadow Mask根據(jù)晝夜變化的時間丐枉,做成四套帶有間接光照的,這樣便可以根據(jù)項目進(jìn)行深度的改進(jìn)掘托。