虛擬陰影貼圖(VSM)是一種全新的陰影貼圖方法,可以提供穩定的高解析度陰影。透過與虛幻引擎5的Nanite虛擬幾何體、Lumen全域性光照和反射以及世界分割槽功能結合使用,它能夠實現電影級的品質效果,併為大型開放場景打光。

虛擬陰影貼圖的目標

虛擬陰影貼圖的開發目標如下:

顯著提升陰影解析度,以便配合擁有高度細節內容的Nanite幾何體

以合理、可控的效能開銷,獲得真實的柔和陰影

提供一個簡單解決方案,能夠預設使用,並且只需少量的調整工作

避免混用各種靜態光照陰影技術,取而代之的是一個單一、統一的方法

從概念上講,虛擬陰影貼圖只是解析度非常高的陰影貼圖。在目前的實現中,它們的虛擬解析度為16k x 16k畫素。裁剪圖(Clipmap)用於進一步提高定向光源的解析度。為了在合理記憶體開銷下保證高效能,VSM會將陰影貼圖分成128x128個瓦片(或頁,Page)。系統會對深度緩衝進行分析,根據需要動態地分配並渲染頁來對螢幕上的畫素進行著色。頁會在不同幀之間快取(除非因為移動物件或光源而失效),從而進一步提升效能。

啟用虛擬陰影貼圖

在專案設定的

引擎 > 渲染 (Engine > Rendering)

陰影(Shadows)

分類中,你可以設定專案採用的

陰影貼圖方法

。可以是

虛擬陰影貼圖(Virtual Shadow Maps)

或是傳統的

陰影貼圖(Shadow Maps)

方法。

現有專案需要透過專案設定或控制檯變數

r。Shadow。Virtual。Enable

來設定。新專案預設使用虛擬陰影貼圖。

UE5 虛擬陰影貼圖 (VirtualShadowMaps)的優勢和侷限性

啟用VSM後,已有的陰影渲染方法會發生什麼情況?

啟用VSM後,它們將替換虛幻引擎中的各種現有陰影方法,包括:

靜態預計算陰影,包括2D距離場和陰影因子“陰影貼圖”

預陰影

逐物件/內嵌陰影

級聯陰影貼圖(CSM)

基於網格體距離場的距離場柔和陰影

基於區域性光源的可移動動態陰影

靜態光源生成的全烘焙陰影(Fully baked shadows)仍會像以前一樣運作(不使用Lumen時)。它們的貢獻只體現在烘焙光照貼圖中,不會參與執行時的光照計算。靜態光源在計算光照時,會採納來自光照貼圖的間接漫反射資訊,但啟用VSM後,它們的直接光照與陰影會動態計算生成(與可移動光源相同)。

由於VSM自身的高解析度和高精度屬性,你不再需要透過螢幕空間接觸陰影功能(透過“接觸陰影長度”調整)來獲得銳利的陰影效果。當你需要為某些沒有烘培進陰影貼圖的物件渲染陰影時(開銷較低),你仍然可以採用螢幕空間接觸陰影;不過,不太推薦用這種方法,因為它的精度要比VSM低。

光線追蹤陰影的優先順序仍然高於VSM,因為它們的品質通常最好。

基於光追陰影貼圖的柔和陰影

陰影貼圖光線追蹤(SMRT)

是一種結合了虛擬陰影貼圖的取樣演算法,能生成更為真實的柔和陰影和接觸硬邊效果。投射在遠處的陰影會比近處的陰影擁有更柔和的效果。

以下方的模型為例。靠近底部的陰影比遠處的陰影更清晰銳利。

UE5 虛擬陰影貼圖 (VirtualShadowMaps)的優勢和侷限性

基於光追陰影貼圖技術的點光源所投射的柔和陰影與接觸硬化陰影。

基於“百分比漸進過濾(PCF,Percentage-Closer Filtering)”的傳統方法會導致過度模糊,降低高解析度幾何體和陰影效果。

UE5 虛擬陰影貼圖 (VirtualShadowMaps)的優勢和侷限性

