UE4 光照

static light

static light只有間接光,沒有直接光。光照和陰影烘焙到lightmap;static light通過indirect lighting cache Sample Grid(需要有lightmass importance volume)影響動態物體。

stationary light

光源位置不變,但顏色和亮度會變。這是stationary light和static light的區別。後者在運行時,什麼都不能改變。另外,運行時改變亮度隻影響直接光照。因爲間接光照是預先用lightmass烘焙的,不會改變。三種光照可移動性的光照中,stationary光照效率最高,中等易變形,中等性能消耗。
stationary光照的間接光照和陰影都存儲在lightmap中;直接陰影存儲在Shadowmap中。這些光照用到Distance Field Shadows,也就是說即使光照的物體lightmap分辨率很低,還是會很清晰。

直接光照

用延遲着色動態渲染。所以,運行時,可以改變亮度和顏色。通過改變Visible屬性可以使直接光照顯示或隱藏。

直接陰影

光源的實時陰影是主要性能消耗。動態光帶陰影開銷是動態光不帶陰影開銷的20倍。所以stationary光可以在靜態物體上有靜態陰影,但是有限制。

static陰影

不透明物體

lightmass在build light過程中對靜態物體上的stationary light生成了遠距離shadowmap。即使在比較小的分辨率下,遠距離shadowmap依然提供了準確的陰影過渡。遠距離shadowmap也需要接收靜態光照的staticMesh有單獨的展uv。
最多能有4個重疊的stationary光照有靜態陰影,因爲光必須映射到shadowmap貼圖的不同通道,所以最多有4個重疊的stationary光照。StationaryLightOverlap viewMode可以看重疊。當不能再分配通道時,光源圖標會變成紅色的叉。

半透明物體

半透明物體從stationary光接收陰影的開銷也特別小。lightmass從運行時的透明靜態幾何體預計算陰影深度貼圖。這種形式的陰影比較糙,以米爲單位。靜態陰影深度貼圖的分辨率在BaseLightmass.ini文件中,StaticShadowDepthMapTransitionSampleDistanceX 和StaticShadowDepthMapTransitionSampleDistanceY 控制,默認是100,表示每一米一個紋素。

dynamic陰影

動態物體(移動性設爲Movable的staticMesh組件或SkeletonMesh組件)需要與遠距離shadowmap中得到的世界的靜態陰影融爲一體。這是通過Per Object陰影來實現的。每個動態物體從stationary光照創建2個動態陰影:一個控制靜態環境投影到物體上的陰影,一個控制物體投影到環境的陰影。stationary光照的開銷來源於它所影響的物體,它影響的物體足夠多的時候,用Movable光照更划算。
逐物體陰影將一個shadowmap映射到物體的包圍盒上,所以包圍盒需要精確。skeletal mesh要有一個物理資源,粒子相同的包圍盒需要足夠大以容納所有粒子。

平行光動態陰影

平行光stationary光很特殊,因爲它既要支持靜態陰影又要通過csm支持整個場景的陰影。動態陰影通過距離融入靜態陰影,過渡一般無法分辨。改變Dynamic Shadow Distance StationaryLight屬性爲你想要過渡發生的範圍。
movable組件在平行光用了csm的同時仍會創建逐物體的陰影。這種行爲在動態陰影距離較小的時候有用,但距離大的時候會產生不必要的開銷。關掉逐物體陰影,通過不勾選光源上的Use Inset Shadows For Movable Objects屬性

間接光照

stationary光將他們的間接光照存儲在lightmap(像static光一樣)。間接光照不能在運行時改變顏色和亮度,也就是說即使不勾選visible,build light時,間接光照也會烘焙到lightmap中。光照上的IndirectLightingIntensity影響構建光照時,給定光源影響間接光照的程度。後處理體積設置上有IndirectLightingIntensity屬性,能運行時改變,用來控制所有光照的lightmap貢獻程度。

stationary光的Area陰影

stationary平行光有一個陰影屬性位於Lightmass下面,Use Area Shadows for Stationary Lights。開啓後,距離投射陰影的物體越遠,陰影越柔和。

Movable光照

完全動態光照和陰影,座標、旋轉、顏色 亮度 falloff 半徑,所有有的屬性都能改變。沒有間接光,不會烘焙到lightmap。

