LYSC
Unreal Engine

언리얼 엔진 나나이트(Nanite)와 루멘(Lumen) 실전 적용기

2024.05.22

고해상도 에셋을 최적화 없이 화면에 렌더링하는 나나이트의 강력함과 실시간 글로벌 일루미네이션을 적용하며 겪은 프레임 드랍 해결기.

차세대 렌더링의 핵심: 나나이트(Nanite)

언리얼 엔진 5(UE5)의 등장은 게임 개발 워크플로우를 근본적으로 바꿨습니다. 그 중심에는 가상화된 마이크로폴리곤 기하학 시스템인 '나나이트'가 있습니다. 과거에는 수백만 개의 폴리곤을 가진 에셋을 게임에 넣기 위해 수동으로 LOD(Level of Detail)를 제작하고, 노멀 맵에 디테일을 굽는 '베이킹' 과정이 필수적이었습니다. 하지만 나나이트는 이 과정을 과거의 유물로 만들었습니다.

나나이트는 수억 개의 폴리곤을 가진 영화 수준의 에셋을 직접 임포트해도 실시간으로 처리합니다. 이는 화면의 픽셀 단위로 클러스터를 나누고, 현재 카메라에서 보이는 디테일만큼만 지능적으로 렌더링하기 때문입니다. 실제 프로젝트에 적용해본 결과, 수백만 폴리곤의 바위 에셋 수천 개를 배치해도 드로우콜 부하가 거의 늘어나지 않는 마법 같은 경험을 할 수 있었습니다.

실시간 빛의 향연: 루멘(Lumen)

나나이트가 형태의 제약을 없앴다면, '루멘'은 빛의 제약을 없앴습니다. 루멘은 완전한 실시간 글로벌 일루미네이션(GI) 및 리플렉션 시스템입니다. 기존의 '라이트 베이킹(Static Lightmaps)' 방식은 그림자와 간접광의 퀄리티는 훌륭했지만, 라이트 하나를 수정할 때마다 몇 시간씩 기다려야 했고 동적인 환경 변화를 반영할 수 없었습니다.

루멘을 적용하면 태양의 위치를 바꾸는 즉시 실시간으로 실내에 퍼지는 간접광이 계산됩니다. 하지만 이 강력함에는 대가가 따릅니다. 루멘은 GPU 리소스를 매우 많이 소모하며, 특히 60FPS를 목표로 하는 프로젝트에서는 세밀한 튜닝이 필수적입니다. 메쉬 디스턴스 필드(Mesh Distance Fields)의 생성 범위와 품질을 조절하는 것이 성능 최적화의 첫 걸음입니다.

C++을 활용한 실시간 렌더링 품질 제어

게임의 상황에 따라 루멘의 품질을 동적으로 조절하여 프레임을 확보하는 기능을 C++로 구현할 수 있습니다. 예를 들어, 전투가 치열해지는 상황에서는 품질을 낮추고, 정적인 탐험 구간에서는 품질을 높이는 방식입니다.

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "HAL/IConsoleManager.h"

// 렌더링 품질을 동적으로 조절하는 매니저 클래스
void URenderOptimizer::SetLumenQuality(int32 QualityLevel)
{
    // 0: Low, 1: Medium, 2: High, 3: Epic
    IConsoleManager& ConsoleMgr = IConsoleManager::Get();

    // 루멘 씬 조명 업데이트 속도 조절
    ConsoleMgr.FindConsoleVariable(TEXT("r.Lumen.SceneLighting.UpdateSpeed"))->Set(QualityLevel * 0.5f);

    // 루멘 리플렉션 품질 설정
    ConsoleMgr.FindConsoleVariable(TEXT("r.Lumen.Reflections.Quality"))->Set(QualityLevel);

    // 하드웨어 레이트레이싱 사용 여부 (사양에 따라 분기)
    if (QualityLevel >= 3)
    {
        ConsoleMgr.FindConsoleVariable(TEXT("r.Lumen.HardwareRayTracing"))->Set(1);
    }
    else
    {
        ConsoleMgr.FindConsoleVariable(TEXT("r.Lumen.HardwareRayTracing"))->Set(0);
    }

    UE_LOG(LogTemp, Warning, TEXT("Lumen Quality Set to: %d"), QualityLevel);
}

