PART 2 · 강의 6/7

MegaLights

수천 개의 동적 라이트를 효율적으로 관리

01

MegaLights란?

UE5.5+ 대규모 라이트 시스템

MegaLights는 UE5.5에서 도입된 대규모 동적 라이트 시스템입니다. 수천 개의 Point/Spot Light를 그림자와 함께 효율적으로 렌더링합니다.

📌 MegaLights 특징
  • 수천 개의 동적 라이트 지원
  • Virtual Shadow Maps와 통합
  • GPU 기반 라이트 컬링
  • Lumen과 연동 (간접광 기여)
기존 vs MegaLights /* 기존 라이팅 시스템: - 그림자 캐스팅 라이트 수 제한 (~10개 권장) - 각 라이트마다 별도 그림자 맵 - 라이트 수 증가 시 급격한 성능 저하 MegaLights: - 수천 개의 라이트 동시 처리 - 공유 VSM 타일 풀 - GPU 기반 중요도 샘플링 - 화면 타일당 라이트 컬링 */
02

MegaLights 활성화

프로젝트 설정

Project Settings // Project Settings > Engine > Rendering > MegaLights MegaLights: Enable MegaLights: true Max Lights Per Tile: 128 Light Budget: 4096 // 콘솔 변수 r.MegaLights 1 // MegaLights 활성화 r.MegaLights.MaxLightsPerTile 128 // 타일당 최대 라이트 r.MegaLights.Debug 1 // 디버그 시각화

라이트 설정

Point/Spot Light // Point Light / Spot Light Actor Light: Intensity: 5000 (lux) Attenuation Radius: 1000 Use Inverse Squared Falloff: true Shadows: Cast Shadows: true // MegaLights가 VSM 타일 할당 // MegaLights는 자동으로 라이트 중요도 결정 // 화면에서 영향력이 큰 라이트에 우선 그림자 할당
03

C++ 동적 라이트 관리

대량 라이트 생성 및 제어

C++ #include "Components/PointLightComponent.h" #include "Components/SpotLightComponent.h" // 대량 라이트 스폰 시스템 UCLASS() class ALightSpawner : public AActor { GENERATED_BODY() public: UPROPERTY(EditAnywhere) int32 LightCount = 1000; UPROPERTY(EditAnywhere) float SpawnRadius = 10000.0f; UPROPERTY() TArray<TObjectPtr<UPointLightComponent>> Lights; void SpawnLights() { for (int32 i = 0; i < LightCount; ++i) { UPointLightComponent* Light = NewObject<UPointLightComponent>(this); // 위치 랜덤 설정 FVector Offset = FMath::VRand() * SpawnRadius; Light->SetRelativeLocation(Offset); // 라이트 속성 Light->SetIntensity(5000.0f); Light->SetAttenuationRadius(500.0f); Light->SetCastShadows(true); // MegaLights가 관리 Light->SetLightColor(FLinearColor::MakeRandomColor()); // 컴포넌트 등록 Light->SetupAttachment(RootComponent); Light->RegisterComponent(); Lights.Add(Light); } } // 라이트 강도 일괄 조절 void SetAllLightsIntensity(float Intensity) { for (UPointLightComponent* Light : Lights) { if (Light) { Light->SetIntensity(Intensity); } } } // 거리 기반 라이트 활성화/비활성화 void UpdateLightsByDistance(FVector ViewLocation, float MaxDistance) { for (UPointLightComponent* Light : Lights) { if (Light) { float Distance = FVector::Dist( Light->GetComponentLocation(), ViewLocation); Light->SetVisibility(Distance < MaxDistance); } } } };
04

MegaLights 성능 최적화

대량 라이트 환경 최적화

최적화 콘솔 변수 // 라이트 예산 관리 r.MegaLights.Budget 4096 // 최대 라이트 수 r.MegaLights.ShadowBudget 256 // 그림자 있는 라이트 예산 // 타일 기반 컬링 r.MegaLights.TileSize 8 // 화면 타일 크기 r.MegaLights.MaxLightsPerTile 64 // 타일당 최대 라이트 // 그림자 품질 r.MegaLights.ShadowQuality 1.0 // 그림자 품질 (0.0 ~ 2.0) // 통계 stat MegaLights
📌 최적화 체크리스트
  • Attenuation Radius — 필요한 만큼만, 과도하게 크게 설정하지 않기
  • 그림자 선별 — 중요한 라이트만 Cast Shadows 활성화
  • 거리 컬링 — 먼 라이트는 비활성화 또는 강도 감소
  • Static 라이트 — 움직이지 않는 라이트는 Static으로
05

실전 활용 예시

도시, 던전 라이팅

도시/마을

  • 수백 개의 가로등
  • 건물 창문 조명
  • 시간대별 활성화

던전

  • 횃불, 촛불
  • 마법 효과 조명
  • 동적 퍼즐 조명
시간대별 라이트 관리 void ACityLightManager::UpdateLightsForTimeOfDay(float TimeOfDay) { // TimeOfDay: 0.0 = 자정, 0.5 = 정오 bool bIsNight = TimeOfDay < 0.25f || TimeOfDay > 0.75f; for (UPointLightComponent* StreetLight : StreetLights) { if (StreetLight) { // 밤에만 켜기 StreetLight->SetVisibility(bIsNight); if (bIsNight) { // 밤 시간대에 따라 강도 조절 float NightProgress = FMath::Abs(TimeOfDay - 0.5f) * 2.0f; StreetLight->SetIntensity(5000.0f * NightProgress); } } } }
SUMMARY

핵심 요약

  • MegaLights — UE5.5+ 대규모 동적 라이트 시스템
  • VSM 통합 — 공유 타일 풀로 그림자 효율화
  • GPU 컬링 — 화면 타일 기반 라이트 선별
  • 예산 관리 — Budget, ShadowBudget으로 리소스 제어
  • 활용 — 도시 가로등, 던전 조명, 동적 라이팅
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: MegaLights 기본 설정

다수의 로컬 라이트(Point Light, Spot Light)를 배치한 RPG 마을 씬에서 MegaLights를 활성화하세요. 수백 개의 라이트가 있는 야경 씬에서 성능 향상을 stat GPU로 확인하세요.

실습 2: MegaLights 라이트 프로퍼티 설정

각 라이트의 Attenuation Radius, Intensity, Shadow 설정을 조정하여 MegaLights와의 호환성을 최적화하세요. 라이트별 Is MegaLights Eligible 체크를 확인하고 비적합 라이트를 식별하세요.

심화 과제: 대규모 라이팅 씬 최적화

수백 개의 동적 라이트가 있는 RPG 마을/던전에서 MegaLights의 타일 기반 렌더링 효율을 프로파일링하세요. 라이트 채널, 그림자 해상도, 감쇠 반경을 조합하여 최적의 비주얼/성능 밸런스를 찾으세요.