SMRT演算法的工作原理是向光源發射一定數量的光線,但它並不像傳統的光線追蹤一樣計算與幾何體的相交點,而是沿光線投射一定數量的取樣,並針對虛擬陰影貼圖進行測試,以實現柔和陰影和接觸硬化效果。

陰影光線(Shadow rays)的分佈是基於光源的,可透過區域性光源的

源半徑(Source Radius)

或定向光源的

源角度(Source Angle)

控制。

UE5 虛擬陰影貼圖 (VirtualShadowMaps)的優勢和侷限性

區域性光源半徑 和 定向光源角度

與初始便擁有低光源角的定向光源相比,區域性光源預設沒有光源半徑。只要設定的值比較合適,SMRT就能生成帶有接觸硬化效果的實時柔和陰影。下圖就展示了源半徑為10的點光源陰影效果。

UE5 虛擬陰影貼圖 (VirtualShadowMaps)的優勢和侷限性

控制半影品質

區域性光源和定向光源照射下的半影的柔和度和品質可透過控制檯變數來設定。它們自身包含有預設值,通常適用於大多數場景。

柔和效果的品質由光線數量決定。區域性光源與定向光源均預設使用7條光束。可以用控制檯命令

r。Shadow。Virtual。SMRT。RayCountLocal

r。Shadow。Virtual。SMRT。RayCountDirectional

來調整光線數量。假如光線數量較少就容易在半影中顯示取樣;如光線數量為0,則禁用SMRT並採用單一取樣硬陰影。

UE5 虛擬陰影貼圖 (VirtualShadowMaps)的優勢和侷限性

此外,你可以為區域性光源和定向光源設定每條光線路徑的陰影取樣數量,以控制最大柔和度。陰影貼圖取樣數量越低,渲染開銷越低,但是會限制光源陰影所能實現的半影柔和度。

控制檯變數

r。Shadow。Virtual。SMRT。SamplesPerRayLocal

r。Shadow。Virtual。SMRT。SamplesPerRayDirectional

可以調整使用的取樣數量。數量4和8(預設)之間時陰影貼圖取樣的效果最佳。

UE5 虛擬陰影貼圖 (VirtualShadowMaps)的優勢和侷限性

光追陰影貼圖的侷限性

SMRT的品質在預設設定下通常很不錯,但假如使用來自單一陰影貼圖投影的資料(而非針對真實幾何體進行測試),就可能存在一些固有的侷限性。

半影大小限制

區域性光源和定向光源的陰影半影會被限制,以避免取樣偏離光線原點,與沿光線自身的理想測試相比,其會變得越來越彎曲。使用合理的區域性光源半徑和定向光源角度值可避免出現過於極端的結果,從而限制光線以各種方式發散的範圍。太大的值可能會影響效能,並在攝像機接近它們時導致陰影半邊出現視覺扭曲。

UE5 虛擬陰影貼圖 (VirtualShadowMaps)的優勢和侷限性

區域性光源和定向光源可以使用控制檯變數

r。Shadow。Virtual。SMRT。MaxRayAngleFromLight

r。Shadow。Virtual。SMRT。RayLengthScaleDirectional

來放寬或收緊限制範圍。

非一致半影

由於虛擬陰影貼圖僅儲存首個深度層,Naive迭代會忽略與首個深度層背後的所有遮擋物的相交,因此在遮擋物重疊的位置可能發生各種光照洩漏瑕疵。這類光照洩漏問題可以透過間隙填充方法(gap-filling heuristic)來解決;此演算法是基於在遮擋點之前看到的深度,來推斷首個遮擋物後面的深度。

這能夠很好地解決光照洩漏問題,但會導致表面上與光線平行的半影縮小。目前還沒有直接的方法來抵消這種影響,只能將半影大小保持在合理範圍內。

UE5 虛擬陰影貼圖 (VirtualShadowMaps)的優勢和侷限性

非一致半影陰影的例子。

半影瑕疵

