? ? ? Unity5中的光照可以用整本書(shū)來(lái)說(shuō)明,此文是過(guò)去幾個(gè)月使用Unity5的簡(jiǎn)單匯總。下面主要分6個(gè)部分來(lái)講解。
Forward(前向)與Deferred(延遲)渲染
Realtime(實(shí)時(shí))與Baked(烘焙)光照
引擎的光照工具
光照?qǐng)鼍?/p>
性能技巧
后期處理
上述的大部分對(duì)于Unity制作的內(nèi)容都是適用的,并不局限于虛擬現(xiàn)實(shí)應(yīng)用。這是非常高級(jí)的內(nèi)容介紹,需要讀者具備基礎(chǔ)的圖形和光照的概念。下面開(kāi)始吧!
前向與延遲渲染通道
如果心懷疑慮,請(qǐng)使用前向渲染通道。前向渲染通道對(duì)VR應(yīng)用來(lái)說(shuō)很理想,有以下幾點(diǎn)原因。前向渲染在前期的性能開(kāi)銷(xiāo)較低,DrawCall較少更宜在CPU運(yùn)行,在移動(dòng)VR設(shè)備上也同樣運(yùn)行的很好,它還支持抗鋸齒和半透明材質(zhì)。以下是能幫助你決定應(yīng)用適用渲染管線(xiàn)的簡(jiǎn)單指南。
延遲渲染
延遲渲染前期的性能開(kāi)銷(xiāo)很大,但它是一個(gè)固定的性能開(kāi)銷(xiāo),添加再多的幾何體和燈光也不會(huì)產(chǎn)生過(guò)多的額外開(kāi)銷(xiāo)。你有幾百個(gè)實(shí)時(shí)燈光?那就使用延遲光照吧。延遲光照的開(kāi)銷(xiāo)是與燈光照亮的像素?cái)?shù)量成正比的。場(chǎng)景復(fù)雜度(燈光照亮的物體數(shù)量)并不會(huì)影響性能。旁注:UE4 只有延遲渲染管線(xiàn),這就是UE4制作的Demo在較老的PC上運(yùn)行緩慢的一個(gè)原因。
優(yōu)點(diǎn)
延遲渲染最適用于包含大量小體積實(shí)時(shí)燈光的場(chǎng)景。
每個(gè)光照都可以當(dāng)作一個(gè)逐像素?zé)艄鈦?lái)渲染,以便在法線(xiàn)和深度貼圖中可以精確著色。
每個(gè)光照都有一個(gè)實(shí)時(shí)陰影。
權(quán)衡
延遲渲染器無(wú)法渲染半透明材質(zhì)。你需要為半透明材質(zhì)添加一個(gè)額外的前向通道。
平行光在延遲渲染器中開(kāi)銷(xiāo)很大。它們影響整個(gè)場(chǎng)景,且光照體積無(wú)限大。
產(chǎn)生大量Draw Call(場(chǎng)景中每個(gè)物體產(chǎn)生的兩個(gè)Draw Call乘以每個(gè)燈光產(chǎn)生的兩個(gè)Draw Call。)
不能抗鋸齒(這對(duì)于VR非常不利,因?yàn)閂R極度依賴(lài)MSAA來(lái)減少閃爍和忽隱忽現(xiàn)的線(xiàn))。
前向渲染
前向渲染的前期固定開(kāi)銷(xiāo)較小,因而最適合復(fù)雜度較低的場(chǎng)景,但其性能開(kāi)銷(xiāo)與場(chǎng)景復(fù)雜度成正比。如果你的場(chǎng)景中只有一對(duì)實(shí)時(shí)燈光,那就使用前向渲染吧。前向渲染器的成本與場(chǎng)景中燈光的數(shù)目成正比。像素?zé)粼缴賱t性能越高。
權(quán)衡
在每個(gè)渲染通道中,每個(gè)被像素?zé)艄庹盏降膶?duì)象都會(huì)被渲染。如果一個(gè)對(duì)象被10盞不同的燈光照亮,那它將被渲染十次(每個(gè)光照通道一次)。這就是前向渲染通道中被燈光照亮的物體越少越好的原因。
從設(shè)計(jì)上限制燈光數(shù)量。
基本通道用實(shí)時(shí)陰影渲染一個(gè)方向光,并用額外的通道來(lái)渲染其余的燈光。然而,這些額外的燈光不會(huì)有陰影。
像素光照數(shù)量有限,其余的都是頂點(diǎn)光照。和逐像素光照對(duì)象相比,頂點(diǎn)光照提供的效果較簡(jiǎn)單。
好處
Draw Call較少。每次像素光照射到物體,就會(huì)產(chǎn)生一次Draw Call。最壞的繪制調(diào)用計(jì)數(shù)情況是(場(chǎng)景中對(duì)象數(shù)量*照射到對(duì)象的像素光數(shù)量)。有很多降低Draw Call的方法(批處理等)
鋸齒(8XMSAA,非常適合VR)
支持半透明材質(zhì)
如果你的目標(biāo)平臺(tái)是移動(dòng)端(如GearVR),使用前向渲染通道,限制像素光數(shù)量為1~2個(gè)
當(dāng)在前向和延遲渲染間猶豫不決時(shí),別忘了我們這里只討論實(shí)時(shí)燈光。場(chǎng)景中有多少烘焙光照都是可以的。烘焙光照貼圖,并在運(yùn)行之前禁用它們。運(yùn)行時(shí)渲染器只會(huì)考慮場(chǎng)景中的實(shí)時(shí)燈光。
實(shí)時(shí)和烘焙光照
如果你在乎陰影的真實(shí),那就烘焙燈光。硬陰影或者軟陰影在一些情況下已足夠,但在很多情況下仍不能接受。(比如桌子上的點(diǎn)光源)。在實(shí)時(shí)光照下,你可以在地面上看到塊狀陰影。在烘焙光照下,你看見(jiàn)的是一個(gè)柔和的,散布在桌下的陰影。實(shí)時(shí)燈光只在光照有變化(顏色,位置等等)的情況下是必要的。烘焙光照和陰影不會(huì)隨著實(shí)時(shí)移動(dòng)的對(duì)象而改變,但可以用小技巧來(lái)彌補(bǔ)。(見(jiàn)下面的“光照探針”)。
提高烘焙光照貼圖質(zhì)量
在烘焙時(shí),你可以通過(guò)增大烘焙分辨率滑動(dòng)條(合理的紋理像素分辨率是40~100)來(lái)提高光照貼圖質(zhì)量。啟用環(huán)境光遮蔽(Ambient Occlusion)和最終聚集(Final Gather)。在烘焙之前,檢查工程的Quality 和Player 設(shè)置。在Quality選項(xiàng)卡中,使用高分辨率的硬陰影和軟陰影。在Player選項(xiàng)卡中,選擇延遲渲染器。在烘焙前禁用GI預(yù)計(jì)算。即使使用質(zhì)量較低的陰影,在運(yùn)行時(shí)采用前向渲染,采用這些設(shè)置會(huì)使烘焙期間效果達(dá)到最好。你可以在烘焙完成后切回前向渲染或低圖形質(zhì)量。
引擎燈光工具
區(qū)域光源
可以改變位置和旋轉(zhuǎn)。必須烘焙。
注意:鏡面反射顯示在表面的單一區(qū)域,與該區(qū)域光的大小和形狀無(wú)關(guān)。
用于窗口和盒狀的燈光(壁頂燈或燈管)。
點(diǎn)光源
可以調(diào)整位置,但旋轉(zhuǎn)無(wú)效。
一個(gè)光禿禿的燈泡,會(huì)向各個(gè)方向散射光線(xiàn)。用于普通的燈泡環(huán)境。
聚光燈
·可以設(shè)置位置和旋轉(zhuǎn)。
·用于手電筒,泛光燈,和天花板燈等。
方向光
位置無(wú)關(guān)緊要,但可以旋轉(zhuǎn)。
燈光影響整個(gè)場(chǎng)景(但可以被屋頂遮擋,這與環(huán)境光不同)
使用方向光模擬戶(hù)外太陽(yáng)或者月亮光,或者創(chuàng)建一個(gè)室外燈光通過(guò)天窗來(lái)照亮室內(nèi)場(chǎng)景。
方向光非常粗糙,產(chǎn)生的陰影也是生硬的。
環(huán)境光
會(huì)微微照亮整個(gè)場(chǎng)景(顏色可選)
這意味著即使未被照亮的區(qū)域也會(huì)有一絲光線(xiàn)
如果希望未照亮區(qū)域完全不可見(jiàn),就要禁用環(huán)境光。
使用環(huán)境光來(lái)改變場(chǎng)景氛圍。
全局光照
全局光照是為了實(shí)現(xiàn)更具有真實(shí)感的場(chǎng)景而計(jì)算來(lái)自直接光照的簡(jiǎn)單反射光和陰影。實(shí)時(shí)全局光照支持改變場(chǎng)景燈光,比如改變燈光顏色,移動(dòng)直射的太陽(yáng)光,從白天過(guò)渡到黑夜等等。為了提高實(shí)時(shí)全局光照的質(zhì)量,增加預(yù)計(jì)算的分辨率。