陰影

整個場景都用動態陰影,開銷較大。開銷來源於光照影響的mesh數及這些mesh的三角形數。所以,投射陰影的可移動光源的半徑越大開銷越大。

陰影緩存

當點光源或聚光燈不動的時候,我們會存儲這個光源用的shadowmap以備下一幀所用。緩存是默認開啓的。可以檢測緩存對性能開銷的影響:1.選擇關卡中所有要投射動態陰影的光源;2.將光源可移動性設爲Movable,Cast Shadow也勾選上;3.控制檯輸入Stat Shadowrendering查看動態陰影開銷;4.r.Shadow.CacheWholeSceneShadows 0關閉緩存,r.Shadow.CacheWholeSceneShadows 0比較性能數據中的CallCount和InclusiveAug 數量。
緩存對性能開銷影響特別大。我們可以通過r.Shadow.WholeSceneShadowCacheMb控制shadowmap緩存用的最大內存數。
shadowmap緩存的限制:
圖元的Mobility屬性爲Static或Stationary;
關卡中材質沒有用World Position Offset
光源類型爲點光源或聚光燈,Movable,ShadowCasting開啓
用了動畫細分或像素深度偏移的材質當陰影深度緩存的時候會產生瑕疵。

Indirect Lighting Cache

4.18版本後, Volumetric Lightmap 代替 Indirect Lighting Cache成爲默認體積光方式了。要重新用間接光照緩存,設置World Settings > Lightmass Settings > Volume Lighting Method爲Sparse Volume Light Sample。
間接光照緩存工作方式:lightmass在關卡中放置採樣點,在烘焙光照的時候計算採樣點處的間接光照;渲染動態物體時,間接光照緩存檢查該物體是否有可用光照,如果有,則用;如果沒有(物體是新的或沒有移動太多),間接光照緩存從預計算的光照採樣點插值計算間接光照緩存。
光照採樣點放置在lightmassImportanceVolume裏面。
通過Show->Visualize->Volume Lighting Samples可以看到lightmass生成的採樣點。
但這種工作流需要的內容比較少,有時候這種方式不能在一些區域無法得到比較多的細節,比如一個角色在懸浮空間中乘坐電梯或者飛行;這時,可以通過在這些區域放置LightmassCharacterIndirectDetailVolumes 得到更多的細節。
間接光照緩存也允許預覽沒有執行built light物體的光照。

sky light

sky light捕獲到關卡較遠處,並作爲光源用到場景中。天空的外表和它的光照或反射要匹配,即使你的天空是來自大氣層或天空盒上的層雲或遠處的山。你同樣需要人爲指定一個所用的cubemap。

Scene Capture

Skylight只在特定情況下捕獲場景:
靜態skylight,在構建光照時更新;
固定或動態skylight,加載時會更新,在Recapture Sky調用的時候也會更新。當你更換Skybox所用的貼圖時,也並不會自動更新,需要用上面的方法手動更新。
應該用Skylight而不是Ambient Cubemap代表天空的光照,因爲Skylight支持局部陰影,避免室內被天空照亮。

移動性

static完全烘焙到lightmap,消耗很少。在移動開發中,只支持static skylight。只有場景中static和stationary屬性的Actor和燈光會被capture,用於照明。只有材質的自發光貢獻被static skylight所捕獲。所以要確定skylight的材質球設爲unlit。

預計算sky light

當用static或stationary天光烘焙光照的時候,光照和陰影數據會被存放到lightmap中。

改善的static sky light directionality

4.18以前,static sky light被3階球諧lightmass所表示,在太陽升起和落下的時候,無法捕獲到一些細節。一個濾波的cubemap現在默認使用,提高了分辨率。lightmass也基於final gather射線的數量選擇合適mipmap的cubemap貼圖,避免鋸齒。

stationary sky light的bent normal

stationary sky light的光照跟光照烘焙是分開的。lightmass烘焙的陰影保存方向遮擋信息,稱爲bent normal。這是從像素到最不被遮擋的方向的一個方向。最被遮擋的區域爲skylight用這個方向方向,而不是表面法線法線,提高了裂紋處的質量。

多反彈

