게임 산업 트렌드

2026 GDC 이후 실무 체크리스트: Nanite Foliage와 MegaLights가 바꾼 라이팅 워크플로우

kr-gamedev 2026. 5. 30. 09:01

올해 GDC와 이어진 Unreal Fest, Unity Unite 세션을 정리하다 보면 한 가지 흐름이 또렷하게 보입니다. 작년까지는 "AI 도구를 어디에 끼워 넣을까"가 화두였다면, 2026년은 다시 렌더링 파이프라인의 기본기로 무게추가 돌아왔다는 점입니다. 특히 Unreal Engine 5.7 계열에서 안정화된 Nanite Foliage와 MegaLights는 발표용 데모가 아니라 실제 프로덕션에서 쓸 수 있는 수준으로 올라왔습니다.

문제의식은 분명합니다. 오픈월드 규모가 커지면서 식생(foliage) 드로우콜과 동적 라이트 개수가 프레임 예산을 갉아먹는 구조는 몇 년째 그대로였습니다. 라이트 수십 개만 겹쳐도 셰도우 캐스팅 비용이 폭발하니, 아티스트는 "예쁜 씬"과 "돌아가는 씬" 사이에서 늘 타협해야 했죠. 이번 세션들의 공통된 메시지는 그 타협선을 한 단계 위로 올려준다는 것입니다.

이 글에서는 발표 슬라이드의 수사보다, 실무에서 당장 켜고 끄면서 검증해볼 수 있는 항목 위주로 정리합니다. 프로젝트에 바로 적용할 체크리스트라고 생각하고 따라오면 됩니다.

1. Nanite Foliage: 인스턴스 컬링을 GPU에게 넘기다

기존 식생은 Hierarchical Instanced Static Mesh로 CPU에서 클러스터 단위 컬링을 했습니다. Nanite Foliage는 이 식생 메시 자체를 Nanite 클러스터로 처리해, 디테일이 거리에 따라 연속적으로 줄어들고 컬링이 GPU에서 일어납니다. LOD 팝핑이 사실상 사라지고, 동일 화면에서 처리 가능한 식생 밀도가 크게 늘어납니다.

핵심은 머티리얼 조건입니다. Nanite Foliage는 Pixel Depth Offset이나 World Position Offset 기반의 바람 애니메이션은 허용하지만, 마스크드(Masked) 블렌드 모드의 잎사귀를 다룰 때 비용 특성이 다릅니다. 그래서 켜기 전에 머티리얼을 점검해야 합니다.

// UE C++ : 런타임에 식생 컴포넌트가 Nanite 경로를 타는지 점검
void ANaniteFoliageAuditor::AuditFoliage()
{
    for (TObjectIterator<UStaticMeshComponent> It; It; ++It)
    {
        UStaticMeshComponent* Comp = *It;
        if (!IsValid(Comp) || !Comp->GetStaticMesh())
        {
            continue;
        }

        const bool bNaniteEnabled =
            Comp->GetStaticMesh()->GetRenderData()
            && Comp->GetStaticMesh()->NaniteSettings.bEnabled;

        if (Comp->ComponentTags.Contains(TEXT("Foliage")) && !bNaniteEnabled)
        {
            UE_LOG(LogTemp, Warning,
                TEXT("Foliage mesh %s is NOT Nanite-enabled"),
                *Comp->GetStaticMesh()->GetName());
        }
    }
}

실측 팁: r.Nanite.Visualize 콘솔로 어떤 메시가 실제 Nanite 경로를 타는지 시각적으로 확인하세요. 인스펙터에서 체크박스만 보고 켜졌다고 믿으면 안 됩니다. 폴백 메시로 새는 경우가 의외로 많습니다.

2. MegaLights: 라이트 개수 제한을 푸는 샘플링 기반 접근

MegaLights의 발상은 단순합니다. 모든 라이트가 모든 픽셀에 정직하게 그림자를 캐스팅하는 대신, 픽셀마다 영향력 큰 라이트를 통계적으로 샘플링하고 디노이징으로 메웁니다. 결과적으로 수백 개의 섀도우 캐스팅 라이트를 비슷한 예산으로 다룰 수 있게 됩니다.

실무 관점에서 가장 큰 변화는 라이팅 아티스트의 작업 습관입니다. 예전에는 "라이트 예산"을 의식해 라이트를 합치거나 베이크했지만, 이제는 동적 라이트를 더 자유롭게 배치하고 결과를 보면서 조정하는 흐름이 가능합니다. 다만 공짜는 아닙니다. 샘플링 노이즈가 많은 씬, 즉 작고 강한 라이트가 빠르게 움직이는 상황에서는 디노이저가 따라오지 못해 잔상이 보일 수 있습니다.

