MobileBasePassPixelShader.usf
MobileLightingCommon.ush
는 언리얼 엔진의 모바일 쉐이딩 파이프라인에서 가장 핵심이 되는 쉐이더 코드 파일이다. 이 파일은 모바일 플랫폼에서 최적의 성능을 발휘하기 위해 정교하게 설계된 조명 계산 시스템과 효율적인 렌더링 파이프라인을 체계적으로 구현한다. 이어지는 내용에서 이 파일의 구조와 주요 기능을 상세히 분석해보도록 한다.
1. 파일 개요
MobileLightingCommon.ush
는 모바일 환경에 특화된 핵심적인 조명 계산 기능을 제공하는 통합 쉐이더 파일이다. 이 파일은 Main
함수를 중심으로 다양한 조명 함수들과 최적화된 데이터 구조를 정의하고 있으며, 이를 통해 모바일 디바이스에서도 효율적이면서 시각적으로 뛰어난 조명 처리를 구현할 수 있도록 설계되었다.
주요 목적
- 모바일 환경의 하드웨어 특성을 고려하여 최적화된 고효율 조명 처리 시스템을 구현하며, 이를 통해 배터리 소모와 발열을 최소화한다.
- 다양한 조명 유형과 머티리얼 상호작용을 체계적으로 관리하여, 풍부한 시각적 표현과 성능 사이의 최적의 균형점을 찾는다.
- 전역 조명, AO(Ambient Occlusion), 반사, 라이트맵, 점광원 등의 요소를 통합적으로 처리하여 일관된 조명 품질을 보장한다.
2. 주요 기능 분석
A. 조명 데이터 정의 및 참조
파일의 상단부에서는 MobileBasePass
구조체를 기반으로 최적화된 조명 데이터 구조를 정의하며, 이를 통해 효율적인 메모리 사용과 빠른 데이터 접근이 가능하도록 설계되어 있다.
#define ForwardLightData MobileBasePass.Forward
#define ReflectionStruct MobileBasePass.ReflectionsParameters
#define AmbientOcclusionTexture MobileBasePass.AmbientOcclusionTexture
ForwardLightData
: 정방향 조명을 위한 데이터.ReflectionStruct
: 반사 데이터 구조체 정의.- AO 텍스처 샘플링: 환경광 차폐(AO) 데이터를 모바일 렌더링에 반영.
이러한 정의는 나중에 조명 함수들(예: GetSkyLighting
, GetPrecomputedIndirectLightingAndSkyLight
)에서 활용.
B. 머티리얼 블렌딩 처리
쉐이더에서 머티리얼 블렌딩 종류를 처리하기 위한 함수입니다.
half3 FrameBufferBlendOp(half4 Source) {
#if MATERIALBLENDING_SOLID
return Source.rgb;
#elif MATERIALBLENDING_TRANSLUCENT
return (Source.rgb * Source.a) + (Dest.rgb * (1.0 - Source.a));
#elif MATERIALBLENDING_ADDITIVE
return Source.rgb + Dest.rgb;
#endif
}
MATERIALBLENDING_SOLID
: 불투명 재질 처리.MATERIALBLENDING_TRANSLUCENT
: 반투명 처리. Alpha 값을 사용하여 색상을 혼합.MATERIALBLENDING_ADDITIVE
: 소스 색상을 대상 색상에 더하는 형태로 추가.
C. 환경광 및 간접 조명 계산
GetSkyLighting 함수
하늘빛(Environmental Sky Light)의 간접 확산 조명을 계산하는 함수.
void GetSkyLighting(half3 SkyLightColor, half3 WorldNormal, out half3 OutSkyDiffuseLighting, out half3 OutSkySubsurfaceLighting) {
#if ENABLE_SKY_LIGHT
half3 SkyDiffuse = GetSkySHDiffuseSimple(WorldNormal);
OutSkyDiffuseLighting = SkyDiffuse * SkyLightColor;
#endif
}
- Spherical Harmonics(SH)를 사용하는 간단한 하늘 조명 계산.
- 하늘빛 데이터를 World Normal 방향으로 투영하여 조명 색상을 산출.
GetPrecomputedIndirectLightingAndSkyLight 함수
조명 데이터(빛맵, 하늘빛)와 간접 조명을 계산.
void GetPrecomputedIndirectLightingAndSkyLight(...) {
OutDiffuseIndirectLighting = 0;
OutSubsurfaceIndirectLighting = 0;
OutIndirectIrradiance = 0;
// 하늘빛 계산
GetSkyLighting(SkyLightColor, DiffuseDir, ..., OutDiffuseIndirectLighting, OutSubsurfaceLighting);
// Precomputed indirect lighting (ex: lightmaps)
#if LQ_TEXTURE_LIGHTMAP
...
#elif CACHED_POINT_INDIRECT_LIGHTING
...
#endif
}
OutDiffuseIndirectLighting
,OutSubsurfaceIndirectLighting
에 반영된 간접 조명을 추가.- 간접 조명에는 라이트맵(Lightmap) 데이터를 활용하며, 필요에 따라 캐싱된 점광원 데이터도 처리.
D. 픽셀 처리 메인 함수
void Main(...) {
FMaterialPixelParameters MaterialParameters = GetMaterialPixelParameters(Interpolants, SvPosition);
FPixelMaterialInputs PixelMaterialInputs;
// 라이팅 데이터 계산
half MaterialAO = GetMaterialAmbientOcclusion(PixelMaterialInputs);
half Opacity = GetMaterialOpacity(PixelMaterialInputs);
half3 BaseColor = GetMaterialBaseColor(PixelMaterialInputs);
half Roughness = max(0.015625f, GetMaterialRoughness(PixelMaterialInputs));
...
// 전역 조명 (Sky + Indirect) 적용
half3 DiffuseIndirect, SubsurfaceIndirect;
GetPrecomputedIndirectLightingAndSkyLight(..., DiffuseIndirect, SubsurfaceIndirect, ...);
// 최종 라이팅 계산 및 적용
half3 Color = DiffuseIndirect + SubsurfaceIndirect;
Color += GetMaterialEmissive(PixelMaterialInputs);
// 최종 출력값
OutColor = half4(Color, Opacity);
}
- 픽셀 단위로 머티리얼(
PixelMaterialInputs
) 데이터를 수집하고 계산. - AO, Opacity, BaseColor 등 머티리얼의 주요 데이터와 간접 조명을 정리.
- Main 함수의 핵심은 각 픽셀에서 최종 색상을 계산해
OutColor
에 저장하는 것.
E. Substrate 시스템 활용
Substrate
는 최신 쉐이더 시스템으로, 다양한 모델과 다층 조명 처리를 지원합니다.
#if SUBSTRATE_ENABLED
FSubstratePixelHeader SubstratePixelHeader = MaterialParameters.GetFrontSubstrateHeader();
FSubstrateIntegrationSettings Settings = InitSubstrateIntegrationSettings(...);
...
Color = SubstrateMobileForwardLighting(...);
#endif
활성화된 경우 Substrate
를 호출하여 다층 BSDF와 같은 계층적 처리를 통해 조명 데이터를 연산한다.
3. 성능 최적화 요소
- 조건부 정의(
#if ...
)를 통해 필수 기능만 활성화한다- AO, 반사, 추가 조명을 플랫폼별 필요에 따라 선택적 활성화
- 최소한의 샘플링으로 고정 데이터를 처리하는 라이트맵 활용
- Lightmap으로 동적 조명 계산 부하를 감소
- 다양한 블렌딩 모드로 불투명/투명 오브젝트를 효율적으로 처리
- 성능 부하가 큰 고급 쉐이더(
MobileBasePass
)와 Substrate 경로의 선택적 비활성화를 지원
4. 맺음
MobileLightingCommon.ush
는 모바일에 최적화된 고성능 조명 처리와 최적화 기능을 제공한다.
다양한 렌더링 옵션(AO, Reflection, Lightmap)과 머티리얼 블렌딩 모드 사이의 균형을 고려하여 설계되었다.
쉐이더 시스템의 유연성을 극대화하면서도, 조건부 정의(#if ...
)를 통해 효율적인 성능 관리가 가능하다.
'UNREAL ENGINE' 카테고리의 다른 글
.uexp와 .ubulk 파일의 정의와 역할 (0) | 2025.01.04 |
---|---|
[번역] Using physical lighting units with Enlighten and UE4 (6) | 2024.11.06 |
셰이더 함수 분석: Diffuse_Chan (0) | 2024.10.30 |
[소식] Z-emotion 언리얼엔진 업데이트. (1) | 2024.09.27 |
텐센트 PUER TypeScript 라이브러리 (0) | 2024.07.30 |