在 Unreal Engine 5 中實作彩色陰影半影

在高階即時渲染中,光與影之間的過渡——半影,通常只是一個簡單的線性漸層。雖然在許多情況下這在物理上是合理的,但有時會感覺過於死板,缺乏在風格化電影或特定自然現象中看到的藝術「衝擊」感。"彩色陰影半影"(或彩色陰影終止線)效果透過在過渡區域加入飽和度,創造出光與影交界處更為鮮豔且視覺上有趣的邊緣。

此技術受到 Romain Durand 的作品啟發,並由 Shahriar Shahrabi 在理論上記錄,重點在於在半影內部操作表面顏色,以模擬更飽和的光暈或光線滲透。

UE5 中的技術實作

與其將此作為後處理效果實作——後處理往往需要猜測光/影的數值,且在 Lumen 或晝夜循環等動態系統中可能會出現問題——此方法直接編輯引擎著色器。這確保效果能在所有光源類型上運作,且計算成本極低。

Substrate 的實作

對於使用 Substrate 框架的使用者,修改發生於 Engine\Shaders\Private\Substrate\SubstrateDeferredLighting.ush

找到大約在 UE 5.7 第 190 行的以下程式碼: float3 SpecularLuminance = BSDFEvaluate.IntegratedSpecularValue * LightData.SpecularScale;

緊接其後插入以下程式碼區塊:

// Colored shadow penumbra - Start
const float PenumbraSaturation = 4.0f; // Configure this to your liking (1.0 means no change)

float3 LuminanceFactors = float3(0.3f, 0.59f, 0.11f); // Luminance factor for desaturation
float3 PenumbraColor = dot(DiffuseLuminance, LuminanceFactors); // Desaturate
PenumbraColor = lerp(PenumbraColor, DiffuseLuminance, PenumbraSaturation); // Apply saturation
DiffuseLuminance = lerp(DiffuseLuminance, PenumbraColor, 1.0f - BSDFShadowTerms.SurfaceShadow); // Blend
// Colored shadow penumbra - End

標準延遲光照的實作

對於未使用 Substrate 的情況,編輯 Engine\Shaders\Private\DeferredLightPixelShaders.usf

找到大約在 UE 5.7 第 397 行的以下程式碼: OutColor += Radiance;

在其後立即插入以下程式碼片段:

// Colored shadow penumbra - Start
const float PenumbraSaturation = 4.0f; // configure this to your liking (1.0 means no change)

float3 LuminanceFactors = float3(0.3f, 0.59f, 0.11f); // Luminance factor for desaturation
float3 PenumbraColor = dot(OutColor.xyz, LuminanceFactors); // Desaturate
PenumbraColor = lerp(PenumbraColor, OutColor.xyz, PenumbraSaturation); // Apply saturation
OutColor.xyz = lerp(OutColor.xyz, PenumbraColor, 1.0f - SurfaceShadow); // Blend
// Colored shadow penumbra - End

保存檔案後,使用 Ctrl + Shift + . 重新啟動 Unreal Engine 中的著色器編譯。

分析與取捨

此實作提供了多項優勢與缺點,開發者應加以考量:

優點

  • 一致性: 可在所有光源類型上運作,避免了後處理解決方案常見的「猜測」問題。
  • 效能: 此實作極為輕量,對像素著色器的額外負擔可忽略不計。
  • 相容性: 可於引擎的 Launcher 版本使用,無需自行修改引擎原始碼。

缺點

  • 全域設定: 飽和度為全域參數,無法針對單一光源或場景單獨調整。
  • 需要柔和陰影: 只有在存在寬廣半影時效果才會顯現。
  • 僅限動態光源: 此特定實作僅適用於動態光源,對烘焙光照無效。
  • 材質依賴性: 由於效果依賴提升飽和度,對灰階或已完全飽和的表面不會產生可見影響。

理論背景與討論

雖然此實作是一種實用的「小技巧」,但其物理基礎仍在技術藝術家之間引發討論。有些人認為它模擬了某些材質在強光下「發光」的方式,即光線從受光表面滲透至陰影部分時,其飽和度高於反射光本身。

正如社群成員在討論此技術時所指出的:

"Some things will ‘glow’ when strongly illuminated, and the glow is more colored than the reflected light, so if the illumination has a hard edge then the penumbra can end up saturated by the more strongly illuminated part’s glow."

這暗示此效果更像是一種風格化選擇,而非嚴格的物理模擬,只要仔細調整 PenumbraSaturation 值以避免過於人工的外觀,它仍是一個為陰影過渡增添視覺深度與「光暈」的強大工具。


SUMMARY: 一份技術指南,說明如何透過編輯引擎著色器,在 UE5 中增強陰影過渡,創造飽和的彩色半影區域。

TITLE: 在 Unreal Engine 5 中實作彩色陰影半影

Sources