실전 적용 시 발생한 문제와 해결책

프로젝트 초기, 나나이트와 루멘을 활성화하자마자 프레임이 30FPS 이하로 곤두박질치는 현상을 겪었습니다. 분석 결과, 원인은 세 가지였습니다.

첫째, **오버드라이브(Overdraw)** 문제입니다. 나나이트 메쉬라 할지라도 투명도(Translucency)가 들어간 잎사귀 등을 대량 배치하면 픽셀 오버드라이브로 인해 성능이 급격히 저하됩니다. 이를 위해 투명 마스크 대신 실제 폴리곤으로 형태를 딴 나나이트 메쉬를 사용하여 해결했습니다.

둘째, **루멘 하드웨어 레이트레이싱** 부하입니다. 최신 그래픽 카드가 아닌 경우 소프트웨어 레이트레이싱으로 전환하거나, 'Lumen Scene'의 해상도를 낮추어 프레임을 확보했습니다.

셋째, **가상 섀도 맵(Virtual Shadow Maps)** 최적화입니다. 나나이트와 찰떡궁합인 VSM은 매우 정교한 그림자를 제공하지만, 동적인 오브젝트가 너무 많으면 캐싱 비용이 증가합니다. 정적인 배경 오브젝트는 VSM 캐시를 적극 활용하도록 설정했습니다.

마치며: 새로운 시대를 준비하며

나나이트와 루멘은 단순히 그래픽을 좋게 만드는 툴이 아닙니다. 개발자가 '기술적 한계'에 갇히지 않고 '창의성'에만 집중할 수 있게 해주는 혁명입니다. 물론 모바일이나 저사양 기기 타겟팅에는 여전히 제약이 많지만, PC와 콘솔 플랫폼에서의 개발 경험은 이전과는 비교할 수 없을 만큼 쾌적해졌습니다. LYSC 스튜디오는 이러한 최신 기술을 적극 도입하여, 유저들에게 압도적인 시각적 경험을 제공할 수 있도록 계속해서 연구해 나갈 예정입니다.

심화 분석: 기술적 도전과 해결책

언리얼 엔진 5의 나나이트(Nanite)와 루멘(Lumen)은 혁신적이지만, 하드웨어 요구 사양이 높습니다. 이를 보완하기 위해 가상 쉐이딩(Virtual Shading)과 적응형 해상도 기술을 적절히 혼합하여 사용해야 합니다. 또한 월드 파티션(World Partition)을 통한 효율적인 맵 관리가 필수적입니다.

기술적 구현의 디테일

C++를 기반으로 핵심 로직을 작성하고, 블루프린트는 상위 레벨의 이벤트 처리나 단순한 연동에만 사용하여 성능 손실을 방지했습니다. 또한 데이터 테이블(Data Table)과 비헤이비어 트리(Behavior Tree)를 활용해 복잡한 시스템과 AI를 구조화했습니다.

성능 벤치마크 및 최적화 지표

루멘 적용 시에도 최적화된 설정을 통해 RTX 2060 환경에서 4K 해상도로 안정적인 30FPS 이상을 확보할 수 있었습니다. 나나이트를 통한 수억 개의 폴리곤 처리는 이전 버전과는 차원이 다른 시각적 디테일을 선사했습니다.

실무 적용 시 주의사항

블루프린트(Blueprint)는 강력하지만 복잡한 로직은 C++로 이전하여 성능을 확보하는 것이 좋습니다. 또한 엔진의 소스코드를 분석하여 내부 작동 원리를 이해하면 훨씬 고도화된 최적화가 가능해집니다.

Drag to Rotate Cube
작성자 프로필

LYSC Studio

1인 게임 개발과 웹 기술에 관심이 많은 개발자입니다. 경험을 통해 배운 것을 공유하고, 함께 성장하는 것을 즐깁니다.