來自sky light的間接光照的多反彈通過調節world settings>lightmass>num sky lighting bounces設置來調整。設爲10的效果遠遠好於設爲1的效果。
要想讓你的skylight反彈效果比較明顯,你的材質需要在大多數情況下有較高的diffuse值。這個值越大,烘焙時間越長。

屬性

sky light的屬性可分爲兩個範疇:light和sky light。

light

強度:光源發射的全部能量
光源顏色:指定光發出的顏色
影響world:是否影響world
投射陰影
投射靜態陰影:從static物體投射陰影
投射動態陰影:從動態物體投射陰影
間接光照強度:來自光源的間接光照的程度
體積散射強度:來自這個光源的體積散射強度。這個影響強度和光源顏色。
投射體積陰影:是否對體積霧產生陰影

sky light

源類型:是捕獲遠處場景然後用作光源還是用指定的cubemap。當捕獲場景的時候,距離sky light比SkyDistanceThreshold大的任意物體都會被包含。 SLS captured Scene:從捕獲場景構建sky light;sls specified cubemap
cubemap:如果源類型是指定cubemap,此處代表指定的cubemap
Source Cubemap Angle:源cubemap旋轉的角度
cubemap分辨率:處理的cubemap 的mipmap0的最大分辨率,必須是2的整數冪。
sky distance閾值:捕獲物體的最近距離(也被反射capture使用)
capture emissive only:只捕獲自發光物體,節省開銷。當用capture every frame的時候,推薦使用。
小的半球是否是固體色:所有來自小半球的光照是否應該設爲0.可以用來阻止來自小球體的光照泄漏
Recapture Scene:觸發操作。

半透明光照

Per-Pixed半透明光照開啓通過在材質上設置:Translucency下Screen Space Reflection勾選,Lighting Mode設爲Surface ForwardShading。

平面反射

ssr和平面反射

UE4支持實時平面反射,相比ssr它能提供更精確的反射表現,當然開銷也更大。這是由平面反射的工作方式決定的,平面反射實際上從反射方向上把關卡重新渲染了一遍。SSR會有光的泄漏在某些地方,這是因ssr無法反射屏幕外的物體。

開啓屏幕反射

  1. 通過勾選項目設置,渲染,lighting裏Support global clip plane for Planar Reflections,然後重啓ue。2.從Visual Effects下,拖Planar Reflection Actor到場景中。3.可以用G鍵顯示或隱藏平面反射Actor,可以移動、旋轉、縮放平面反射Actor調整位置,實現需要效果。

平面反射Actor屬性

屬性:扭曲強度、平面反射貼圖濾波粗糙度值(值越大,gpu消耗越大)、平面反射消失開始距離,平面反射完全消失距離、平面反射開始消失角度、平面反射完全消失角度、屏幕百分比(降採樣百分比影響gpu消耗,也影響反射質量)、fov(值越大,渲染消耗越大)、雙面渲染場景(如果水平面開啓了這項,要將水平面加到Hidden Actors中)、lod距離參數(設置大於1的值使平面捕獲用比主視圖更小的lod,加速捕獲pass的執行)。

平面反射Actor Scene Capture屬性

平面反射Actor有許多控制被捕獲的實時反射的性能消耗的屬性。
Primitive Render Mode:1. Render Scene Primtive (Legacy)渲染場景中所有圖元;2.渲染場景圖元:渲染除了Hidden Actors列表中的所有圖元;3.Use ShowOnly 列表:只渲染在Show Only Actors列表中的Actor。
Hidden Actors:在Scene Capture中隱藏的場景Actor列表;
Show Only Actor:關卡中Actor列表
Capture Every Frame:是否每幀更新,如果不勾選,這個控件只在加載和刪除時,渲染。
Capture on Movement:是否在移動時,更新capture內容。如果想在藍圖中手動capture,就要設爲disabled。
Always Persist Rendering State:即使每幀capture爲關閉的,還能持續渲染狀態。這使運動模糊的速度和taa能夠被計算。
Max View Distance Override:scene capture中渲染圖元的最大渲染距離。在反射平面在一個封閉的區域比如室內或走廊時,將遠距離物體從反射平面中裁剪掉。
Capture Sort Priority:爲了解決多個capture組件相互依賴,在幀中設置capture優先級對gpu上的scene capture排序。
Profiling Event Name:設置profiling事件的名稱當profiling gpu 的時候。
高級屬性:
常見的顯示屬性:常見的顯示標誌對一些風格和Actor是否渲染到scene capture中進行開關。比如抗鋸齒,霧,static和skeletal mesh等。
高級顯示屬性:常見的高級的顯示標誌,對一些風格和Actor是否渲染到scene capture中進行開關。比如,植被,instanced 靜態mesh,paper2D Sprites等。
後處理顯示屬性:bloom,人眼自適應,運動模糊是否渲染到scene capture。
光源類型顯示屬性:sky light是否渲染到scene capture。
光組件顯示屬性:AO,動態陰影是否渲染到scene capture。
Hidden Show Flags:光照和後處理是否渲染到scene capture的開銷。