預設情況下,虛擬陰影貼圖只能保證光線原點(接收者畫素)周圍的取樣將被呈現。當演算法遍歷光線時,它可能會遇到未對映的頁(陰影資料不存在)。我們使用了多種技巧來減少這種影響,包括稍微擴充套件頁對映,並在迭代過程中進行各類回退(fallback)。但即便如此,由於頁缺失而產生的瑕疵也會偶爾發生,在螢幕邊緣放大軟半影時尤其如此。這些瑕疵將表現為陰影區域的噪點型別的光洩漏。

和VSM的其他侷限性一樣,透過將半影尺寸保持在合理範圍內,避免陰影覆蓋螢幕的大部分割槽域,就能避免此類問題。

定向光源的裁剪圖

單張虛擬陰影貼圖無法提供足夠的解析度來覆蓋大型區域。定向光源使用裁剪圖(Clipmap)結構來擴充套件攝像機周圍的範圍,每個裁剪圖級別都有其單獨的16K VSM。每個裁剪圖等級的解析度相同,但覆蓋半徑是前一個的兩倍。

UE5 虛擬陰影貼圖 (VirtualShadowMaps)的優勢和侷限性

定向光源裁剪圖的視覺化效果

UE5 虛擬陰影貼圖 (VirtualShadowMaps)的優勢和侷限性

VSM頁的視覺化效果

預設情況下,裁剪圖的6級到22級是分配過的VSM頁表格。這意味著預設設定下,細節豐富的裁剪圖覆蓋了攝像機位置周圍64釐米(2^6釐米)的範圍;範圍最廣的裁剪圖覆蓋了40公里(2^22釐米)的範圍。假如虛擬裁剪圖等級中沒有內容,其開銷將十分微小,因此這些預設設定能很好地覆蓋攝像機附近擁有較高解析度的大型場景。

使用控制檯變數

r。Shadow。Virtual。Clipmap。FirstLevel

r。Shadow。Virtual。Clipmap。LastLevel

可調整第一級和最後一級。

分配到給定畫素的解析度是一個關於裁剪圖原點(攝像機位置)距離的函式。你可以使用控制檯命令

r。Shadow。Virtual。ResolutionLodBiasDirectional

來偏移定向光源的虛擬陰影貼圖的解析度。假如值為0,則將根據攝像機的透視投影來選擇所需的解析度。

當陰影投射到的表面與光線方向幾乎平行時,仍然可能出現投影鋸齒(projective aliasing),即使在高解析度下也是如此,但可以透過調整解析度來部分減輕這種情況。就像紋理中的Mip偏移一樣,將值 -1 會使陰影的解析度加倍,但也會帶來相應的效能變化。預設值 -0。5 足以滿足很多場景的需求;但針對擁有高投影抗鋸齒(由於低光照角度或諸多平坦、平行表面)或高對比度陰影的場景,可能需要進一步減小它。

區域性光源

聚光源使用單個16K VSM和一個Mip鏈來處理陰影的細節等級,而非使用裁剪圖。類似的,點光源使用的立方體貼圖中,沒張面都是16K VSM。

與傳統陰影貼圖相比,區域性光源顯著提高了解析度。對於非常大的區域性光源來說,虛擬解析度有可能會耗盡。在這些情況下,應注意儘可能使用定向光源。

UE5 虛擬陰影貼圖 (VirtualShadowMaps)的優勢和侷限性

被聚光源照亮的場景

UE5 虛擬陰影貼圖 (VirtualShadowMaps)的優勢和侷限性

聚光源的VSM頁

透過將螢幕畫素的大小投影到陰影貼圖空間中,挑選合適的MIP等級。與定向光源一樣,你可以使用控制檯變數

r。Shadow。Virtual。ResolutionLodBiasLocal

來調整區域性光源的解析度。

在搶先體驗版中,還無法針對單個光源的解析度進行控制,但可能會在未來版本中新增。

快取

複用上一幀的陰影貼圖頁(shadow map page)是保證VSM高效運作的關鍵,這點在複雜場景中尤其如此。快取會預設啟用,但可以使用控制檯變數

r。Shadow。Virtual。Cache

關閉,以便進行除錯。

