UE4光照及優化

UE4光照及優化

來自專欄 Unrealengine TA

公司程序最近研究學習整理關於UE光照及優化方面的知識點

文檔整理:孫赫成 參與編輯:申犇

本文摘自blog.ch-wind.com/ue4-li

光照系統

1.靜態光照

UE4的靜態光照是在光照構建中進行預計算的部分,會對預計算的光照結果進行存儲,例如光照貼圖、陰影貼圖這樣的形式,可以在運行時支付較低的效率而獲得較好的光照結果。

靜態光照可以在世界設置(World Setting)中可以進行關閉。

2.Lightmass Importance Volume

這個是預計算光照用的VolumeLightMass的光照計算在點擊「構建光照」之後會產生光照貼圖。

控制良好的預計算光照可以讓場景變得美觀的同時降低動態光照的成本,但是在控制不好的時候就會造成貼圖空間爆炸。

LightMass Importance Volume是用來控制預計算精度的,很明顯的一點是,加上之後在空間內部會生成更多的間接光照緩存點,使得間接光照的效果變得更好。

3.SSAO

世界設定中還有一個LightMass相關的功能

LightMass這裡的AO就是SSAO,由於是工作在屏幕空間的後期計算,要進行探索的話可以在PostProcess中進行調整測試。

還有一個額外的選項

打開之後可以使得PrecompoutedAOMask材質節點變為有效,這樣就可以使用AO的數據來對場景內物體之間的混合效果進行控制。詳細的可以看這個選項的注釋。

4. 間接光照緩存

間接光照緩存的作用是通過緩存某個點的間接光照,將其作用於經過該處的動態物體上,以獲得好的間接光照效果。

Movable的物體以及角色上可以對間接光照的計算類型進行設定

LCQPoint的時候就是一個點,Volume就是很多點。

在物體移動時,這些生成的點將根據自己所處的位置,通過周圍的間接光照緩存點進行插值並計算出間接光照。

雖然插值點多的話間接光照效果會變好,但使用何種形式需要根據性能和需求進行權衡。

可以使用

r.cache.drawinterplotionpoint 1

r.cache.updateeveryframe 1

這兩條指令來預覽緩存插值點的生成。

對於角色的光照緩存還有一個另外的用於提高區域計算精度的體積

5. Capsule Shadows

這個是專門為骨骼模型設計的投影優化方式,在骨骼的Lighting屬性中能夠看到相關的選項:

要使用必須在骨骼網格中指定用於投影的Physics Asset

使用這種方式可以防止一般較為複雜的角色模型在進行投影計算時產生過多的消耗,尤其是同一個場景內有很多角色模型的情況。

光照問題

在光照的結果上,有時會出現並非預期的結果。在進行場景構建、模型製作時需要預先做好一些預防工作。

1. Indirect Seams

間接光照的運算結果在模型之間的接縫處會出現不自然的裂縫

這種的主要原因是兩個Mesh之間雖然是平滑的,但是在間接光照進行陰影計算時並不知道這些信息。

可以通過在世界設置中調節間接光照的質量和平滑度來減少這種現象

提高間接光照質量會加重光照構建的成本,而如果過於提高平滑度的話,會導致間接光照的很多細節被丟棄。

所以一個更好的解決方案是,在構建關卡時,如果是一個平滑的面的話就直接使用一個整體的模型來做,而不是用好幾個模型拼接而成。(這裡根據項目情況而定)

2. UV Seams

這個是由於模型的UV沒有很好的接合造成的,由於鄰近的頂點在UV上並不連接,在進行間接光照計算時,產生的結果就沒有辦法很好的利用這些信息。

根據官方的說明,提高間接光照質量並不會解決UV Seams的問題。這個問題更多的是在建模上進行解決。

不要生成分散的UV

盡量保持鄰接信息

3. LPV

這個體積主要的作用是,在動態光照中對間接光照之類的效果進行光線傳播運算。

功能上非常的有用,因為有時候確實會需要在動態光照中有間接光照這樣的效果來加強場景的真實性。

更多的內容可以參考官方的LPV文檔

LPV文檔?

docs.unrealengine.com

這裡需要注意的是LPV雖然從命名上看起來像是一個體積控制項,但是其實並不存在這樣一個Volume,其屬性是在PostProcess中進行修改的。

在開啟之後可以在

打開LPV的屬性可視化。

4. CSM

Cascade Shadow Map是UE4陰影貼圖的使用方式,在Far ShadowDynamic ShadowStatic Shadow中使用了這個機制。

這個機制的主要作用是,在不同的距離層級,使用不同精度的陰影貼圖。在設定CSM的同時,還可以對過渡效果進行調節(在方向光源下)

對應的CSM數量被設置為0的話,就相當於關閉了相應的陰影類型

CSM的計算範圍可以通過在顯示中打開

類似以下這樣,可以在調節相關屬性的時候有一個好的可視化工具

5. Emissive Material

自發光顏色的材質是通過HDR來實現泛光效果的,因此它本身並不參與光照運算。

通過在使用了自發光顏色材質的物體上打開

可以讓其能夠照亮周圍環境,但僅限於靜態光照。當物體是Movable時,沒有辦法開啟這個選項。

視頻中實現的類型於動態照亮的效果是通過在物體上綁定一個改變GIPP來實現的,然後兩個PP之間的Blending就會改變空間內的燈光造成的影響,形成類似於被物體本身照亮的效果。

6.Error Coloring