平面反射的限制

平面反射可以提供逼真的反射,但也有一些限制:

  1. 平面反射使整個場景渲染兩遍,所以在渲染線程和gpu上,你要爲這個預算一半的時間;
  2. 限制世界中平面反射數量。一般,一個都比較多了。
  3. 適當的規定平面反射的大小,這樣在平面反射不可見的時候就能裁剪掉;
  4. 渲染平面反射Actor的開銷直接來自於場景中需要渲染的東西。三角形較多,dc較高的場景,性能開銷越大,因爲這些開銷跟平面百分比無關。

平面反射性能

開啓和關閉平面反射的開銷可在GPU Visualizer窗口看到。完全用動態光照和陰影的場景,開啓和關閉前後相差31ms;而用stationary和預計算光照和陰影的移動端的場景,開啓和關閉前後相差1.67ms。因爲後者的複雜性和大小都比前者小很多。

反射環境

反射環境特性在關卡的每個區域都提供了有效的有光澤的反射。許多重要的材質比如金屬材質依賴於各個方向的反射,也就是反射環境所提供的。對動態物體反射和銳利的反射的支持需要額外的內存開銷。

快速創建反射環境

想要快速獲取你的工程關卡里的反射環境,可以照着下面這樣做:

  1. 在關卡中加入幾個光源,並構建光照;
  2. 從VIsual Effects下,選擇Sphere Reflection加入到場景中。
    如果在場景中看不到反射效果,或者反射效果沒有你想要的那麼強,你可以這樣:
  3. 確認你的材質球高光較明顯,粗糙度較低,以更好地顯示反射;
  4. 用Refection視圖模式查看哪些被captured,以便知道哪些材質球需要調整。

用反射環境創建一個關卡

第一步,創建包含間接光照的diffuse光照。用lightmap,可以參考Lightmass頁,如果不熟悉的話。一般的導致light mass間接光照無法正常工作的原因可能包含但不限於以下幾個:

  1. 缺少lightmassImportanceVolume;
  2. 缺少或錯誤的lightmapUV;
  3. 世界屬性裏的Force No Precomputed Lighting設爲true了。
    由於關卡的diffuse顏色是要被反射環境反射的顏色,我們需要做以下幾點以獲得更好的結果:
  4. 直接照明的區域和陰影區域有強烈的對比;
  5. 明亮的diffuse照明區域是會在反射中清晰顯示;
  6. 較暗的陰影區域是反射最可見的地方;
  7. 用lit 視圖模式,show flag裏Specular關閉,就可以看到反射Capture看到的關卡的樣子了。
    設置關卡的材質跟反射環境互相結合也很重要”
  8. 平的,鏡面曲面會暴露出cubemap的結合投影到簡單形狀上的誤差;
  9. 彎曲的幾何體或粗糙的表面都能屏蔽這些誤差,提供可信的結果;
  10. 用細節法線貼圖或指定用在平面區域上的材質的某種程度的粗糙度將會有更好的反射效果。
    平面反射在你想要反射的區域進行捕獲。將sphere capture放在你想要反射的關卡的地方,放在反射球內,關卡就會投影到這個球狀物體內。避免把capture放的裏幾何體很近,這樣的話,幾何體會很顯著,擋住了後面的重要的細節。

有光澤的間接高光