目前,我們的快取無效化策略還很保守——如果光源發生移動,光源的所有快取頁都將失效。如果有一個緩慢移動的光源,或一個能夠改變晝夜的定向光源,VSM將不會進行有效快取。

在晝夜變化這類情況下,建議將每次的變動量“適當量化”,從而允許快取頁在一段幀數內能持續存在,因為方向上的微小差異不會很明顯。

類似地,某個快取頁的投影區域的物件移動後,該頁將無效,這其中包括剛體運動、骨骼動畫,以及所有用到了“世界位置偏移(WPO,World Position Offset)”的材質。如果要檢視哪些物件會導致陰影失效,辦法是使用關卡視口中

顯示 > 視覺化

中的

只繪製導致VSM失效的幾何體(Draw only Geometry Causing VSM Invalidation)

UE5 虛擬陰影貼圖 (VirtualShadowMaps)的優勢和侷限性

由於頁只會針對螢幕上的畫素渲染,因為移動或去除遮擋物後導致攝像機的可視性發生變化,就會顯示需要渲染的新的頁。一般來說,只要攝像機移動相對平穩,它就不是導致新頁出現的主要來源。此外,需要注意的是在物體近距離內發生的快速移動、大的遮擋物,以及攝像機鏡頭切換。

在搶先體驗版之後,快取還應透過以下方式改良:

將頁中的靜態幾何體與動態幾何體分開快取,使得單個移動物體不需要重新渲染它所覆蓋的頁中的所有靜態幾何體。

新增優先順序系統和逐幀更新預算,以便更好地控制渲染陰影的開銷,例如在太多頁需要更新時,允許暫時降低陰影解析度。

粗頁

深度緩衝分析是用於識別哪些分頁需要渲染的主要方法。不過,有些系統需要在更加任意的位置上對陰影進行取樣,例如體積霧和正向渲染半透明度。大多數系統只需要低解析度陰影資料(這些資料經過其他資料結構的篩選和模糊)。

為了應對這類情況,我們會使用

粗頁(Coarse Pages)

這類標記來確保整個域中至少有低解析度陰影資料可用於取樣。區域性光源會標記根MIP頁;定向光源會以各種低細節等級標記一系列頁,從而生成一些粗略的裁剪圖。

某些場景下,粗頁可能會產生效能問題。對於非Nanite動態幾何體而言尤其如此,因為它們能在大型空間區域上有效地渲染低解析度陰影,這可能造成繪製呼叫(draw-call)瓶頸。

如果不需要,可以用

r。Shadow。Virtual。MarkCoarsePagesLocal

關閉區域性光源的粗頁。

可以用

r。Shadow。Virtual。MarkCoarsePagesDirectional

關閉定向光源的粗頁,或使用

r。Shadow。Virtual。FirstCoarseLevel

r。Shadow。Virtual。LastCoarseLevel

修改被標記的粗頁的裁剪圖等級的範圍。

在未來的版本中,我們將提供更好的解決方案,例如提前根據區域性頁標記一些效果,而不是使用目前相對保守的粗頁。

GPU分析和最佳化

虛幻引擎提供了用於檢查專案效能的工具。GPU效能分析工具(或平臺專屬工具)能為你追蹤和除錯效能提供一個良好的平臺。

VSM開銷將顯示在兩個主要的效能桶(performance bucket)中:陰影深度和陰影投射。

請注意,用於列出統計資料的命令(如

stat gpu

和相關計數器)提供的計時有可能不可靠,專案效能受CPU限制的情況下尤其如此。

陰影深度

陰影深度(Shadow Depths)

這類開銷是指將幾何體渲染到陰影貼圖中的開銷。

UE5 虛擬陰影貼圖 (VirtualShadowMaps)的優勢和侷限性

RenderVirtualShadowMaps

這個類別包含所有與Nanite幾何體渲染到VSM中相關的內容。所有定向光源都在單個Nanite通道中渲染,所有區域性光源都在第二個通道中渲染。

RenderVirtualShadowMapsHw

