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에서 셰이더 컴파일을 다시 시작합니다.

분석 및 트레이드오프

이 구현은 개발자가 고려해야 할 여러 장점과 단점을 제공합니다:

장점

  • 일관성: 모든 광원 유형에서 작동하며 포스트 프로세스 솔루션과 관련된 "추측 게임"을 피합니다.
  • 성능: 구현이 매우 가볍고 픽셀 셰이더에 거의 영향을 주지 않는 오버헤드만 추가합니다.
  • 호환성: 엔진 소스 코드를 수정할 필요 없이 런처 버전에서도 사용할 수 있습니다.

단점

  • 전역 설정: 포화도는 전체적으로 전역 설정되며, 광원별 또는 씬별로 조정할 수 없습니다.
  • 소프트 섀도우 필요: 넓은 페넘브라가 있을 때만 효과가 보입니다.
  • 동적 전용: 이 구현은 동적 광원에만 적용되며 베이크된 조명에는 적용되지 않습니다.
  • 재질 의존성: 효과가 포화도를 증가시키는 데 기반하므로, 그레이스케일이거나 이미 완전히 포화된 표면에는 눈에 띄는 영향을 주지 않습니다.

이론적 배경 및 토론

이 구현은 실용적인 "핵"이지만, 효과의 물리적 근거는 기술 아티스트들 사이에서 논의되는 주제입니다. 일부는 이것이 특정 재질이 강렬한 조명 아래에서 "빛나는" 방식을 모방한다고 제안합니다. 즉, 표면의 조명된 부분에서 그림자 부분으로 번지는 빛이 반사된 빛보다 더 포화된다는 것입니다.

이 기법에 대한 토론에서 커뮤니티 멤버들이 언급한 바와 같이:

"일부 물체는 강하게 조명될 때 ‘빛나며’, 그 빛은 반사된 빛보다 더 색상이 강합니다. 따라서 조명이 경계가 뚜렷하면 페넘브라가 더 강하게 조명된 부분의 빛에 의해 포화될 수 있습니다."

이는 이 효과가 엄밀한 물리 시뮬레이션보다는 스타일적 선택에 가깝지만, PenumbraSaturation 값을 신중하게 조정하여 인공적인 느낌을 피한다면 그림자 전환에 시각적 깊이와 "블룸"을 추가하는 강력한 도구가 될 수 있음을 시사합니다.

Sources