從技術角度說,反射高光提供了間接高光。我們通過分析光照獲取直接 高光,但那隻提供了在少數明亮區域的反射。我們也從Sky light從天空獲得高光,但那也只提供了局部反射,因爲Sky light cubemap是無限遠的。間接高光使關卡的所有部位向所有其他部位反射高光,這對於金屬類的沒有diffuse影響的材質是非常重要的。
反射環境通過在許多點捕獲靜態關卡,然後把它重新投影到在反射下的球上。美術通過放置ReflectionCapture捕獲點。反射在編輯時,爲了輔助放置,實時更新,但運行時不變。將捕獲的關卡投影到簡單形狀上,提供了反射的近似視差。每個像素在多個cubamap之間混合以獲得最終結果。小的ReflectionCapture Actor覆蓋大的,所以根據需要你可以在一些地方提煉反射視差的精確度。比如,你可以在屋子的中間房要給capture,然後通過在房屋的角落放置更小的capture優化反射。
通過從captured cubemap生成不同模糊程度的mipmap,可以支持不同光澤度的材質。
只在比較粗糙的表面上用cubemap反射會導致非常亮的反射,由於缺少局部遮擋導致的泄露。可以通過繼續用lightmass生成的lightmap數據來解決。cubemap反射和lightmap間接高光通過材質的粗糙度進行混合。一個非常粗糙的材質(完全diffuse)會收斂於lightmap數據。這個混合主要結合了cubemap高細節部分光照數據和lightmap低頻的另一部分光照數據。爲了使這一部分準確工作,只有間接光照能在lightmap裏。這意味着只有Stationary光源的間接光照可以改善粗糙表面的反射質量。靜態光源不能和反射環境一起用,因爲靜態光源的直接光照也會烘焙到lightmap中。注意:這個與lightmap的混合也意味着map需要有有意義的間接diffuse光照,光照必須被烘焙以看到結果。

反射capture和lightmap的混合

當用Reflection Capture Actor時,ue4混合了來自Refelection Capture的間接高光和來自lightmap的間接diffuse光。這幫助我們減少泄露,因爲反射cubemap只在空間裏的某一點捕獲,而lightmap在所有接收的表面計算,包含了局部陰影信息。
lightmap混合對於粗糙表面工作良好,這個方法在光滑表面表現並不好,因爲來自Reflection Capture Actor的反射和其他方法像屏幕空間反射、平面反射並不匹配。所以,lightmap混合不用於特別光滑的表面。一個粗糙度爲0.3的表面會獲得完全的lightmap混合,逐漸變化到粗糙度0.1時,沒有lightmap混合。這也使Reflection Capture和屏幕空間反射能更好的匹配,更難清晰地分辨出兩者之間的過渡。

lightmap混合和現存的內容

默認情況下,lightmap混合是開啓的,也就是說它會影響現有的內容。在有反射泄露到光滑表面上的情況,泄露情況會更加明顯。爲了解決這個問題,可以在關卡周圍放置額外的Reflection Capture Actor來幫助減小泄露。或者可以revert回老的lightmap混合方式,通過 Edit > Project Settings > Rendering > Reflections,取消勾選 Reduce lightmap mixing on smooth surfaces。
也可以微調lightmap混合的程度,通過控制檯命令:
r.ReflectionEnvironmentBeginMixingRoughness (default = 0.1)
r.ReflectionEnvironmentEndMixingRoughness (default = 0.3)
r.ReflectionEnvironmentLightmapMixBasedOnRoughness (default = 1)
r.ReflectionEnvironmentLightmapMixLargestWeight (default = 1000)

高質量反射

默認反射品質設置在性能和視覺品質之間取得了平衡,可能還是有些情況,想要獲得更好的品質反射。下面介紹了獲得高品質反射的可行的方法。

高精度static Mesh頂點法線和切線編碼

得到高品質反射的一個重要因素是頂點法線和切線描述的準確性。特別高密度的mesh會導致相鄰頂點整量化爲相同的頂點法線和切線值。這會導致法線方位的塊狀跳躍。我們增加了將法線和切線編碼成16bit每通道向量,使開發者在高品質和編碼vertex buffer用多少額外內存間權衡。
方法:

  1. 在static mesh編輯器裏打開一個static mesh,
  2. 在詳細面板,展開lod0選項;
  3. 在lod0的下面,build Settings下,展開選項,開啓Use High Precision Tangent Basis選項,並點擊Apply Changes按鈕應用。
    改變設置後,視口也會自動更新。反射的質量和static mesh細分的密集度直接相關。有更少細分的static mesh比有更多細分的static mesh拉伸的瑕疵更嚴重。