// UE C++ : MegaLights 사용 시 라이트별 권장 설정 강제
void ConfigureLightForMegaLights(ULocalLightComponent* Light)
{
    if (!IsValid(Light))
    {
        return;
    }

    // 작고 강한 점광원은 노이즈 원인 -> 반경에 하한을 둔다
    if (UPointLightComponent* Point = Cast<UPointLightComponent>(Light))
    {
        constexpr float MinSourceRadius = 4.0f;
        Point->SetSourceRadius(FMath::Max(Point->SourceRadius, MinSourceRadius));
    }

    // 캐스트 섀도우는 켜두되, 볼류메트릭 기여는 씬 단위로 통제
    Light->SetCastShadows(true);
    Light->SetVolumetricScatteringIntensity(0.0f);
}

체크 포인트는 r.MegaLights.Enable을 켠 뒤, 가장 노이즈가 심해 보이는 씬 한 곳을 기준으로 소스 반경 하한을 잡는 것입니다. 전역으로 한 번에 켜고 "왜 지글거리지"라고 묻는 대신, 문제 씬부터 역산하면 빠릅니다.

3. Unity 진영의 평행 흐름: GPU Resident Drawer와 적응형 프로빙

Unite 쪽 세션도 방향은 같습니다. GPU Resident Drawer와 BatchRendererGroup이 안정화되면서, Unity도 드로우콜을 CPU에서 떼어내 GPU 상주 데이터로 옮기는 흐름을 강조했습니다. Adaptive Probe Volume은 손으로 찍던 라이트 프로브를 자동 배치로 대체해, 동적 GI 품질과 작업 시간을 동시에 챙깁니다.

// Unity C# 12 : GPU Resident Drawer 사용 가능 여부를 안전하게 점검
using UnityEngine;
using UnityEngine.Rendering;

public static class RenderPipelineProbe
{
    public static bool IsGpuResidentDrawerLikelyActive()
    {
        // SystemInfo 조합으로 빠른 가드. 실제 활성화는 URP/HDRP Asset 설정에 달림
        bool computeOk = SystemInfo.supportsComputeShaders;
        bool indirectOk = SystemInfo.supportsIndirectArgumentsBuffer;

        return computeOk && indirectOk switch
        {
            true => QualitySettings.GetActiveQualityLevelsCount() > 0,
            false => false,
        };
    }
}

엔진이 달라도 결론은 하나입니다. "CPU가 일일이 챙기던 컬링과 프로빙을 GPU와 자동화에 넘긴다." 2026년 트렌드를 한 줄로 압축하면 이 문장입니다.

4. 적용 전 반드시 확인할 것

새 기능을 데모에서 보고 바로 켜면 함정에 빠집니다. 세 가지는 꼭 확인하세요. 첫째, 타깃 하드웨어. MegaLights와 Nanite Foliage는 모두 비교적 최신 GPU 기능을 전제로 하며, 구형 콘솔이나 모바일 폴백 경로에서는 이점이 사라지거나 오히려 느려질 수 있습니다. 둘째, 머티리얼 복잡도. 마스크드 머티리얼과 반투명은 비용 곡선이 다르므로 프로파일러로 실측해야 합니다. 셋째, 베이크 라이팅과의 공존 전략. 전부 동적으로 가는 것이 항상 정답은 아니며, 정적 환경광은 여전히 베이크가 저렴합니다.

결론

2026년 게임 산업 트렌드 세션이 공통적으로 말한 핵심은 렌더링 부하를 CPU에서 GPU와 자동화로 옮기는 흐름입니다. Nanite Foliage는 식생 컬링과 LOD를, MegaLights는 동적 라이트 개수 제한을, Unity의 GPU Resident Drawer와 Adaptive Probe Volume은 드로우콜과 프로브 배치를 각각 그쪽으로 넘깁니다. 실무자가 챙길 것은 분명합니다. 데모 화면이 아니라 본인 프로젝트의 타깃 하드웨어와 머티리얼 구성에서 켜고 끄며 프로파일러로 실측하는 것, 그리고 전부 동적으로 몰아가기 전에 베이크와의 공존선을 먼저 긋는 것입니다. 새 도구는 타협선을 올려줄 뿐, 예산 감각까지 대신해주지는 않습니다.