目前 Unity 提供了多種渲染管道茁影,兩種全局照明系統(tǒng),四種照明模式阅束,三種燈光模式呼胚,以及兩種 Shadowmask 模式,為開發(fā)者在創(chuàng)建面向高配PC息裸、主機(jī)、移動和XR設(shè)備項(xiàng)目的過程中提供了高度靈活性沪编。但是呼盆,作為 Unity 新手,如果不熟悉渲染的話蚁廓,面對這些選擇不免感到茫然访圃,本文來自 Unity Spotlight Team 的分享,XR技術(shù)研習(xí)社對此進(jìn)行了編譯相嵌。
定義
首先看幾個重要的圖形渲染概念的定義腿时。
渲染管線決定對象如何在場景中呈現(xiàn)出來况脆,分以下三個階段:
第一階段:剔除(Culling)。在此階段列出需要被渲染的對象批糟,優(yōu)先呈現(xiàn)攝像機(jī)可見的范圍格了,以及未被其它物體遮擋的對象。
第二階段:渲染(rendering)徽鼎。 在此階段盛末,根據(jù)光照設(shè)置以及相關(guān)的燈光屬性,將對象繪制到基于像素的緩沖區(qū)中否淤。
第三階段:后處理(post-processing )悄但。一般在緩沖區(qū)上執(zhí)行操作,比如應(yīng)用 Color Grading石抡、Bloom檐嚣、Depth of Field 等效果,將最終輸出到每一幀啰扛。
著色器(Shader)是在GPU上運(yùn)行的程序或程序集合的統(tǒng)稱净嘀。比如,在剔除階段完成之后侠讯,頂點(diǎn)著色器(vertext shader)將可見對象的頂點(diǎn)坐標(biāo)從對象空間(object space)變換為剪輯空間(clip space)挖藏,GPU使用新坐標(biāo)對場景進(jìn)行光柵化,即將矢量信息轉(zhuǎn)換為實(shí)際像素厢漩。然后膜眠,像素(或片段)著色器將這些像素進(jìn)行著色,像素顏色由材質(zhì)屬性和光照環(huán)境決定溜嗜。另一種常見的著色器類型被稱為計(jì)算著色器(compute shader)宵膨,這種著色器使開發(fā)者能夠利用GPU強(qiáng)大的并行處理能力進(jìn)行任何類型的數(shù)學(xué)運(yùn)算,比如光剔除炸宵、粒子物理辟躏、體積模擬等。
直接照明指的是來自光源(比如燈泡)的照明土全,并非光線從物體表面反射的結(jié)果捎琐。根據(jù)光源的大小及其與被照射物體的距離,這種照明通常會產(chǎn)生清晰且明顯的陰影裹匙。需要注意以下兩點(diǎn):
不要將直接照明與定向照明(directional lighting)混淆瑞凑,定向照明是由無限遠(yuǎn)的光源(例如Unity中的平行光)發(fā)出的光,定向光的顯著特性是能夠使用平行光線覆蓋整個場景概页,并且沒有距離衰減(或光衰減)籽御,也就是說,隨著到光源距離的增加,物體接收的照明強(qiáng)度不會衰減技掏。
在現(xiàn)實(shí)世界中铃将,太陽光與任何其他光源一樣,光照強(qiáng)度與距離成反比哑梳。例如劲阎,水星上日光的照射強(qiáng)度幾乎是地球的7倍,而火星接收的日光照射是地球的1/2涧衙,而冥王星只有地球的0.06%哪工。然而,鑒于地球上有限的海拔高度弧哎,相較以上的距離雁比,日光在地球上的衰減是微不足道的。因此撤嫩,平行光完全能夠模擬Unity場景中的陽光偎捎,包括大型的,以行星為中心的開放世界序攘。另外茴她,對于其他類型的光源(比如點(diǎn)光源和聚光燈),Unity 在高清渲染管線(HDRP)中能夠提供基于物理的衰減程奠。
間接照明是由光線從物體表面反射然后通過介質(zhì)(比如如大氣或半透明材料)傳播和散射而產(chǎn)生的照明丈牢。在這種情況下,光線通常通過遮擋物形成相對柔和的陰影瞄沙。
全局照明(GI)用于在場景中產(chǎn)生間接照明己沛,主要作為直接照明的功能。 在業(yè)內(nèi)距境,目前實(shí)現(xiàn)全局照明存在幾種技術(shù)申尼,比如光照貼圖(lightmaps)、Irradiance Volumes垫桂、Light Propagation Volumes师幕、光照探頭(light probes)、基于體素的GI和基于距離場的GI等诬滩,它們被廣泛應(yīng)用在像Unity霹粥、UE4、CryEngine碱呼、COD 等引擎中蒙挑,對于Unity來說,使用光照貼圖和光照探頭來實(shí)現(xiàn)愚臀。
光照貼圖技術(shù)通過發(fā)射光線計(jì)算光線反射,然后將生成的光照效果應(yīng)用到紋理中,以此來生成光照貼圖和光照探頭的數(shù)據(jù)姑裂。因此馋袜,使用不同的光照貼圖技術(shù)會呈現(xiàn)不同的照明效果。目前舶斧,Unity 使用兩種光照貼圖技術(shù):Enlighten 和 Progressive Lightmapper欣鳖。
概述
以下流程圖從內(nèi)容創(chuàng)作者的角度展示了在Unity中設(shè)置照明的過程。
在整個流程中茴厉,首先需要選擇渲染管線泽台,然后決定如何生成間接照明并選擇相應(yīng)的全局照明系統(tǒng)。在確保所有全局照明設(shè)置都對項(xiàng)目進(jìn)行了相應(yīng)調(diào)整后矾缓,可以繼續(xù)在場景中添加燈光怀酷、自發(fā)光表面、反射探頭嗜闻,光照探頭以及Light Probe Proxy Volumes (LPPVs)蜕依。詳細(xì)介紹所有這些照明對象的用法和功能超出了本文的討論范圍,因此建議讀者閱讀Unity手冊中關(guān)于光照部分的相關(guān)介紹琉雳,以了解如何在項(xiàng)目中正確使用它們样眠。
渲染管線
在 Unity 2018 之前,只有一種渲染管線翠肘,現(xiàn)在稱之為“內(nèi)置渲染管線(Built-In Render Pipeline)”檐束,該管線提供前向(forward)和延遲(deferred)兩種渲染模式供用戶選擇。
? ? ? ? ?1.在(多通道)前向渲染模式中束倍,場景中的所有對象按照一個統(tǒng)一的順序逐個渲染被丧,在多通道渲染過程中,當(dāng)多個光源照亮對象時肌幽,渲染成本會顯著增加晚碾,具體取決于影響每個對象的光源數(shù)量。這種類型的渲染器通常提供多種著色器喂急,并且能夠輕松處理透明度格嘁。
? ? ? ? ?2.在延遲渲染模式下,所有(包括不透明)幾何體首先渲染到存儲有關(guān)其材質(zhì)信息(顏色廊移、反射糕簿、平滑度等)的緩沖區(qū)中。稍后(在此體現(xiàn)延遲)狡孔,每個像素被順序著色懂诗,同時,渲染時間主要取決于影響每個像素的光源數(shù)量苗膝。透明對象和具有復(fù)雜著色器的對象仍需要額外的前向渲染通道進(jìn)行渲染殃恒。在處理包含很多動態(tài)燈光的場景時,建議使用延遲渲染,例如人工照明的室內(nèi)場景离唐,或需要室內(nèi)外組合照明的項(xiàng)目病附。
????在2018年1月,Unity 推出了 Scriptable Render Pipeline(SRP)亥鬓,允許開發(fā)者通過C#腳本自定義渲染流程完沪。這實(shí)際上是游戲引擎領(lǐng)域的一次變革——用戶能夠自由控制對象的剔除、繪制和后處理嵌戈,而無需使用像C ++這樣的底層編程語言覆积。
Unity提供了兩種SRP,目前為預(yù)覽版熟呛,其設(shè)計(jì)充分考慮了硬件規(guī)格及性能:
高清渲染管線(以下簡稱 HDRP)是一個綜合了Deferred/Forward宽档、Tile/Cluster 渲染方式的渲染器,提供高級渲染和著色功能惰拱,適用于需要展示高品質(zhì)視覺效果的PC和主機(jī)項(xiàng)目雌贱。Tile渲染和Cluster渲染如下圖所示:
其中,一個 Tile 代表幀中一小塊二維正方形區(qū)域中的像素偿短,一個 Cluster 代表攝像機(jī)兩個截平面之間的三維空間欣孤。Tile 和 Cluster 渲染技術(shù)均依賴于影響每個Tile或Cluster的燈光,然后在一個通道中中根據(jù)與其相關(guān)燈光來計(jì)算照明昔逗。不透明對象最有可能使用Tile系統(tǒng)進(jìn)行著色降传,而透明對象則依靠Cluster系統(tǒng)。與內(nèi)置渲染管道(延遲模式)相比勾怒,HDRP 的主要優(yōu)勢是更快的照明處理和更低的帶寬使用婆排。
輕量級渲染管線(LWRP)是一種快速單通道前向渲染器,適用于具有較低實(shí)時照明要求的設(shè)備笔链,例如智能手機(jī)段只、平板電腦和VR/AR設(shè)備。在該渲染管線中鉴扫,會對燈光進(jìn)行逐對象剔除赞枕,并在一個通道中進(jìn)行光照計(jì)算。與內(nèi)置渲染管線相比坪创,該管線能夠減少繪制調(diào)用的次數(shù)炕婶。
通過使用以下決策樹,讀者可以使用幾個關(guān)鍵條件判斷決定使用何種渲染管線莱预。
模板
可以通過 Unity 的 Package Manager (Window > Package Manager) 下載最新版本的 HDRP 和 LWRP應(yīng)用到項(xiàng)目中柠掂。在項(xiàng)目中應(yīng)用某個 SRP 比較快捷的方式是,在使用Unity Hub創(chuàng)建一個新項(xiàng)目時依沮,選擇相應(yīng)的模板(Template)涯贞,如下圖所示枪狂。
手動設(shè)置
如果要手動設(shè)置HDRP或LWRP項(xiàng)目,請確保已安裝所需的 package肩狂。以使用HDRP為例摘完,可通過 Create > Rendering > High Definition Render Pipeline Asset 命令在 Project 面板中新建對應(yīng)的資源姥饰,然后將此資源拖到 Graphics Settings 面板的 Scriptable Render Pipeline Settings 屬性中傻谁,如果此處不指定任何資源,Unity 將默認(rèn)使用內(nèi)置渲染管線列粪。如果使用 HDRP审磁,需要確保在 Player Settings 中選擇了線性(linear)色彩空間,并使用 Rendering > Scene Settings 命令在場景中添加一個場景設(shè)置游戲?qū)ο蟆?/p>
可擴(kuò)展性
對于理解渲染技術(shù)并熟悉C#的開發(fā)者岂座,如果需要為項(xiàng)目完全定制渲染器态蒂,建議嘗試使用SRP的相關(guān)概念創(chuàng)建自己的渲染管線。鑒于LWRP擁有較小的著色器庫且易于注入费什、移除钾恢、切換渲染通道,使得LWRP具有極強(qiáng)的可擴(kuò)展性鸳址。
兼容性
在Unity中將項(xiàng)目中的材質(zhì)從內(nèi)置渲染管線切換到HDRP或LWRP比較容易瘩蚪,使用 Edit > Render Pipeline > Upgrade xxx 相關(guān)命令即可完成,如下圖所示稿黍。需要注意的是疹瘦,此操作不可逆种吸,建議事先做好項(xiàng)目備份米奸。
盡管如此乙埃,自定義著色器需要進(jìn)行手動移植巷查,此過程相對比較耗時艺糜,具體取決于自定義著色器的數(shù)量羔杨。由于LWRP 和 HDRP 在物理表現(xiàn)上比內(nèi)置渲染管道更加準(zhǔn)確磨德,尤其是在光衰減和分布方面屯援,所以切換前后的項(xiàng)目看上去會有一些不同矿筝。此外起便,HDRP和LWRP之間互不兼容,因?yàn)樗鼈儧]有相同的渲染特性跋涣,兩者可以相互轉(zhuǎn)換缨睡,但不是一鍵操作,需要手動重新設(shè)置照明陈辱、材質(zhì)和著色器奖年。
最后需要說明的是,HDRP和LWRP目前仍處于預(yù)覽中沛贪,并非所有功能都已針對兩種管線實(shí)現(xiàn)陋守。比如震贵,某些照明模式尚未完全適用于LWRP,并且HDRP目前尚不支持VR/AR水评,但是在未來版本中將逐步實(shí)現(xiàn)猩系。
全局光照系統(tǒng)
Unity 提供兩種全局照明系統(tǒng),可在 Window > Rendering > Lighting Settings 中啟用它們中燥。
實(shí)時全局光照(以下簡稱實(shí)時GI):該系統(tǒng)完全依賴于第三方照明中間件Enlighten寇甸。在Unity的預(yù)計(jì)算過程中,Enlighten先后經(jīng)過兩個階段疗涉,包括:集群化和光傳輸拿霉。第一階段將場景分解簡化為以“集群”為單位進(jìn)行組織的集合,在第二階段計(jì)算集群與集群之間的可見性咱扣。預(yù)計(jì)算后的數(shù)據(jù)在運(yùn)行時用于交互性地生成場景的間接照明绽淘。 Enlighten的優(yōu)勢在于能夠?qū)崟r改變間接照明效果,因?yàn)轭A(yù)計(jì)算的數(shù)據(jù)依賴于集群之間的關(guān)系闹伪。但是沪铭,與其他光照貼圖技術(shù)一樣,改變場景中的靜態(tài)幾何體將觸發(fā)新的預(yù)計(jì)算偏瓤。
烘焙全局光照(以下簡稱烘焙GI): 照明信息被烘焙到光照貼圖和光照探頭中杀怠,Baked GI 系統(tǒng)可以使用以下兩種技術(shù)之一:
1.Progressive Lightmapper
2.Enlighten
????????Progressive Lightmapper 優(yōu)先計(jì)算對于攝像機(jī)可見物體的照明,并大大提高的照明計(jì)算速度硼补,但代價是增加整個場景的總體烘焙時間驮肉。 該技術(shù)使用CPU通過路徑追蹤算法計(jì)算間接照明∫押В基于GPU加速的 Progressive Lightmapper 能夠大幅縮短場景的烘焙時間离钝,目前正在處在研發(fā)中,在 Unity 2018.3.05b 中集成了該技術(shù)測試版褪储。由于Enlighten 和Progressive Lightmapper 使用了不同的技術(shù)計(jì)算光照卵渴,所以兩者產(chǎn)生的光照效果會有不同。
下圖列出了各全局光照系統(tǒng)的主要優(yōu)缺點(diǎn)鲤竹,可根據(jù)決策樹選擇項(xiàng)目需要使用的全局光照系統(tǒng)浪读。
靜態(tài) VS. 動態(tài)
無論您使用哪種全局照明系統(tǒng),Unity 都只會考慮標(biāo)記為“Lightmap Static”的游戲?qū)ο笮猎濉討B(tài)游戲?qū)ο笮枰柚鷪鼍爸蟹胖玫墓庹仗筋^來接收間接照明碘橘。
由于全局光照計(jì)算是一個相對緩慢的過程,因此只有具有明顯光照變化的大型復(fù)雜資源才需要應(yīng)標(biāo)記為“Lightmap Static”吱肌。接收均勻光照的較小網(wǎng)格可保持為動態(tài)設(shè)置痘拆,然后通過使用 Light Probes 為其提供近似效果的間接照明效果。較大的動態(tài)游戲?qū)ο罂梢允褂?Light Probe Proxy Volume(LPPV)氮墨,以便在局部接收更好的間接照明纺蛆。限制場景中靜態(tài)游戲?qū)ο蟮臄?shù)量對于提高烘焙時間同時保持足夠照明品質(zhì)至關(guān)重要吐葵。
警告
在Unity中可以同時使用烘焙和實(shí)時GI技術(shù),但是桥氏,必須注意温峭,同時使用會大大增加烘焙時間和程序運(yùn)行時的內(nèi)存消耗,因?yàn)檫@兩個系統(tǒng)不使用相同的數(shù)據(jù)字支。此外凤藏,間接照明在運(yùn)行時的交互式更新將給CPU帶來額外的壓力,并且在視覺上祥款,烘焙和實(shí)時GI提供的間接照明效果會有差異清笨,因?yàn)樗鼈兪褂昧瞬煌募夹g(shù)來模擬間接照明,并且通常在完全不同的分辨率下執(zhí)行刃跛。若同時使用這兩種技術(shù),建議將使用范圍限制在高端平臺或具有可預(yù)測性能成本且嚴(yán)格把控場景的項(xiàng)目中苛萎,同時桨昙,建議由對所有照明設(shè)置有很好理解的團(tuán)隊(duì)成員負(fù)責(zé),因?yàn)楣芾磉@兩個系統(tǒng)相對復(fù)雜腌歉。
因此蛙酪,對于大多數(shù)項(xiàng)目而言,盡量避免同時使用兩種GI技術(shù)翘盖,選擇其一是相對比較穩(wěn)妥的做法桂塞。
---------------------
作者:XR技術(shù)研習(xí)社
原文:https://blog.csdn.net/sovida/article/details/84351391