Unity學(xué)習(xí)筆記 Vol.80 URP中為游戲畫面設(shè)置光照
摘要

????今天的游戲會(huì)在各種不同的硬件上運(yùn)行,玩家希望游戲不僅美觀,還能在各種設(shè)備規(guī)格下流暢運(yùn)行,而Unity通用渲染管線,具備對(duì)美術(shù)友好的工作流,可生成精美的圖像,還能快速針對(duì)移動(dòng)端、主機(jī)或PC等各平臺(tái)進(jìn)行優(yōu)化。
?- 開始
- 實(shí)時(shí)方向光光照 Real-time direct lighting
- 全局照明 Global Illumination
- 反射 Reflections
- 后處理 Post-processing
- 結(jié)論
管線的關(guān)鍵在于多種幕后優(yōu)化,綜合多種因素來(lái)實(shí)現(xiàn)完美的一幀。下面介紹實(shí)時(shí)渲染的概念,以及Unity中常見的照明配置,幫助減輕高畫面質(zhì)量與性能之間的沖突。在內(nèi)部制作的demo中演示實(shí)際效果。在最后,你將學(xué)習(xí)到實(shí)用的光照技巧,提升自己的項(xiàng)目。
首先展示如何使用Unity編輯器和通用渲染管線,然后演示怎樣用方向光建立實(shí)時(shí)場(chǎng)景光照的基礎(chǔ),接著介紹如何使用全局照明實(shí)現(xiàn)逼真的光反射,怎樣使用反射在物體間營(yíng)造一種聯(lián)系感,以及最后,如何使用后期處理,在不改變內(nèi)容的前提下大幅改善場(chǎng)景。整個(gè)演示將從《Boat Attack》示例游戲中選取實(shí)際例子。詳細(xì)教程請(qǐng)參考官方視頻。

教程

????首先需要選擇一種可編程渲染管線,每個(gè)管線都有不同的強(qiáng)項(xiàng),請(qǐng)根據(jù)項(xiàng)目目標(biāo)與開發(fā)環(huán)境 選擇最合適的管線,本次的目的是實(shí)現(xiàn)高清光照、實(shí)現(xiàn)高性能和廣泛的平臺(tái)兼容,最為合適的管線為Unity的通用渲染管線或URP。打開游戲項(xiàng)目,在包管理器窗口中可以看到,URP已經(jīng)安裝在這個(gè)項(xiàng)目中了,URP的目標(biāo)是,在高端至低端的大部分設(shè)備上,實(shí)現(xiàn)高質(zhì)量的實(shí)時(shí)渲染,限制光照與著色的選項(xiàng),引導(dǎo)用戶選擇高性能渲染設(shè)置。
實(shí)時(shí)方向光照
????我們先來(lái)討論光照,光照流程首先要設(shè)定實(shí)時(shí)方向光,為場(chǎng)景光照打下基礎(chǔ),為了兼顧性能,URP帶有直接光。

????它只具備一部分功能,場(chǎng)景燈光數(shù)量可在URP資源中設(shè)定,找到Edit > Project Settings > Graphics,選中此處的 URP資源

????找到Lighting設(shè)定,可以注意到URP有一個(gè)Main Light,也就是方向光及Additional Lights數(shù)量一定用以補(bǔ)充主光照的局部光。順便一提,在內(nèi)置渲染管線中,Local Lights就相當(dāng)于管線中的Pixel Lights。設(shè)置好主光源和局部光后,我們就可以為場(chǎng)景添加光照了,項(xiàng)目中并沒有局部光,只使用了一個(gè)位于層級(jí)中的主光源。主光源可用于制作如場(chǎng)景的太陽(yáng)光等效果,方向光最為重要的特點(diǎn)是會(huì)照亮特定方向的物體,意味著光的距離不會(huì)有影響,只有主光源的方向或轉(zhuǎn)向設(shè)定會(huì)影響效果,設(shè)置完成后,我們現(xiàn)在開始能看到場(chǎng)景中的陰影了,陰影目前可能會(huì)消耗許多性能,任何可以投射陰影的游戲?qū)ο?,比如這塊巖石,都必須渲染成所謂的陰影貼圖,而該貼圖將用于渲染受陰影影響的對(duì)象。
Perspective Aliasing(近距鋸齒)