負責處理非Nanite幾何體的渲染。每個可見光源都有一個單獨的通道(各種物件和例項擁有單獨的繪製呼叫,這點與傳統陰影貼圖渲染相同)。

UE5 虛擬陰影貼圖 (VirtualShadowMaps)的優勢和侷限性

圖集(Atlas)

立方體貼圖(Cubemap)

與其他類似通道(包括VSM通道),都只是渲染傳統陰影貼圖。在虛擬陰影貼圖的路徑中,仍有少部分型別的幾何體不受支援;此類幾何體型別遵循傳統路徑。

對於VSM不支援的幾何體型別而言,由於很少或無渲染幾何體,因此其通道的開銷很低。在VSM支援這些幾何體型別後,這些通道與相關記憶體分配將消失。

陰影深度通道的開銷(使用VSM)與需要渲染的陰影頁數量有關,以及與需要渲染到它們中的幾何體數量有關。相較Nanite幾何體,將非Nanite幾何體渲染到VSM的開銷更高。因此,建議讓所有受支援的幾何體啟用Nanite,包括低模。唯一例外是那些Nanite虛擬幾何體暫不支援的功能。

瞭解正在渲染的分頁數量

螢幕上顯示的VSM頁資料能讓使用者瞭解分頁的使用數量,幫助他們尋求問題的潛在解決方案。

連著使用以下控制檯變數來啟用資料:

r。ShaderPrintEnable 1

r。Shadow。Virtual。ShowStats 1

UE5 虛擬陰影貼圖 (VirtualShadowMaps)的優勢和侷限性

UE5 虛擬陰影貼圖 (VirtualShadowMaps)的優勢和侷限性

陰影深度中的效能降低通常與大量使用分頁和大量的動態失效有關(這會導致VSM的快取不足)。總頁數取決於能夠影響螢幕上各畫素的平均光源的數量。你可以透過降低螢幕解析度、陰影解析度(使用控制檯變數來控制解析度LOD偏差)、光照範圍、或陰影投射光源的數量來降低它們。

降低快取失效的最好方法是首先顯示會導致失效的問題(參見快取),然後找到不需要移動的、會投射陰影的物件。一個使用了世界位置偏移的材質就足以觸發動態失效。因此,建議透過LOD切換,讓物件在較遠距離時切換為無WPO的材質。

陰影投射(Shadow Projection)

是使用陰影貼圖光追取樣陰影貼圖產生的開銷。這些通道位於

ShadowedLight

之下,通常每個相關光源都有一個VSM投影通道。產生最高開銷的通道一般都是

VirtualShadowMapProjection

中的主SMRT迴圈。其餘的開銷相對較低。

該部分中描述的VSM投影通道不同於下文中介紹的試驗性單通道投影。

UE5 虛擬陰影貼圖 (VirtualShadowMaps)的優勢和侷限性

陰影投射取決於整個螢幕上獲取的陰影貼圖取樣的總數;而效能並不取決於分頁或快取的數量。

使用SMRT時可總結出以下幾條:

每個畫素的平均光源(Average lights per pixel)

螢幕主區域涉及的光源越多,渲染開銷就越高。那些只涉及螢幕少量區域的光源儘管開銷較低,但是仍有部分固定開銷。

應注意避免螢幕上的大部分畫素被幾個大型光源佔用。

每個畫素的光線(Rays per pixel)

陰影的可見柔和度會因為光線數量的調整而對效能產生影響。在降低光線數量和取樣數量前,請先嚐試降低區域性光源的源半徑或定向光源的源角度。

請參見此頁的光追陰影貼圖部分,瞭解如何使用控制檯變數來調整區域性光源和定向光源的最大光線數。

如果VirtualShadowMapProjection的分析類別為RayCount:Static,則會採用固定使用緩慢路徑。這也可能是正在使用DX11的標誌,通常情況下不推薦。

每條光線取樣數

參見本文的光追陰影貼圖部分,瞭解如何使用控制檯變數來調整區域性光源和定向光源的最大光線數。

一般而言,這時的陰影投射開銷比快取開銷更易控制。陰影投射擁有若干控制檯變數和引數,可在陰影柔和度、噪點和效能之間取得平衡。