高精度GBuffer法線編碼

開啓高精度GBuffer法線編碼選項會使GBuffer用更好的精度的法線編碼。更高精度的GBuffer法線編碼將法線向量編碼進3個通道,每個通道有16bit。用這個更高精度的編碼使像SSR這樣的技術依賴於高精度法線。
開啓方法:

  1. Edit->Project Setting->Engine->Rendering->Optimizations->GBuffer Format,從default改變爲High Precision Normals。注意,這個編碼需要增加的gpu內存,開啓這個會直接影響工程的性能。
  2. 改變GBuffer格式不需要重啓引擎,你可以很快看到不同的格式對於反射效果的影響。

Reflection Capture形狀

現在又兩種反射capture形狀:球形和盒形。形狀非常重要,因爲它控制關卡的哪部分捕獲到cubemap上,關卡以什麼形狀被反射重新投影上。關卡的那部分能接受cubemap的反射。

球狀

球狀是現在用的最多的。它不匹配被反射的幾何的形狀,但它沒有不連續性或邊角,球形有一個半徑控制哪些像素會被cubemap所影響,關卡會被重新投影到的球形。

盒形

盒形在使用上有限制,一般只用在走廊和長方形房間裏。

編輯反射探針

更新反射探針

反射探針不是自動更新的。只有下面幾種情況會自動更新探針:
加載一個場景;
直接編輯Reflection Capture Actor的屬性;
構建關卡光照。
其他情況,你需要點擊Reflection Capture的update Captures按鈕進行更新。

在一個反射探針中用custom hdri cubemap

反射探針需要有指定用哪個cubemap和指定cubemap大小的能力。 開發者可以選擇最適合他們的性能,內存,品質需求的分辨率。
可以用custom cubemap,直接拖到Reflection Capture Actor上,然後點擊更新Capture按鈕刷新即可。

更改Reflection Probe分辨率

project setting->Engine > Rendering >Textures >Reflection Capture Resolution,修改reflection capture resolution。注意:如果用了高的分辨率貼圖,會增大gpu內存需求。

調整skylight反射分辨率

選擇Skylight ,Detail下Light下,source type選擇SLS Specified Cubemap,選擇cubemap,然後修改下面的Cubemap Resolution。

混合多個反射探針數據

場景裏添加兩個Reflection capture,調整兩者的Influence Radius使他們相交。可以看到一個會影響另一個的效果。

性能考慮

反射環境消耗只依賴於影響屏幕上像素的capture數。非常類似於場景中的延遲光照。Reflection captures被他們的影響半徑所限制,所以會很有效地被裁剪掉。光澤度通過cubemap的mipmap實現,所以在尖銳和粗糙反射之間的性能差別很小。

限制

  1. 這種方式的反射是近似的。物體的反射很少能匹配關卡中的實際物體,因爲投影到簡單的形狀上。所以,傾向於場景反射中的物體的多個版本,多個cubemap混合到一起。平的、光滑的產生鏡面反射的表面顯示這種問題更明顯。用細節的法線貼圖和粗糙度來幫助打碎反射,減小誤差。
  2. 將關卡捕獲到cubemap是一個較慢的過程,要在遊戲線程外部實現。所以,動態物體無法被反射,儘管他們能從靜態關卡接受反射。
  3. 爲了減少錯誤,只有關卡的diffuse被捕獲。純高光的表面(比如近似)會用他們的specular,好像他們會在捕獲過程中被diffuse。
  4. 當一個牆的兩面有不同的光照條件時,會有嚴重的泄露。一面會有正確的反射,但會泄露到另一面。
  5. 由於dx11硬件限制,cubemap用來捕獲關卡的,最多有128個,世界中最多一次開啓341個反射捕獲。

陰影投射

世界中的陰影會使物體更接地氣,給觀察這一種深度和空間的感覺。靜態陰影消耗跟渲染差不多,但動態陰影是性能上的最大開銷。下面會講述ue4中4種陰影投射。

靜態光源

靜態光源投射完全靜態的陰影和光照,也就是說他們不會向動態物體投射直接影響(靜態光照會烘焙到間接光照緩存中,所以會有一部分影響)。

平行光csm(cascading shadow map)(整個場景陰影)