????在方向光下,陰影貼圖覆蓋了大部分場(chǎng)景時(shí),可能導(dǎo)致稱作Perspective Aliasing的問題,Perspective Aliasing的意思是靠近攝像機(jī)的像素與遠(yuǎn)處的像素相比,要更大、呈現(xiàn)塊狀。
Cascaded Shadow Maps(多層次陰影貼圖)

? ? URP使用的多層次陰影貼圖可解決這個(gè)問題,多層次陰影貼圖會(huì)根據(jù)區(qū)域占據(jù)的屏幕比例,在攝像機(jī)視錐中分出陰影覆蓋區(qū)。多層次陰影的設(shè)定可在管線資源中修改,多層級(jí)陰影范圍越大,近距鋸齒的問題就越輕。但層級(jí)數(shù)量增加時(shí),要記住渲染開銷也會(huì)隨之增加,但其開銷依舊比全用高清陰影貼圖來(lái)的小,注意,只有主光源有多層次陰影,其他光源并不會(huì)投射陰影,會(huì)成為額外光源。

全局光照
????可以看到,實(shí)時(shí)光照不僅耗費(fèi)性能,使用起來(lái)也有諸多限制,因此類似光散射,光反射這類效果,在實(shí)時(shí)光照中開銷巨大,但并不是不能做。Unity有一種稱為烘焙式全局光照的技術(shù),可在游戲中實(shí)現(xiàn)逼真的光反射,它會(huì)離線計(jì)算光的傳播,使用諸如光照貼圖、光線探針和反射探針等技術(shù)來(lái)儲(chǔ)存光照。

????先講光照貼圖,光照貼圖是存儲(chǔ)光照的紋理。不論是直接光照、間接光照或陰影貼圖,都可以編寫進(jìn)光照貼圖

????不過首先我們需要設(shè)定對(duì)象為Contribute GI,選中對(duì)象,勾選Static下的Contribute GI(組成GI),只有這些對(duì)象會(huì)貼圖烘焙過程中計(jì)算。我們可以訪問光照設(shè)置窗口來(lái)設(shè)置光照貼圖的烘焙,要想訪問光照設(shè)置窗口,選擇Window > Rendering >? Lighting Settings。

光照貼圖
????在項(xiàng)目中,Baked Global Illumination(全局光照烘焙)的已經(jīng)勾選,光照模式設(shè)置為Baked Indirect(烘焙式間接光),該設(shè)置下引擎會(huì)使用高清方向光,烘焙光照、生成實(shí)時(shí)光照,非常實(shí)用。我們可以四處移動(dòng)方向光,不必再在開發(fā)時(shí)修改方向,其余的選項(xiàng)定義了光照貼圖的分辨率和清晰度,我們可以設(shè)定獲取光照信息,所用的樣本數(shù)量,可以優(yōu)化采樣數(shù),在較短時(shí)間內(nèi)實(shí)現(xiàn)無(wú)噪烘焙,為低分辨率烘焙去噪,設(shè)置好之后,就能點(diǎn)擊Generate Lighting按鈕了。我們可以通過多種方式可視化烘焙效果。

????比如在光照窗口中,打開Baked Lightmaps一欄,烘焙后的光照貼圖,甚至可以用圖像編輯工具打開,例如Photoshop