單通道投影

該功能為

試驗性

功能。

雖然較小光源的開銷較低,它們仍有部分的固定通道開銷。透過開發單通道陰影投射解決方案,該問題已得到解決。在該方案中,場景中的多數區域性光源可在一條通道中有效計算它們的陰影。之後可使用群集著色(clustered shading)來一次性應用來自這些光源的陰影效果。

你可以使用控制檯變數

r。UseClusteredDeferredShading 1

r。Shadow。Virtual。OnePassProjection 1

來啟用該試驗性路徑。對於擁有大量小型區域性光源的場景而言,這可以大幅提升效能。

在下圖中,左側顯示的是逐光源的陰影投射,而右側的是單通道投影。

UE5 虛擬陰影貼圖 (VirtualShadowMaps)的優勢和侷限性

由於搶先體驗版中存在的一些問題,目前單通道投影在

NonShadowedLights

類別下顯示,但兩種情況下輸出的影象完全相同。

該通道目前仍在開發中,基於以下幾項原因預設禁用:

多項光照功能尚不支援,在該通道中被忽略(例如光照函式和IES效果)。對於可用功能,新路徑將支援此類功能。假如功能不支援,則會退回使用當前通道。

每個螢幕瓦片有10個陰影光源的限制。任何額外光源將被視為“無陰影”。在未來版本中,該限制將得到改善並更為靈活。

目前,每畫素每光源使用3個位元位來編碼衰減。因此,在“單通道投影(One Pass Projection)”路徑中,最多隻能顯示7條SMRT光線。在搶先體驗版之後的版本中,仍然可能會保留這個方法,但是編碼很可能會直接基於SMRT光線數量設定進行調整。

在搶先體驗版中,這條路徑主要是充當一個概念證明,用於為那些有許多區域性光源的場景計和評估算效能。一旦解決了當前的限制,它將成為新的預設路徑。

支援平臺

目前,PlayStation 5、Xbox Series S|X,以及顯示卡達到同等配置、使用DirectX 11或12最新驅動的PC都支援虛擬陰影貼圖:

NVIDIA:Maxwell顯示卡或更新系列

AMD:GCN顯示卡或更新系列

VSM能夠基於DirectX 11工作,但效能會顯著降低。強烈建議使用DirectX 12以發揮最大效能。

搶先體驗版的已知問題

搶先體驗版中的虛擬陰影貼圖仍在積極開發中。目前,它們的使用存在諸多已知的問題和侷限性,它們當前針對的是高階PC和次世代主機。我們將在未來的引擎版本中提升它的可擴充套件性。

動態GPU資源的溢位

大多數VSM管線在GPU上執行,這為臨時資源的動態分配帶來了挑戰。因此,目前某些情況可能導致溢位,例如一些複雜場景或複雜光照情況,這有可能會導致陰影瑕疵。快取有可能會導致存在瑕疵的陰影分頁被快取,導致這類問題更明顯。

增加物理分頁的最大數量

可能溢位的首個資源是分配給VSM的物理分頁的總數。透過同時使用控制檯變數

r。ShaderPrintEnable 1

r。Shadow。Virtual。ShowStats 1

可以快速識別此類情況。

UE5 虛擬陰影貼圖 (VirtualShadowMaps)的優勢和侷限性

如果

分頁

的數量超過

最大頁(Max Pages)

,則某處可能會出現瑕疵。有時,這在視覺上表現為棋盤格圖案,或損壞/丟失陰影。解決方案是增加物理分頁的最大數量(預設為2048)。使用控制檯變數

r。Shadow。Virtual。MaxPhysicalPages

可進行此操作。增加物理分頁的數量將提高VRAM的使用率,但在擁有許多光源或陰影貼圖解析度較高的場景中可能需要進行此操作。

錯誤的陰影快取

更微妙的是,某些Nanite的中間緩衝區在渲染陰影頁時可能會溢位,從而導致幾何體缺失。這類問題通常更微妙,因為它們與每幀必須渲染的新分頁的數量、以及渲染到其中的幾何體的數量有關。

