TECHARTNOMAD | TECHARTFLOWIO.COM

UNREAL ENGINE

모바일 셰이더 구조 분석 및 정리.1

jplee 2025. 2. 5. 21:03

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 ...)를 통해 효율적인 성능 관리가 가능하다.