????或者也可以在編輯器中,選擇Baked Lightmps選項(xiàng)來(lái)可視化貼圖,其位于場(chǎng)景視圖左上角,選擇Shaded,將顯示整個(gè)烘焙后的景象,選擇Baked Lightmap,則只會(huì)顯示烘焙后的光照貼圖紋理,在Unity中,光照貼圖是渲染引擎的一部分,直接影響場(chǎng)景中的光照質(zhì)量,包括陰影的平滑度,明暗之間的過渡。
光照探針
????之前提到,只有Static(靜態(tài))對(duì)象,會(huì)被Unity的GI系統(tǒng)計(jì)算,但像船這樣的動(dòng)態(tài)物體怎么辦呢?它們要怎樣接收靜態(tài)物體,接收到的光反射呢?要想接收光照,光照信息必須以可快速讀取的格式儲(chǔ)存,在游戲過程中用于光照計(jì)算,在設(shè)置好氛圍光與光照貼圖后,我們可使用光照探針組,來(lái)照亮余下的道具和動(dòng)態(tài)對(duì)象,要想創(chuàng)建光照探針,選擇GameObject > Light > Light Probe Group。在項(xiàng)目中,一個(gè)探針組可以影響整個(gè)場(chǎng)景,該場(chǎng)景中的探針都設(shè)置在了賽艇的賽道上,基本上就是在水上,并且我們需要注意別讓探針,出現(xiàn)在游戲?qū)ο蟮睦镞?/strong>。
反射
????看過CG電影或玩過主機(jī)游戲的觀眾應(yīng)該知道,這些作品通常有非常逼真的反射,反射非常重要,它會(huì)在對(duì)象之間產(chǎn)生一種聯(lián)系感,然而,高精度反射的代價(jià)是大量的處理時(shí)間,這對(duì)于高端設(shè)備不是問題,但對(duì)低端設(shè)備影響較大,那么如何在低端設(shè)備上實(shí)現(xiàn)精美的反射呢?
????反射探針或稱烘焙式反射探針。要?jiǎng)?chuàng)建反射探針,可選擇GameObject > Light > Reflection Probe。對(duì)象如果要有反射效果,其著色器必須能訪問立方體貼圖的圖像。

????要建立反射效果,可以選中一個(gè)對(duì)象,并勾選Static下的Reflection Probe Static,物體表面的每個(gè)點(diǎn)都會(huì)接收,其面向的一小塊立方體貼圖,即表面的法線方向。每一個(gè)靜態(tài)反射探針都會(huì)影響各自的區(qū)域。局部反射探針越多,間接反射的精確度越高,它們可在較封閉的區(qū)域內(nèi),生成精確的反射效果。如果選中反射探針,類型改為Baked,會(huì)看到所有靜態(tài)反射探針,都會(huì)被烘焙進(jìn)該探針的貼圖中,反射探針的數(shù)量不宜過多,因?yàn)樗鼤?huì)與場(chǎng)景一起加載,數(shù)量過多有可能會(huì)導(dǎo)致游戲開始時(shí),加載時(shí)間過長(zhǎng)。
Post-Processing
????后期處理是指在現(xiàn)有渲染場(chǎng)景基礎(chǔ)上,于最終渲染之前,所添加的渲染效果,效果可以立即 生成視覺反饋。URP的許多渲染和后處理屬性,使用一種體積框架,效果設(shè)置會(huì)被歸納到,體積組件下的特定類別中,要想創(chuàng)建新體積,右擊層級(jí)視圖,找到Volume,從多種體積中選擇創(chuàng)建,或者也可以選擇層級(jí)視圖中任意的游戲?qū)ο?,點(diǎn)擊檢視器中的Add Component按鈕,添加Volume組件,這里表明體積之間,可存在優(yōu)先級(jí)和權(quán)重,用以確定船只在洞穴暗處與開放天空間穿梭時(shí),各屬性的混合方式。我們可使用不同的體積,如全局、局部或單鏡頭,來(lái)針對(duì)不同情況精細(xì)地控制渲染。因此,作為單獨(dú)資源儲(chǔ)存的體積,非常適用于測(cè)試。比如我們能復(fù)制某個(gè)體積,修改其配置,再恢復(fù)為原始配置,這樣并不會(huì)有什么后果。后期處理效果可能會(huì)占用很多幀時(shí)間,因此移動(dòng)設(shè)備上使用URP時(shí),請(qǐng)選擇對(duì)移動(dòng)端友好的后期處理效果。
????后期處理的實(shí)現(xiàn)方法,這里不進(jìn)行贅述,有興趣的同學(xué)可以參考UP之前的專欄。