錯誤著色可以用於排查靜態光照計算時報出的UV方面的錯誤,因為光照構建時只是提示物體上有UVOverlappingWrapping有時候還是很難找到對應的問題的,尤其是模型並不是自己構建的情況下。

打開這個選項之後要將光照質量調整為預覽,才能看到錯誤著色

重新構建一次光照,就能看到:橙色的部分是Overlapping而綠色的部分是Wrapping

7.Volumetric Lighting

這是類似於聚光燈的光束的效果,官方的Blueprint示例工程中也有類似的名為GodRay的效果實現。

光束?

docs.unrealengine.com

在引擎內容中搜索LightBeam就能找到

這裡的模擬方式是在類似光束效果的模型上貼上一個Translucent貼圖。雖然半透明材質的消耗比普通的材質高,但是在實現光束效果上卻是很高的成本節約。

動態光照

動態光照是實時計算的光照,如果關閉了光照預計算的話,所有的光照計算都是實時生成的。如果沒有啟用LPV的話,靜態光照中的間接光照緩存無法使用的情況下,有時候也會造成畫面質量的下降。

1. Distance Filde

距離場在動態光照的優化和填補中有相當大的作用,距離場的基本原理就是在模型的周圍向外擴散而成的距離場。

距離場的生成需要在項目設置中進行開啟,雖然距離場生成後會產生額外的存儲成本,但是可以在動態光照優化中起到很大的作用。

利用距離場生成的陰影的成本會比動態光照的陰影低很多,通常情況下,將動態光照的作用範圍調小

然後在基本上看不到陰影差別的距離上使用距離場生成的陰影進行替代可以很好的降低動態光照對場景的消耗。

事實是,大部分情況下,動態光照的陰影和距離場的陰影,在中距離上基本上沒有什麼太大的差別。

2. Distance Field Resolution

Distance Field Resolution這個屬性是用於調整距離場的精細度的,在Mesh自己的設置裡面可以找到。

稍微增加一點就會有明顯的提升,重要的是平衡的選擇,遠距離物體完全沒有必要性。

在模型細節里選擇

3. RayTraaced DistahceField Shadows

對於需要柔和的漸變光照的情況,可以使用

打開只有在下面的屬性可以調節因距離而變化的邊緣陰影的效果

4. SelfShadow

當物體的自身投影出問題的時候可以試著調節,來進行修正

5. Contact Shadow

這個是DirectionalLight中的屬性

設置成0以上的值的話就會進行接觸陰影的計算,這個計算時工作在屏幕空間的。由於是工作在屏幕空間,在物體距離較遠時陰影的損失也不會變的嚴重。

可以用於填補默認的級聯陰影的距離損失,也就是說,可以調低級聯陰影,降低陰影消耗。

6. Distance Filed AO

這個是天空光特有的功能,天空光可以利用距離場的生成數據進行環境光的投影計算

只有當天空光是可移動的時候才能使用

7. IES(光域網)

IES的成本比光照函數還低一些,可以實現一些低成本的投影效果。

有助於關閉不必要的光照投影,例如只是用於模擬燈罩、遮擋的投影,或者乾脆是車燈這樣的效果。

IES的使用可以參照官方的文檔

IES 光源概述文件?

docs.unrealengine.com

8. Far Shadow

這是與通常的靜態光照和動態光照相反的一種陰影模式,主要是為了保持在遠景上的投影來使得場景看起來更有真實感。

通常在Landscape上開啟使用,對於需要的物體,也可以開啟使用。注意,要在對應的光源上也開啟Far Shadow才行。

在項目設置中個,有一個關閉靜態光照的總開關,不過通常在對應的地圖的世界設置中進行關閉更加具有可控制性一些。

不過通常在對應的地圖的世界設置中進行關閉更加具有可控制性一些。

還有針對移動端CSM的專有設定

優化

UE4提供了一些用於場景優化的工具,像是LODMipmap這樣的機制在場景優化的時候就比較實用。

1.Cull Distance Volume

這個是一個用於裁剪的體積,其內部的物體在遠離玩家的時候回直接被裁剪掉,不參與渲染。

由於動態光照的性能消耗與參與計算的面數成比例,這樣就可以起到一定的優化作用了,思路基本和LOD相同。

CullDistance的屬性比較簡單,每個數組的元素表示的是物體大小小於該值的,應該在里玩家多少距離處隱藏。這裡的數據雖然會被按照順序使用,但是實際上打亂順序也沒有關閉。

不過有兩個問題需要留意

首先,必須在PIE以上的狀態Cull Distance Volume才會起作用。在編輯器內必須按G進入遊戲預覽模式才能看到效果。

然後,必須有一個cull distance為0的設置賦給一個大的size,如上面的(1000,0),否則當距離到達最遠的Distance時,會裁剪掉內部的所有物體,包括天空球、大氣霧這些實際上沒有Size的物體。

2.Foliage Culling

FoliageCulling屬性可以在每一個獨立的Foliage上進行設置

如上面的Cull Distance設定,在沒有使用PerinstanceFadeAmount的情況下,採用的裁剪距離時1000

500~1000的範圍內PerInstanceFadeAmount1~0進行變化,這樣就可以在材質中對Foliage進行一個Fade的過程,而不是直接突兀的從邊界消失。

本文為轉載文檔(摘錄了部分內容,若希望查看全文請參考博客鏈接),希望對想了解有關UE4光照的朋友有所幫助。

在這裡感謝 博主:

風蝕之月?

blog.ch-wind.com


推薦閱讀:

TAG:虛幻4遊戲引擎 | 全局光照 | 技術美術 |