Directional Stationary Lights很特殊,因爲他們通過csm和靜態陰影同時支持整個場景的陰影。動態陰影通過距離融合進靜態陰影,Dynamic Shadow Distance StationaryLight屬性調節過渡的範圍。

Stationary Light Shadows

動態物體(StaticMeshComponents 或SkeletalMeshComponents爲movable的物體)必須融合進來自遠距離shadowmap的靜態陰影。這是通過Per Object 陰影實現的。每個移動的物體都有兩個stationary 光源的動態陰影:控制靜態世界投影到物體上的,控制物體投射到靜態世界上的。stationary光源的唯一陰影開銷來源於它所影響的動態物體。這也意味着,開銷變化會很大。依賴於有多少動態物體。如果動態物體特別多,用可移動的光源更划算。
逐物體的陰影被動態控件使用,通過將一個shadowmap應用到物體的邊界,所以包圍盒必須準確。skeletal mesh需要有物理資源;粒子系統,包圍盒需要足夠大,包含所有粒子。

動態陰影

動態光源投射到所有物體上,完全動態的光照和陰影。不會烘焙,自由地投射動態陰影到所有物體上。static mesh,skeletal mesh,特效等,從動態光源上接收和投射陰影。
動態陰影是開銷最大的。

預覽陰影

編輯了stationary或static光源後,光照變爲unbuilt,previe shadow可以讓你知道當光照重建後,shadow是什麼樣子的。這些陰影帶有“preview” 字樣。

彎曲的法線貼圖

在材質中用彎曲的法線會改善他們對光照和陰影的響應。

用彎曲法線的好處

  1. 減少光照構建後,光照泄露數。
  2. 和AO一起用,改善diffuse間接光照。通過對間接光照使用彎曲法線而不是 法線來使diffuse間接光照更接近GI。

創建彎曲法線

爲了得到高質量彎曲法線貼圖,並匹配ue對怎麼計算彎曲法線貼圖的假設,需要確保創建彎曲法線貼圖時遵循下面幾點:

  1. 用Cosine Distribution;
  2. 用Substance Designer 6生成彎曲法線,像生成標準的normalmap或ao map一樣;
  3. 生成彎曲法線時,確保你的角色是T-pose;
  4. 彎曲法線和ao用同樣的距離;
  5. 彎曲曲線和normal map在同樣的座標空間。

在ue中用彎曲法線

在材質圖表中添加Bent Normal custom output節點,將你的彎曲法線貼圖連接到所創建的節點上。同時,要保證有一個ao貼圖連接到Ambient Occlusion輸出上。

反射遮擋

彎曲法線貼圖很強大,但又跟傳統不同,這是用在反射遮擋或高光遮擋上的。一個AO貼圖遮擋了diffuse間接光照,而反射遮擋也是類似的概念,但是用在高光間接光照上。

膠囊陰影

通過用一個物理資源做的代表角色的膠囊體來開啓對Skeletal Mesh的soft陰影投射 的支持。soft陰影使角色在間接光照區域更真實,並在直接光照區域有soft陰影。

膠囊體陰影綜述

角色膠囊體代表

用來支持軟陰影的角色的近似表示的物理資源創建。由於膠囊體綁定了角色的骨骼,陰影可以在場景中移動,並準確地投射。

用法

打開skeletal mesh,在detail面板,lighting>shadow physics asset中設置要給capsule陰影用的物理資源。

膠囊體陰影設置

Capsule Direct Shadow:開啓直接光照(移動光照)的軟陰影;
Capsule Indirect Shadow:開啓預計算光照(lightmap和skylight)的軟陰影;
Capsule Indirect Shadow Min Visibility:間接光照區域,膠囊體陰影的亮暗。

Capsule Indirect Shadow

