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의 타일 기반 렌더링 효율을 프로파일링하세요. 라이트 채널, 그림자 해상도, 감쇠 반경을 조합하여 최적의 비주얼/성능 밸런스를 찾으세요.