Unity的光照烘焙技術(shù)摘選
這篇文章是整理自Unity的技美李萬(wàn)里在unite 2019大會(huì)上的光照技術(shù)分享,這次分享的內(nèi)容是
“在Unity的內(nèi)置渲染管線(xiàn)和輕量級(jí)渲染管線(xiàn)LWRP下,如何正確烘焙光照”
雖然已經(jīng)過(guò)去了幾年的時(shí)間,Unity的發(fā)展方向也是逐漸要用URP來(lái)替代內(nèi)置渲染管線(xiàn),但是個(gè)人認(rèn)為有些內(nèi)容對(duì)URP和HDRP的光照也是具有指導(dǎo)意義的。
procedural skybox:
在Enlighten當(dāng)中,千萬(wàn)不要使用漸變和顏色進(jìn)行烘焙,兩者烘焙出來(lái)的東西會(huì)比較風(fēng)格化,并不寫(xiě)實(shí)。有很多人選擇用某個(gè)顏色烘漸變,但效果會(huì)非常不理想,所以一般選擇Skybox進(jìn)行烘焙,而Skybox一般使用Procedural Skybox。
烘焙完后,再替換為自己場(chǎng)景的風(fēng)格化Skybox作為最終顯示效果。Procedural Skybox是僅用于烘焙的,不是用于制作最終的Skybox效果。
我們?cè)倥e一個(gè)簡(jiǎn)單的例子。如果要形成一個(gè)特別頹廢和壓抑的環(huán)境,我們可以將大氣密度提到很高,然后將染色降一下,或者偏向一個(gè)色彩。
我們可以將整個(gè)曝光度調(diào)低,把大氣密度調(diào)高,實(shí)現(xiàn)讓人很壓抑的環(huán)境,這種環(huán)境烘焙出來(lái)的Lightmap比較接近于比較邪惡的地方,從而獲得更加壓抑的光照效果。
剛開(kāi)始進(jìn)行學(xué)習(xí)的時(shí)候,很多人會(huì)為了方便去直接用漸變和顏色的方式去進(jìn)行環(huán)境光的設(shè)置,但這樣簡(jiǎn)單粗暴的方式會(huì)帶來(lái)誤導(dǎo),不能系統(tǒng)化的去理解整個(gè)光照系統(tǒng),制作不同的場(chǎng)景每次都要通過(guò)反復(fù)烘焙測(cè)試來(lái)獲得理想的環(huán)境光,效率較低。
光照貼圖的曝光:
光照貼圖的一個(gè)問(wèn)題是,它們做的都是間接光,間接光一定不能將光照貼圖曝掉,或者曝光度嚴(yán)重不足。所以我們需要一個(gè)間接光的空間去存儲(chǔ)這些間接光信息。
如上圖所示,如果間接光非常的亮,會(huì)導(dǎo)致我們看到的最右側(cè)的圖像效果。曝光那么多的時(shí)候,間接光貼圖就損失掉了。
這一點(diǎn)建議對(duì)于初學(xué)者來(lái)說(shuō)比較重要,烘焙之后要注意觀(guān)察光照貼圖是否過(guò)曝,如果過(guò)曝,烘焙出來(lái)的GI信息等于都浪費(fèi)和丟失了,要通過(guò)其他方式去提亮而不是一味的加強(qiáng)燈光強(qiáng)度,實(shí)際項(xiàng)目中光照貼圖過(guò)曝的話(huà),在移動(dòng)平臺(tái)上還會(huì)引起光照貼圖顯示錯(cuò)誤的問(wèn)題。
正確的烘培:
Progressive烘焙基于光線(xiàn)追蹤,發(fā)射的一個(gè)光子彈射了多少次,彈射時(shí)分裂多少光子,再進(jìn)行彈射。
Progressive的優(yōu)點(diǎn)是:真實(shí)、GPU烘焙、烘培速度快。在同等的模型數(shù)量下,Progressive的計(jì)算速度比Enlighten快很多。Progressive的缺點(diǎn)是噪點(diǎn)控制比較差,當(dāng)光子發(fā)射量不夠時(shí),它無(wú)法充滿(mǎn)整個(gè)場(chǎng)景,因此無(wú)法計(jì)算出正確的光照。
這部分原文是在對(duì)比enlighten和progresssive的區(qū)別,通過(guò)這些內(nèi)容,我們可以知道提高progresssive的烘焙精度,主要是要去提高直接采樣和間接采樣的參數(shù)(
Direct Samples和Indirect Samples)
光照和陰影的優(yōu)化:
移動(dòng)游戲方面,建議大家使用混合光照技術(shù),效率更高和更為逼真。近景可以使用動(dòng)態(tài)陰影,遠(yuǎn)景使用Shadow Mask,這樣可以降低Shadow Pass的壓力。
例如:5-20米是使用動(dòng)態(tài)陰影,遠(yuǎn)景全部使用Shadow Mask,這樣手機(jī)平臺(tái)上既可以獲得動(dòng)態(tài)陰影,又可以獲得高的性能,不至于手機(jī)玩一會(huì)兒就會(huì)很燙的情況發(fā)生。
關(guān)于陰影的優(yōu)化,在項(xiàng)目初期就要有一個(gè)合理的規(guī)劃,使用哪種光照方案和模式,否則很容易在中期因?yàn)樾薷倪@些標(biāo)準(zhǔn)導(dǎo)致大范圍的返工和重制。
我們可以把Systems作為Unity讓Enlighten把場(chǎng)景中的部件按照光照和它的距離關(guān)系來(lái)構(gòu)建出來(lái)一個(gè)承接光照的最大單元。我們會(huì)看到它的顏色不同,代表是不同的System,這種依存關(guān)系決定Enlighten構(gòu)建的復(fù)雜度。
Enlighten會(huì)根據(jù)使用什么材質(zhì),哪個(gè)光照對(duì)它有影響,它和哪個(gè)物體位置比較近,自動(dòng)構(gòu)建System。構(gòu)建得越復(fù)雜,計(jì)算量也會(huì)越多。
Clustering是最核心的Enlighten概念。Enlighten本身光照進(jìn)行照明是不需要計(jì)算的,它計(jì)算的是光照環(huán)境。所以構(gòu)建光照環(huán)境時(shí),才可以創(chuàng)造這些Clustering。
UV Chart是Lightmap光照貼圖的UV,而構(gòu)建光照環(huán)境最核心的東西是UV Chart,如果沒(méi)有UV Chart,它就沒(méi)有空間可以存儲(chǔ)Clustering作為計(jì)算單元。
大場(chǎng)景中對(duì)于cluster和charts的優(yōu)化是必不可少的,通常在烘焙時(shí)間過(guò)長(zhǎng)的時(shí)候,需要我們手動(dòng)去優(yōu)化這些參數(shù),避免長(zhǎng)時(shí)間的烘焙影響效率。
光照建議:
現(xiàn)在提供給大家一些光照經(jīng)驗(yàn)總結(jié),基本上代表了現(xiàn)在光照技術(shù),使用Unity制作移動(dòng)平臺(tái)光照時(shí)最重要的建議。
首選線(xiàn)性空間作為項(xiàng)目的開(kāi)發(fā)環(huán)境,Gamma空間適合Opengl3.0之前時(shí)代的項(xiàng)目。
在線(xiàn)性空間下,Direction light(主光源)白天強(qiáng)度在1.5-1.8之間,夜間月光在0.4-0.7之間。
在Gamma空間下,Direction light(主光源)白天強(qiáng)度在0.5-1之間,夜間月光在0.2-0.5之間。
光照的Indirect強(qiáng)度不能高過(guò)直接光的強(qiáng)度,在線(xiàn)性空間下間接光一般小于1。
在Englighten渲染模式下,盡可能的降低植被的Cluster Resolution,提高渲染效率。
靜態(tài)物體盡可能優(yōu)化掉不需要烘焙的部分,提高重要物體的Lightmap精度。不參與烘焙的物體使用Light Probe照明。
優(yōu)化UV Chart,單個(gè)物體UV Chart越少越好。
優(yōu)化不同種類(lèi)的Cluster Resolution,保證不同種類(lèi)的物體都有合理的計(jì)算分辨率。
混合光照手機(jī)平臺(tái)建議實(shí)時(shí)陰影距離控制在不超過(guò)20米。
使用Unity提供的Procudral Skybox進(jìn)行烘焙光照貼圖??梢垣@得更真實(shí)的Lightmap。
不輕易的調(diào)整Unity的Albedo boost和Indirect intensity強(qiáng)度。盡可能的保證Albedo boost =1, indirect intensity=1。
下面是烘培的一些效果,這是可以在移動(dòng)平臺(tái)上運(yùn)行的效果。