如果開啓,角色的膠囊體代表會基於光照構建過程中,lightmass放置和計算的體積光照採樣點,投射平行軟陰影。如果你用了遠距離ao,則軟陰影會從你的角色投射,但不會使用方向性。
Capsule Indirect Shadow使在一些傳統的shadowmap表現不好的地方表現更真實。
開啓膠囊體間接陰影后,只有一個skylight作爲光源的開放區域,方向性比較低,由於光照來自各個地方,當用預計算光照時,會在角色下方產生像燈泡一樣的輕微的soft陰影。
在封閉的區域,光從開放區域進來的地方,間接光照緩存通過角色經過區域的採樣點融合賦予膠囊體陰影方向性和softness。在門道處,角色的陰影很輕微,方向性不強烈,但當角色從門道移動開,陰影的強度和方向性增強。
Indirect Minimum Shadow Visibility屬性:可以調節在用預計算光照的間接光照區域,膠囊體陰影最暗的程度。在需要降低capsule自陰影的區域或者降低陰影強度的區域,這個屬性很有用,可以用來和周圍陰影很好的融合。

capsule直接陰影

開啓後,平行光的light source angle和spot或點光源的source radius用來定義接收陰影的soft程度。允許當直接光照時,直接控制capsule陰影的強度。
光源角度:平行光屬性,用來創建soft區域陰影的動態陰影方法。調這個屬性時,離投射陰影物體越遠,陰影越軟。
源半徑:類似於光源角度,stationary聚光燈或點光源的source半徑用來給你的角色軟陰影。當用一個較大的值時,離投射陰影物體越遠,陰影越軟。
一旦光照已經構建好了,調整source radius屬性不需要重新構建光照。這個屬性隻影響capsule陰影或mesh distance field開啓的可移動actor。

性能

capsule陰影的gpu性能開銷正比於所用capsule的數量,角色的數量,他們的陰影影響的屏幕大小。

GPU Cost with 10 Capsules Time in milliseconds (ms)

A single character on screen 0.29 ms
Each additional character on screen 0.05 ms
這個實現是非常高效的,它在half分辨率下,考慮深度升採樣,計算陰影。同時用屏幕tile裁剪來降低陰影的光照,使只在需要的地方計算陰影。

限制

  1. 需要Dx11,因爲tiled延遲實現需要compute shader;
  2. 可移動的點光源和聚光燈當前不支持;
  3. 誤差mesh形狀會有自陰影誤差;
  4. 當膠囊體陰影太軟,以至於變成ao,會有一個誤差在陰影中,產生一個硬線。

mesh遠距離場

ue4用遠距離場使你遊戲裏的static mesh actor有動態ao和陰影。actor的mesh遠距離場代表可以用在其他特性上,比如gpu粒子碰撞,甚至材質編輯器創建動態flowmap及其他。

如何工作

Signed Distance Field(sdf,矢量距離場)用來代表靜態mesh的表面。通過將到最近的表面的距離存儲到一張體積貼圖中工作。mesh外部的任意一點都是正距離,mesh內部的任意一點都是負距離。下面的例子中,正向距離被追蹤和存儲來代表樹。
sdf第一個有用的屬性是當追蹤一條射線時,你可以安全地跳過空的區域,因爲到最近表面的距離已經是已知的了。這樣,求交集只需要很少的幾步。通過追蹤一個距離場,很容易產生一個可見性結果,也就是說,當射線與mesh相交時,這個光源就會產生陰影。
sdf第二個有用的用途是當追蹤一條射線時,通過追蹤一個閉塞物體傳輸的射線的最近距離,不需要額外開銷就能計算出一個近似的圓錐體交集。這個近似使用距離場做一個軟的區域陰影和天空遮擋成爲可能。這個屬性是遠距離ao等一些特性的關鍵,因爲很小數量的圓錐體可以計算一個接收點的整個半球的軟的可見性。

場景表現

創建的每個場景都由所放置的actor的mesh遠距離場構成。當mesh遠距離場生成時, 他們用三角形追蹤離線生成一個體積貼圖。這個方法在所有方向計算矢量距離場射線來獲取最近的表面及其信息。
可以通過視圖的Show > Visualize > Mesh Distance Fields看到mesh遠距離場。

https://docs.unrealengine.com/en-us/Engine/Rendering/LightingAndShadows/LightMobility/StationaryLights
https://docs.unrealengine.com/en-us/Resources/ContentExamples/Lighting/2_2
https://docs.unrealengine.com/en-US/Engine/Rendering/LightingAndShadows/IndirectLightingCache
https://zhuanlan.zhihu.com/p/38125862
http://gad.qq.com/article/detail/41824
http://blog.sina.cn/dpool/blog/s/blog_7449610f0102w624.html?vt=4

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章