渲染可能會以穩定的速度工作,但鏡頭切換或動態幾何體可能會突然導致大量分頁被渲染,從而導致溢位,並在之後形成錯誤的快取陰影。

如果你懷疑出現此類問題,可透過以下方法檢查:

r。Shadow。Virtual。Cache 0

禁用VSM快取。

在控制檯中輸入

NaniteStats VSM_Directional

(針對定向光源)或

NaniteStats VSM_Perspective

(針對區域性光源)。這會在啟用的關卡視口中顯示Nanite和VSM資料。

UE5 虛擬陰影貼圖 (VirtualShadowMaps)的優勢和侷限性

如果

候選(Candidates)

或可見

群集(Clusters)

值超過由

r。Nanite。MaxCandidateCluster

(預設值為8388608)或

r。Nanite。MaxVisibleClusters

(預設為2097152)設定的值,則可能發生損壞。更多資訊請參閱Nanite虛擬幾何體。

在許多情況下,當啟用快取後,幀的數值將不會超過限制。但是,如果它們在快取禁用時超過了限制,那麼某一幀就可能使大部分(或全部)快取失效,進而導致渲染損壞的快取資料。

在這種情況下,如果VRAM允許,應該增加

MaxCandidateCluster

MaxVisibleClusters

這兩個控制檯變數。

虛擬陰影貼圖品質

VSM的品質在大多數情況下都很好,但仍然存在一些侷限性。

材質

就材質而言,針對次表面和光線傳播的陰影效果尚未實現。如果一個材質用到了它們,那麼這個材質的陰影效果就和不透明物件的陰影效果一樣。

陰影解析度

與傳統的陰影貼圖相比,VSM的解析度顯著提升,但是光源角度很小(投影鋸齒)時、或者區域性光源超大時,都可能耗盡可用的虛擬解析度。這可以呈現為盒狀陰影和偏差問題,具體取決於幾何體表面。定向光源的裁剪圖不太容易耗盡解析度,但極窄的攝像機FOV最終也會耗盡這些解析度。

沒有簡單的方法來解決陰影貼圖的投影鋸齒問題。即便使用VSM也必須小心。

光源角度較低的定向光源

光源角度極低的定向光源(例如剛剛高於地平線)可能會導致一個罕見問題。由於快取頁中的深度每幀都重新縮放,當快速靠近某個幾乎平行於光源方向的表面時,可能會失去精度。

如果懷疑出現此類瑕疵,請嘗試使用控制檯變數

r。Shadow。Virtual。Cache 0

來禁用VSM快取,再檢視問題是否消失。可能還需要排除GPU資源溢位的情況。

低光源角度定向光源的這個特殊問題將在未來的引擎版本中得到修復。

光源引數使用者介面

我們對於VSM的一個目標是讓它的引數儘可能少,因此使用虛擬陰影貼圖時,光源的很多陰影引數都會被忽略。例如,陰影偏差(shadow bias)、Cascades、內嵌陰影(inset shadow)和固定光源相關的引數會被忽略。在搶先體驗版中,這些引數仍然可見。但在未來版本中,當專案使用虛擬陰影貼圖(而非傳統陰影貼圖時),我們打算隱藏這些引數。

貼圖檢查警告

虛擬陰影貼圖會引起一些錯誤的貼圖檢查警告資訊:

啟用VSM後,

需要重建光照(Lighting needs to be rebuilt)

訊息不會出現——即便此時你的確需要重新構建光照(此時未使用Lumen動態全域性光照和反射功能)。雖然VSM啟用後,固定光源的直接光照是動態計算的,但固定光源的間接光照仍會烘培。

關於**預分配**的警告可以忽略,因為使用VSM時它們不存在相關性。

僅繪製導致VSM無效的幾何體

在“僅繪製導致VSM無效的幾何體”這一視覺化模式中,可能會包含一些實際上不會使任何內容失效的效果和粒子。在之後的引擎版本中,這類不會導致失效但仍會出現的內容將被移除。