나나이트 가상화 지오메트리

이 문서에서는 픽셀 스케일의 디테일과 방대한 수의 오브젝트를 렌더링할 수 있도록 지원하는 언리얼 엔진 5의 가상화 지오메트리 시스템을 간략하게 살펴봅니다.

Windows
MacOS
Linux

nanite-combo.png

나나이트는 언리얼 엔진 5의 새로운 가상화 지오메트리 시스템으로, 새로운 내부 메시 포맷과 렌더링 기술을 사용하여 픽셀 스케일의 디테일과 방대한 수의 오브젝트를 렌더링하며 인식 가능한 수준의 디테일까지만 지능적으로 처리합니다. 나나이트의 데이터 포맷은 고도로 압축되어 있으며 자동 LOD를 통해 세부적으로 스트리밍할 수 있도록 지원합니다.

나나이트의 장점

프로젝트에서 나나이트가 활성화된 지오메트리를 사용하면 다음과 같은 이점을 얻을 수 있습니다.

  • 대폭 증가한 지오메트리 복잡도, 리얼타임에서 이전보다 더 많은 트라이앵글 및 오브젝트 지원

  • 프레임 예산이 폴리곤 수, 드로 콜, 메시 메모리 사용에 의해 더 이상 제한을 받지 않음

  • Z브러시 스컬프팅, 사진 측량 스캔 등 영화 수준의 퀄리티를 갖춘 소스 아트를 직접 임포트할 수 있음

  • 노멀 맵 텍스처에 디테일을 굽는 대신 하이 폴리곤 디테일 사용 가능

  • LOD가 자동으로 처리되므로 개별 메시의 LOD를 수동으로 구성할 필요가 없음

  • 퀄리티 손실이 거의 없거나 전혀 없음(특히 LOD 트랜지션의 경우)

이처럼 나나이트는 탁월한 이점을 제공하지만 실용적인 측면에서는 여전히 제한 사항이 존재합니다. 예를 들어 인스턴스 수, 메시당 트라이앵글, 머티리얼 복잡도, 출력 해상도, 퍼포먼스를 콘텐츠와 하드웨어의 조합에 따라 주의 깊게 측정해야 합니다. 나나이트는 향후 언리얼 엔진 릴리즈에서 지속적으로 기능을 확장하고 퍼포먼스를 개선할 예정입니다.

나나이트 메시와 스태틱 메시의 차이점

나나이트 메시는 여전히 본질적으로는 트라이앵글 메시이며, 해당 데이터에 상당한 LOD와 압축이 적용되어 있습니다. 이뿐 아니라 나나이트는 완전히 새로운 시스템을 사용하여 데이터 포맷을 놀랍도록 효율적인 방식으로 렌더링합니다.

스태틱 메시에서 플래그를 활성화하기만 하면 나나이트의 이점을 활용할 수 있습니다. 나나이트용 콘텐츠를 제작하는 것은 기존 메시와 다를 것이 없지만, 나나이트는 기존 방식으로 렌더링된 지오메트리보다 몇 자릿수 더 많은 트라이앵글과 인스턴스를 처리할 수 있다는 점에서 차이가 납니다. 트라이앵글 메시와 나나이트 메시는 근본적으로 같습니다. 카메라를 충분히 가까이 가져가면 나나이트가 임포트된 원본 소스 트라이앵글을 그립니다.

나나이트 메시는 다수의 UV 및 버텍스 컬러를 지원합니다. 머티리얼은 메시의 여러 섹션에 할당되며, 이러한 머티리얼은 셰이더에서 처리할 수 있는 다양한 셰이딩 모델과 다이내믹 이펙트를 사용할 수 있습니다. 머티리얼 할당은 다른 스태틱 메시와 마찬가지로 동적으로 전환할 수 있으며, 나나이트는 머티리얼을 굽는 프로세스를 거치지 않아도 됩니다.

나나이트와 함께 버추얼 텍스처를 반드시 사용해야 하는 것은 아니지만 강력하게 권장됩니다. 버추얼 텍스처는 나나이트가 메시 데이터를 사용하여 얻을 수 있는 그 목적이 유사한 언리얼 엔진의 직교 기능입니다.

나나이트로 작업하는 것은 스태틱 메시의 워크플로와 비슷하지만 아직 지원되지 않는 것도 많습니다. 자세한 내용은 지원되는 기능 섹션을 참조하세요.

나나이트의 작동 방식

나나이트는 기존 엔진 워크플로에 최대한 원활하게 통합되지만, 메시 데이터를 저장하고 렌더링하는 데 있어서는 새로운 접근 방식을 사용합니다.

  • 임포트되는 동안 메시는 트라이앵글 그룹의 계층구조 클러스터로 분석 및 분해됩니다.

  • 렌더링되는 동안 클러스터는 카메라 뷰를 바탕으로 즉시 다양한 LOD로 전환되며, 동일한 오브젝트 내에서 이웃한 클러스터에 완벽하고 매끄럽게 연결됩니다. 데이터는 온디맨드 방식으로 스트리밍되며 표시되는 디테일만 메모리를 차지합니다. 나나이트는 기존 드로 콜을 완전히 우회하는 자체 렌더링 패스를 실행합니다. 나나이트 파이프라인을 검토해야 하는 경우에는 시각화 모드를 사용하면 됩니다.

나나이트의 퍼포먼스는 디스크에서 온디맨드 방식으로 얼마나 빠르게 메시 데이터를 스트리밍할 수 있는지에 달려 있기 때문에 런타임 스토리지의 경우 SSD 하드 드라이브가 권장됩니다.

나나이트를 사용해야 하는 메시 유형

나나이트는 일반적으로 가능한 모든 경우에 활성화되어야 합니다. 나나이트가 활성화된 모든 스태틱 메시는 보통 더 빠르게 렌더링되며 메모리 및 디스크 공간은 더 적게 차지합니다.

나나이트를 사용하기에 좋은 메시의 구체적인 조건은 다음과 같습니다.

  • 트라이앵글이 많거나 화면상에 표시되는 트라이앵글이 아주 작은 경우

  • 씬 내에 인스턴스가 많은 경우

  • 다른 나나이트 지오메트리의 주요 오클루더 역할을 하는 경우

이러한 규칙에서 예외가 되는 예시는 스카이 구체입니다. 스카이 구체의 트라이앵글은 화면상에서 크게 표시되며, 아무것도 가리지 않고, 씬에 단 하나만 존재합니다.

얼리 액세스 버전에서는 나나이트의 일부 사용 사례가 지원되지 않습니다. 자세한 내용은 지원되는 기능 섹션을 참조하세요.

메시에서 나나이트 지원 활성화

다음과 같은 방식으로 지원되는 지오메트리에서 나나이트를 활성화할 수 있습니다. 임포트 시, 개별 메시 에디터를 열거나 콘텐츠 브라우저에서 일괄적으로 선택합니다.

지오메트리를 나나이트로 변환하려면 각 메시마다 약간의 처리 시간이 필요합니다. 대규모 프로젝트에서 나나이트 에셋이 많은 경우 공유 파생 데이터 캐시(DDC)가 특히 유용합니다. 자세한 내용은 공유 DDC 문서를 참고하세요.

스태틱 메시 임포트

나나이트용으로 메시를 임포트하는 경우 나나이트 빌드 박스를 체크하세요.

nanite-importoptions.png

라이트매스로 사전 계산된 라이팅을 사용하지 않는 경우에는 라이트맵 UV 생성 프로퍼티를 비활성화하는 것이 권장됩니다.

매우 디테일한 지오메트리의 경우 이 프로퍼티가 활성화되어 있으면 스태틱 메시 데이터를 임포트하고 빌드하는 데 시간이 많이 걸릴 수 있습니다. 또한 이 프로퍼티는 추가적인 UV 채널을 더하기 때문에, 메시의 밀도가 아주 높은 경우에는 데이터 양이 상당히 커질 수 있습니다. 프로젝트에서 구운 라이팅이 필요하지 않은 경우에는 이러한 두 가지 비용을 치를 이유가 없습니다.

일괄 선택 및 개별 에셋

나나이트를 활성화하려는 콘텐츠로 프로젝트가 이미 채워져 있는 경우 두 가지 선택지가 있습니다. 콘텐츠 브라우저를 사용하여 에셋을 일괄적으로 활성화하거나 개별 에셋을 각각의 에디터를 통해 활성화하는 것입니다.

스태틱 메시 에셋을 일괄적으로 선택하여 나나이트를 활성화하려면 콘텐츠 브라우저 에서 에셋을 선택하고 우클릭 후 나나이트 > 활성화 를 선택합니다.

nanite-batchenable.png

그렇지 않으면 스태틱 메시 에셋과 지오메트리 컬렉션을 각 에디터에서 열고 디테일 패널을 통해 나나이트를 활성화할 수도 있습니다.

스태틱 메시:

nanite-staticmesheditor-enablesetting.png

  1. 스태틱 메시 에셋을 엽니다.

  2. 디테일 패널의 나나이트 세팅 아래에서 활성화됨 을 체크합니다.

  3. 변경사항 적용 을 누릅니다.

지오메트리 컬렉션:

nanite-geometrycollections-enablesetting.png

  1. 지오메트리 컬렉션 에셋을 엽니다.

  2. 디테일 패널의 나나이트 아래에서 나나이트 활성화 를 체크합니다.

지원되는 나나이트 기능

다음 섹션에서는 언리얼 엔진 5 얼리 액세스 버전의 프로젝트에서 나나이트를 가장 잘 활용할 수 있는 방법에 대해 간략하게 살펴봅니다.

지오메트리

나나이트는 스태틱 메시와 지오메트리 컬렉션에서 활성화할 수 있습니다.

나나이트가 활성화된 메시는 다음과 같은 컴포넌트 유형과 함께 사용할 수 있습니다.

  • 스태틱 메시

  • 인스턴스드 스태틱 메시

  • 계층형 인스턴스드 스태틱 메시

  • 지오메트리 컬렉션

나나이트는 현재 리지드 메시로 한정됩니다. 리지드 메시는 프로젝트의 일반적인 씬에서 지오메트리의 90% 이상을 차지하기 때문에 나나이트 개발 초기에는 여기에 초점이 맞춰졌습니다. 나나이트는 리지드 메시의 동적 이동, 회전, 비균등 스케일링을 지원하지만 다이내믹 또는 스태틱 여부에 상관없이 일반적인 메시 디포메이션은 지원하지 않습니다. 이는 나나이트 메시의 모든 위치가 전체 메시에 단일 4x3 매트릭스 곱을 적용하여 표현할 수 있는 것보다 복잡하다는 것을 의미합니다.

디포메이션이 지원되지 않는 예시는 다음과 같습니다.

  • 스켈레탈 애니메이션

  • 모프 타깃

  • 머티리얼의 월드 포지션 오프셋

  • 스플라인 메시

나나이트 메시는 현재 다음을 지원하지 않습니다.

  • 커스텀 뎁스 또는 스텐실

  • 테셀레이션 및 디스플레이스먼트

  • 인스턴스의 버텍스 페인팅

    • 이는 특히 에디터의 메시 페인트 모드를 사용하여 인스턴스별로 페인팅된 컬러를 나타냅니다.

    • 원본 메시에 임포트된 버텍스 컬러는 지원 됩니다.

씬에 나타낼 수 있는 최대 인스턴스 수는 200만 인스턴스로 제한됩니다. 여기에는 나나이트가 활성화된 것뿐 아니라 스트리밍되는 모든 인스턴스가 포함됩니다. 여기서 주의해야 하는 것은 스트리밍되는 인스턴스만 포함된다는 점입니다. 향후 언리얼 엔진 릴리즈에서는 이와 같은 제한 사항이 개선될 수 있도록 최선을 다하고 있습니다.

버텍스별 탄젠트는 나나이트가 활성화된 스태틱 메시에서 저장되지 않습니다. 그 대신 탄젠트 공간이 픽셀 셰이더에서 암묵적으로 파생됩니다. 데이터 크기를 줄이기 위해 탄젠트 데이터는 저장되지 않습니다. 이 같은 접근 방식을 사용하는 탄젠트 공간에는 차이가 있어서 에지에 불연속성이 발생할 수 있습니다. 하지만 이는 심각한 문제는 아닌 것으로 확인되었으며, 향후 언리얼 엔진 릴리즈에서 버텍스 탄젠트를 지원할 계획입니다.

머티리얼

다음 세팅** 이 있는 아래 머티리얼은 나나이트 메시에 할당할 수 없습니다. 해당 머티리얼은 허용되지 않거나 사용하더라도 나나이트 메시에서 이펙트가 발생하지 않습니다.

  • 불투명 을 제외한 모든 블렌드 모드

    • 여기에는 마스크 적용 및 반투명 블렌드 모드가 포함됩니다.

  • 디퍼드 데칼

    • 예를 들어 메시 데칼에 나나이트를 사용하는 경우가 여기에 포함됩니다.

    • 나나이트 메시에 투영된 데칼 메시는 지원됩니다.

  • 와이어프레임

  • 픽셀 뎁스 오프셋

  • 월드 포지션 오프셋

  • 커스텀 인스턴스별 데이터

  • 양면

다음을 사용하는 머티리얼은 나나이트 메시에 적용되면 올바르게 렌더링되지 않습니다. 현재는 이러한 머티리얼을 사용해도 경고가 표시되지 않으며 나나이트 메시에 적용될 경우 머티리얼이 눈에 띄게 깨져서 표시됩니다.

  • 버텍스 보간 툴 노드

  • 커스텀 UV

렌더링

현재 지원되지 않는 렌더링 기능은 다음과 같습니다.

  • 다음을 사용하는 오브젝트의 뷰 전용 필터링:

    • 다음을 포함하는 씬 캡처:

      • 숨겨진 컴포넌트

      • 숨겨진 액터

      • 컴포넌트만 표시

      • 액터만 표시

    • 최소 화면 반경

    • 디스턴스 컬링

    • FPrimitiveSceneProxy::IsShown()으로 필터링된 항목

  • 포워드 렌더링

  • 가상현실용 스테레오 렌더링

  • 분할 화면

  • 멀티샘플링 안티 에일리어싱(MSAA)

  • 라이팅 채널

  • 완전한 디테일을 제공하는 나나이트 메시에 대한 레이 트레이싱

    • 레이 트레이싱 기능은 지원되지만 레이는 완전한 디테일을 제공하는 나나이트 메시 대신 낮은 퀄리티의 표현(프록시 메시)과 교차됩니다.

  • 일부 시각화 뷰 모드는 아직 나나이트 메시 표시를 지원하지 않습니다.

    스태틱 메시 에디터에서 디테일 수준이 매우 높은 지오메트리를 볼 때 일부 시각화 모드는 주의해서 사용해야 합니다. 노멀과 UV를 표시하면 에디터 퍼포먼스에 문제가 발생할 수 있습니다.

지원되는 플랫폼

나나이트는 현재 PlayStation 5, Xbox Series S/X, 최신 드라이버를 사용하는 DirectX 11/12 지원 PC 하드웨어에서 지원됩니다.

나나이트 프록시 메시 및 정밀도 세팅

스태틱 메시는 나나이트 표현의 정밀도를 제어하는 추가 프로퍼티를 포함하며, 디테일 수준이 매우 높은 메시에서 생성된 낮은 퀄리티의 표현을 프록시 메시라고 합니다.

이 세팅은 스태틱 메시 에디터 디테일 패널의 나나이트 세팅 에서 찾을 수 있습니다.

nanite-staticmesheditor-enablesetting.png

버텍스 정밀도

나나이트는 메시 버텍스 위치를 양자화하여 메모리 밀도를 극대화하고 차지하는 디스크 공간을 최소화합니다. 양자화 단계 크기는 2의 거듭제곱이며 위치 정밀도 프로퍼티를 사용하여 개별 메시의 요구 사항에 맞도록 선택할 수 있습니다. 기본적으로 선택되는**자동** 은 나나이트가 메시 크기와 트라이앵글 밀도를 바탕으로 적절한 정밀도를 선택하게 합니다. 정밀도를 수동으로 오버라이드하여 정밀도를 높이거나 디스크 공간을 최적화할 수 있습니다.

nanite-staticmesheditor-positionprecision.png

정밀도를 수동으로 미세 조정하면 거의 항상 이점을 얻을 수 있습니다. 하지만 자동 의 휴리스틱 기법을 지속적으로 개선해 나갈 예정이므로, 이후에는 적절히 타협하여 사용하거나 최소한 개별적으로 고려할 경우 대다수 메시에서 좋은 출발점으로 활용할 수 있을 것입니다.

양자화는 압축 과정에서 다소 손실이 발생하며, 이러한 압축 방식은 모듈형 메시나 경계를 공유하는 메시로 작업할 때 특히 문제가 됩니다. 지오메트리에 구멍이나 균열을 일으키지 않도록 경계를 완벽하게 정렬해야 하는 경우 특히 그렇습니다. 일관성을 유지하기 위해 양자화는 메시 원점을 중심으로 정규화되지 않은 오브젝트 좌표에서 발생합니다. 이는 메시가 동일한 정밀도 세팅을 사용할 때 양자화가 균열을 일으키지 않게 하며, 메시 중심 사이의 이동은 해당 정밀도의 배수입니다.

프록시 메시

언리얼 엔진의 상당 부분은 기존에 렌더링된 메시가 제공하던 전통적인 버텍스 버퍼를 액세스해야 합니다. 스태틱 메시에서 나나이트가 활성화되면 디테일 수준이 높은 나나이트 데이터를 액세스하고 사용할 수 없는 곳에서 활용할 수 있는 낮은 퀄리티의 표현이 생성됩니다. 복합 콜리전이 필요하거나 플랫폼이 나나이트 렌더링을 지원하지 않는 등의 경우에 바로 이러한 프록시 메시 표현이 생성되어 사용됩니다. 메시에 구워진 스태틱 라이팅이 있는 경우 라이트매스에서도 프록시 메시가 사용됩니다.

나나이트 세팅 프록시 트라이앵글 퍼센트 는 낮은 퀄리티의 표현을 생성할 때 사용되는 디테일 수준이 매우 높은 원본 메시의 트라이앵글 퍼센티지를 나타냅니다. 텍스트 필드에는 0~100의 값을 입력할 수 있으며, 퍼센티지가 높을수록 원본 메시의 디테일이 더 많이 유지됩니다. 값을 100으로 입력하면 데시메이션이 발생하지 않습니다. 프록시 메시는 프록시 퍼센트가 아무리 작아도 최소 2,000개의 트라이앵글로 범위가 제한됩니다.

nanite-staticmesheditor-proxypercent.png

나나이트가 트라이앵글이 2,000개 미만인 메시에서 활성화되는 경우, 퀄리티가 낮은 표현의 퍼센티지 범위는 최소 2,000개의 트라이앵글로 하드코딩되어 있기 때문에 원본 메시가 자동으로 프록시 메시로 사용됩니다.

스태틱 메시 에디터에서 표시 > 나나이트 프록시 또는 단축키 Ctrl + N 을 사용하여 완전한 디테일을 제공하는 나나이트 표현을 토글하고 나나이트 프록시 메시 표현을 생성할 수 있습니다.

nanite-proxymeshtoggle.png

아래 예시는 메시의 디테일 수준이 높은 나나이트 표현과 나나이트 렌더링이 지원되지 않는 경우 사용되는 프록시 메시를 비교한 것입니다. 이 예시에 사용된 메시는 언리얼 엔진 5에인션트의 협곡 샘플에서 가져온 것입니다.

얼리 액세스 버전에서 스태틱 메시 에디터에 표시되는 트라이앵글버텍스 통계는 나나이트 활성화 여부와 상관없이 프록시 메시만 가리킵니다. 원본 트라이앵글 수를 보려면 나나이트를 메시에서 일시적으로 비활성화해야 합니다.

하이 폴리곤 나나이트 메시

나나이트에서 생성한 프록시 메시

'프록시 트라이앵글 퍼센트'를 높이면 프록시 메시 표현에 대한 원본 메시 디테일이 퍼센티지만큼 복원됩니다. 이는 플랫폼이나 피처가 나나이트 렌더링을 지원하지 않는 경우에 필요합니다. 아래 예시는 생성된 원본 프록시 메시를 더 많은 퍼센티지의 디테일이 복원되어 트라이앵글 수가 약 2배인 프록시 메시와 비교한 것입니다.

낮은 프록시 트라이앵글 퍼센트를 사용한 나나이트 프록시 메시

높은 프록시 트라이앵글 퍼센트를 사용한 나나이트 프록시 메시

나나이트 활성화 메시에서 커스텀 프록시 메시 LOD 사용

메시에서 활성화된 경우 나나이트는 LOD0을 최소 트라이앵글 수로 사용하여 자동으로 원본 메시의 퀄리티가 낮은 표현을 생성합니다. 플랫폼에서 지원하지 않는 등 나나이트를 사용할 수 없는 경우 프록시 메시가 대신 사용됩니다.

나나이트는 스태틱 메시 에디터의 프록시 트라이앵글 퍼센트 프로퍼티를 바탕으로 LOD0에 대한 프록시 메시만 자동으로 생성합니다. 플랫폼이 나나이트를 지원하지 않는 등의 상황에서는 일반 커스텀 LOD 트랜지션이 예비 전환 옵션으로 필요합니다. 스태틱 메시 LOD는 나나이트가 활성화된 메시에서도 프록시 메시 LOD로 사용되므로 여전히 중요합니다. 이를 임포트하고 구성하는 워크플로는 표준 스태틱 메시 LOD 구성과 동일합니다.

커스텀 LOD를 나나이트 프록시 메시로 사용할 때 고려할 사항은 다음과 같습니다.

  • 최소 LOD1 로 설정합니다.

    • LOD1을 사용하면 자동 생성 프록시 메시를 건너뛰고 스태틱 메시의 커스텀 LOD를 사용합니다.

    • 이 프로퍼티는 스태틱 메시 에디터 디테일 패널의 LOD 세팅 에서 찾을 수 있습니다.

  • 자동 생성 나나이트 프록시 트라이앵글 퍼센트0 으로 설정합니다.

    • 프록시 메시 표현은 최소 LOD가 LOD1 이상으로 설정된 경우에도 나나이트 데이터가 지원되지 않는 언리얼 엔진의 다른 시스템에서 사용되므로, LOD0은 가능한 한 적은 트라이앵글을 사용해야 합니다.

    • LOD0은 원본 메시의 트라이앵글 수가 더 적은 경우를 제외하고 프록시 메시 표현에 최소 2,000개의 트라이앵글을 사용합니다. 원본 메시의 트라이앵글 수가 더 적으면 원본 메시가 프록시로 사용됩니다.

이 워크플로는 현재 개발 중이며 향후 엔진 릴리즈에서 개선될 예정입니다.

퍼포먼스 및 콘텐츠 문제

대부분의 경우, 나나이트는 화면 해상도에 맞춰 아무런 문제없이 스케일링됩니다. 이것이 가능한 것은 세부적인 LOD와 오클루전 컬링이라는 두 가지 핵심 기술 덕분입니다. 이는 나나이트가 화면에 실제 그리려고 하는 트라이앵글 수는 씬 내 소스 데이터의 지오메트리 복잡도와 무관하게 상당히 일정하며 픽셀 수에 비례적이라는 것을 의미합니다. 나나이트는 픽셀보다 훨씬 많은 수의 트라이앵글을 그릴 필요가 없다는 디자인 원칙을 따릅니다.

콘텐츠 유형이 스케일링에 사용되는 나나이트 기술에 나쁜 영향을 미치는 경우도 있지만, 그렇다고 해서 나나이트를 해당 콘텐츠에 전혀 사용해서는 안 되거나 기존 파이프라인보다 렌더링이 훨씬 빠르다는 의미는 아닙니다. 이 같은 콘텐츠 유형에서는 씬 복잡도가 아니라 픽셀에 따라 스케일링되므로 여기에는 적용되지 않을 수도 있습니다. 이러한 상황에 대해서는 언리얼 엔진의 프로파일링 기능을 사용하여 모니터링해야 합니다.

군집지오메트리

군집 지오메트리는 헤어, 나뭇잎, 잔디 등 연결되지 않은 수많은 작은 요소가 먼 거리에서 볼륨을 이루는 것을 가리킵니다. 이는 LOD와 오클루전 컬링 기술에 나쁜 영향을 미칩니다.

우선, 나나이트 메시는 본질적으로 계층형 LOD 구조이며, 작은 트라이앵글을 큰 트라이앵글로 간소화하고 그 차이가 식별 불가능하다고 판별되면 보다 간소화된것을 선택합니다. 이는 연속적인 평면에서는 잘 작동하지만 군집 지오메트리에서는 그렇지 못하며, 멀리서 보면 솔리드 표면이 아니라 부분적으로 불투명한 클라우드처럼 보입니다. 따라서 나나이트는 군집 지오메트리를 일반적인 솔리드 표면과 같이 적극적으로 축소하지 못하며, 그 결과 같은 수의 픽셀에 대해 더 많은 트라이앵글이 그려집니다.

군집 지오메트리가 나쁜 영향을 미치는 두 번째 최적화 사례는 오클루전 컬링입니다. 오클루전 컬링은 아주 미세하며, 그 미세함의 정도가 픽셀 단위를 넘어섭니다. 구멍으로 가득한 지오메트리, 더 심한 경우 구멍이 가득하고 층층이 쌓인 지오메트리는 화면상의 영역이 그 뒤에 있는 것을 검게 처리하기 전에 다수의 뎁스 레이어를 빌드하게 만들기 때문에 막대한 오버드로를 유발합니다. 가령 화면상에 8x8 픽셀의 영역이 있다고 가정하고 모든 픽셀이 채워지기 전에 얼마나 많은 뎁스 레이어가 그려져야 하는지 생각해볼 수 있습니다. 이 같은 과도한 오버드로로 인해 나나이트는 같은 픽셀 수에 대해 더 많은 트라이앵글을 그리게 되고 결과적으로 렌더링이 느려지게 됩니다.

폴리지는 이 문제가 가장 명확하게 드러나는 사례지만, 그렇다고 해서 나나이트를 폴리지 유형의 메시에 절대로 사용할 수 없는 것은 아닙니다. 개별적으로 모델링된 잎으로 구성된 높은 나무가 하늘을 뒤덮고 있는 숲은 잘 실행되지 않겠지만, 나무 둥치나 가지에는 사용할 수 있습니다. 건물 측면의 덩굴에서도 나나이트가 잘 작동할 수 있습니다. 이상적인 경우이긴 하지만 솔리드 표면 뒤에는 레이어가 하나만 존재하기 때문입니다. 프로젝트에서 어떤 것이 잘 작동하는지 실험을 통해 알아보고, 이러한 메시 유형에서 뛰어난 퍼포먼스를 보이는 나나이트를 프로파일링으로 확인하는 것이 좋습니다.

가깝게 스택된 표면

기존 메시의 오클루전 컬링은 실질적인 한계 때문에 대규모 스케일에서의 키트들을 조립하여 완성하는 워크플로는 거의 불가능했습니다. 나나이트의 세밀한 오클루전 컬링은 이 워크플로를 개발 과정에서 보다 원활하게 사용할 수 있도록 지원합니다.

군집 지오메트리 섹션에서 설명했듯이, 보이는 표면 바로 아래 가까이에 있는 숨겨진 표면에서 오버드로가 발생할 수 있습니다. 보이는 표면 아래에 지오메트리가 잘 묻혀 있는 경우 나나이트가 이를 적절히 저렴한 비용으로 탐지하고 컬링하여 거의 비용 소모 없이 처리할 수 있습니다. 하지만 가장 위에 있는 표면에 매우 가까워서 두 표면의 화면상 뎁스 차이가 아주 작은 경우, 나나이트는 어떤 것이 위에 있는지 판단하지 못하고 두 개를 모두 그립니다. 나나이트가 어떤 것이 위에 있는지 알지 못하고 모든 레이어를 그리는 것은 최악의 시나리오입니다. 이 부정확성은 화면의 크기와 거리에 따라 커지며, 10cm 정도에서는 레이어가 분리되어 가까이에서 봐도 괜찮을 수 있지만 거리가 멀어져서 거리 차이가 픽셀보다 작아지면 오버드로가 발생합니다.

언리얼 엔진 5의 샘플 프로젝트인 고대의 협곡 예시는 가깝게 스택된 표면이 어떻게 과중한 오버드로를 유발하는지 보여줍니다. 먼 거리에 있을 때 화면상에서 얼마나 작은 영역을 사용하는지 보여주기 위해 캐릭터의 발이 표시되고 있습니다.

게임 뷰

가깝게 스택된 다수의 나나이트 인스턴스

카메라를 움직여서 캐릭터가 서 있는 영역 아래의 스택된 표면을 내려다보면 오버드로 시각화를 통해 스택된 표면이 어떻게 렌더링되고 있는지 확인할 수 있습니다.

nanite-overdrawvis.png

이 시각화를 사용하면 이러한 문제를 가장 효과적으로 찾아낼 수 있습니다. 약간의 오버드로는 예상되지만 그 정도가 심하면 나나이트 컬링 및 래스터화 비용이 더 높아져서 씬 복잡도와 무관하게 나나이트 스케일링의 효과가 떨어지게 됩니다.

패시팅된 하드에지 노멀

스무딩되지 않고 완전히 패시팅된 하이 폴리곤 메시를 임포트하는 것은 어렵지 않을 뿐더러 트라이앵글이 아주 작기 때문에 식별하기도 힘듭니다. 하지만 메시에서 공유하는 버텍스 양이 적더라도 렌더링 퍼포먼스와 데이터 크기 양쪽에서 비용이 매우 높아질 수 있기 때문에 이렇게 하지 않도록 주의를 기울여야 합니다. 이상적으로는 메시의 버텍스 수가 트라이앵글 수보다 적어야 합니다. 비율이 2:1 이상인 경우, 특히 트라이앵글 수가 많으면 문제가 될 수 있습니다. 비율이 3:1이면 메시가 완전히 패시팅되어 모든 트라이앵글이 3개의 버텍스를 갖게 되며 다른 트라이앵글과 버텍스를 전혀 공유하지 않게 됩니다. 이렇게 되는 가장 흔한 이유는 노멀이 스무딩되지 않아서 같지 않기 때문입니다.

버텍스가 많을수록 데이터도 많아진다는 것을 항상 염두에 둬야 합니다. 또한 이 경우 버텍스 트랜스폼 작업이 늘어나며, 2:1보다 비율이 높아지면 패스 속도가 떨어지게 됩니다. 하드 서피스 모델링에서 의도적으로 사용할 경우 문제가 되지 않을 뿐더러 사용하지 않을 이유 또한 없습니다. 하지만 실수로 100% 패시팅된 밀도 높은 메시를 임포트하는 경우 생각하는 것보다 훨씬 높은 비용을 치러야 합니다. 또한 로우 폴리곤 메시에서 감지할 수 있는 하드 노멀 한계치를 사용하여 다른 DCC 패키지에서 생성된 밀도 높은 유기체 유형의 표면에 임포트된 노멀은 나나이트에 불필요한 비용을 더할 수 있습니다.

아래의 왼쪽 이미지에 있는 두 메시를 예로 들어 설명해보겠습니다. 왼쪽의 메시에는 패시팅된 노멀이 있고, 오른쪽에는 스무딩된 노멀이 있습니다. 나나이트의 트라이앵글 시각화 기능을 통해 보면 각각을 그리는 데 사용된 트라이앵글 수가 눈에 띄게 차이가 난다는 것을 알 수 있습니다.

패시팅된 노멀(왼쪽)과 스무딩된 노멀(오른쪽)이 있는 나나이트 활성화 메시

패시팅된 노멀(왼쪽)과 스무딩된 노멀(오른쪽)이 있는 나나이트 활성화 메시에 대한 나나이트 트라이앵글 시각화

이미지를 클릭하면 전체 크기로 확대됩니다.

이미지를 클릭하면 전체 크기로 확대됩니다.

<!----

일반 콘텐츠의 퍼포먼스

비교를 위해 다음의 GPU 타이밍은 PlayStation 5 언리얼 엔진 5 테크니컬 데모인 나나이트 세계의 루멘에서 가져왔습니다.

  • 평균 렌더링 해상도 1400p가 4K로 임시 업샘플링되었습니다.

  • 이 데모의 거의 모든 메시에 해당하는 모든 나나이트 메시를 컬링 및 래스터화하는 시간은 ~25밀리초입니다.

    • 거의 모든 지오메트리에 나나이트 메시가 사용되었습니다.

    • 100% GPU 기반이므로 CPU 비용이 거의 들지 않습니다.

  • 모든 나나이트 메시를 평가하는 시간은 ~2밀리초입니다.

    • 씬에 존재하는 머티리얼당 드로 콜이 1회에 불과하여 CPU 비용이 매우 낮습니다.

GPU 시간을 모두 합치면 약 4.5밀리초로, 언리얼 엔진 4의 뎁스 프리패스와 베이스 패스를 합친 것에 해당하는 시간입니다. 이를 통해 나나이트가 60FPS를 목표로 하는 게임 프로젝트에 적합하다는 사실을 알 수 있습니다.

이러한 수치는 앞 섹션에서 언급된 퍼포먼스 저하를 유발할 수 있는 콘텐츠에서 예상되는 수치입니다. 인스턴스와 고유 머티리얼 수가 상당히 많은 경우에도 비용이 높아질 수 있기 때문에 나나이트 개발에서 이 영역에 대해서도 집중적으로 작업이 진행되고 있습니다.

데이터 크기

나나이트를 통해 고도의 디테일을 확보할 수 있기 때문에 지오메트리 데이터가 많이 늘어나면 게임 패키지 크기와 플레이어가 다운로드해야 하는 용량도 커질 것이라고 생각할 수도 있습니다. 하지만 실제로는 이러한 부분에 미치는 영향은 거의 없습니다. 나나이트에 특화된 메시 인코딩 덕분에 나나이트의 메시 포맷은 표준 스태틱 메시 포맷보다 훨씬 작습니다.

예를 들어 언리얼 엔진 5 샘플인 고대의 협곡 에서 나나이트 메시는 입력 트라이앵글당 평균 14.4바이트입니다. 이는 디스크에서 100만 트라이앵글 나나이트 메시 하나의 평균 크기가 ~13.8MB라는 것을 의미합니다.

기존의 로우 폴리 메시와 노멀 맵을 나나이트의 하이 폴리 메시와 비교하면 다음과 같습니다.

로우 폴리곤 메시

  • 트라이앵글: 19,066

  • 버텍스: 10,930

  • LOD 수: 4

  • 나나이트: 비활성화

스태틱 메시 압축 패키지 크기: 1.34MB

나나이트 메시

  • 트라이앵글: 1,545,338

  • 버텍스: 793,330

  • LOD 수: 해당 없음

  • 나나이트: 활성화됨

스태틱 메시 압축 패키지 크기: 19.64MB

<!---

로우 폴리곤 메시

  • 트라이앵글: 19,066

  • 버텍스: 10,930

  • LOD 수: 4

  • 나나이트: 비활성화

스태틱 메시 압축 패키지 크기: 1.34MB

나나이트 메시

  • 트라이앵글: 1,545,338

  • 버텍스: 793,330

  • LOD 수: 해당 없음

  • 나나이트: 활성화됨

스태틱 메시 압축 패키지 크기: 19.64MB

로우 폴리곤 스태틱 메시 | with 4k Normal Map

하이 폴리곤 스태틱 메시 | with 4k Normal Map

압축 패키지 크기는 에셋 전체의 크기가 아닙니다. 이 메시에서만 사용되는 고유 텍스처 또한 고려해야 합니다. 메시가 사용하는 머티리얼 다수는 여러 노멀, 베이스 컬러, 메탈릭, 스페큘러, 러프니스, 마스크 텍스처 등으로 구성된 고유한 텍스처를 갖습니다.

이 특정 에셋은 베이스 컬러와 노멀이라는 두 가지 텍스처만 사용하므로 고유 텍스처가 여러 개 있는 에셋만큼 디스크 공간을 많이 차지하지 않습니다. 예를 들어 트라이앵글 수가 최대 150만 개인 나나이트 메시의 크기(19.64MB)는 4k 노멀 맵 텍스처보다 작습니다.

텍스처 유형

텍스처 크기

디스크상의 크기

베이스 컬러

4k x 4k

8.2MB

노멀

4k x 4k

21.85MB

메시 및 텍스처의 총 압축 패키지 크기:

  • 로우 폴리곤 메시: 31.04MB

  • 하이 폴리곤 메시: 49.69MB

나나이트 메시는 이미 디테일 수준이 매우 높기 때문에 고유 노멀 맵을 다른 에셋과 공유되는 디테일 노멀 타일링으로 대체하려고 했습니다. 이 경우 퀄리티에서 손실이 발생하지만 이는 매우 사소한 수준이며, 로우 폴리곤과 하이 폴리곤 버전 사이의 퀄리티 차이보다는 훨씬 적습니다. 따라서 150만 개의 트라이앵글로 구성된 나나이트 메시는 4k 노멀 맵이 있는 로우 폴리곤 메시보다 외관상 더 뛰어나면서 크기도 더 작아질 수 있습니다.

나나이트 활성화 메시 및 텍스처의 총 압축 패키지 크기: 27.83MB

하이 폴리곤 스태틱 메시 | with 4k Normal Map

나나이트 메시 | with 4k Detail Normal Map

텍스처 해상도와 디테일 노멀 맵으로 많은 실험을 할 수 있지만, 이 특정한 비교를 통해 나나이트 메시의 데이터 크기가 이미 아티스트들에게 익숙한 데이터와 크게 다르지 않다는 점을 알 수 있습니다.

마지막으로, LOD0의 동일한 상태에서 나나이트 압축과 하이 폴리곤을 사용하는 표준 스태틱 메시 포맷을 비교해보겠습니다.

하이 폴리곤 스태틱 메시

  • 트라이앵글: 1,545,338

  • 버텍스: 793,330

  • LOD 수: 4

  • 나나이트: 비활성화

스태틱 메시 압축 패키지 크기: 148.95MB

나나이트 메시

  • 트라이앵글: 1,545,338

  • 버텍스: 793,330

  • LOD 수: 해당 없음

  • 나나이트: 활성화됨

스태틱 메시 압축 패키지 크기: 19.64MB

<!---

하이 폴리곤 스태틱 메시

  • 트라이앵글: 1,545,338

  • 버텍스: 793,330

  • LOD 수: 4

  • 나나이트: 비활성화

스태틱 메시 압축 패키지 크기: 148.95MB

나나이트 메시

  • 트라이앵글: 1,545,338

  • 버텍스: 793,330

  • LOD 수: 해당 없음

  • 나나이트: 활성화됨

스태틱 메시 압축 패키지 크기: 19.64MB

이전의 나나이트 압축 크기인 19.64MB**와 비교하면 4 LOD의 표준 스태틱 메시 압축에 비해 7.6배** 작습니다.

언리얼 엔진의 향후 릴리즈에서 개선할 핵심 영역에는 바로 이러한 나나이트 압축과 데이터 크기가 포함되어 있습니다.

데이터 크기에 대한 일반적인 조언과 향후 전망

나나이트와 버추얼 텍스처링 시스템을 속도가 빠른 SSD 하드 드라이브와 조합하여 사용할 경우 지오메트리와 텍스처의 런타임 예산에 대한 우려를 줄여줍니다. 하지만 현재 가장 문제가 되는 병목 구간은 이 데이터를 고객에게 전달하는 방식입니다.

디스크상의 데이터 크기는 물리적 미디어나 인터넷을 통한 다운로드 등 콘텐츠 전달 방식을 고려할 때 중요한 요소이며 압축 기술만으로는 한계가 있습니다. 평균적인 최종 사용자의 인터넷 대역폭, 광학 미디어 크기 및 하드 드라이브 크기는 하드 드라이브 대역폭 및 액세스 레이턴시, GPU 컴퓨팅 파워 및 나나이트 같은 소프트웨어 기술에 맞춰 확장되지 않습니다. 이 같은 데이터를 고객에게 전달하는 것이 여전히 문제가 되는 이유가 바로 이 때문입니다.

디테일 수준이 매우 높은 메시를 효율적으로 렌더링하는 것은 나나이트에 있어서 큰 문제가 아니지만, 디스크상에 데이터를 저장하는 것과 관련된 사항은 반드시 확인이 필요한 핵심 영역입니다. 향후 언리얼 엔진 릴리즈는 압축뿐 아니라 반복되는 디테일을 보다 적극적으로 재활용할 수 있도록 지원하는 툴과 프로덕션 후반에 데이터를 트리밍하여 패키지 크기를 적절히 조절하는 툴 등을 지원하여 아트 팀이 퀄리티를 원활하게 초과 달성할 수 있도록 도와드릴 예정입니다.

향후 나나이트 개발에서는 다음과 같은 방법에 대한 수십 년에 달하는 업계 경험을 바탕으로 다양한 텍스처 데이터 관리 방법을 도입할 수 있을 것으로 예상하고 있습니다.

  • 텍스처 타일링

  • UV 스태킹 및 미러링

  • 디테일 텍스처

  • 텍스처 메모리 보고

  • 최종 패키지 데이터에서 밉 레벨 드롭

언리얼 엔진 5의 지오메트리에서도 유사한 전략이 모색 및 개발되고 있습니다.

시각화 모드

나나이트에는 현재 씬에서 데이터를 검토하는 여러 시각화 모드가 포함되어 있습니다.

뷰 모드 드롭다운 아래의 레벨 뷰포트에서 나나이트 시각화 위로 마우스를 가져가서 선택합니다.

이미지를 클릭하면 전체 크기로 확대됩니다.

예를 들어 개요 시각화는 이미지 중앙에서 렌더링된 씬과 화면 주변의 개별 시각화 뷰를 참고용으로 표시합니다.

nanite-vis-overview.png

기타 시각화 모드는 다음과 같습니다.

나나이트 시각화

설명

마스크

나나이트(초록)와 비나나이트(빨강) 지오메트리를 표시하는 시각화입니다.

트라이앵글

현재 씬에서 나나이트 메시의 모든 트라이앵글을 표시합니다.

클러스터

현재 씬 뷰에서 렌더링되는 모든 트라이앵글 그룹을 색으로 표시합니다.

프리미티브

인스턴스 스태틱 메시(ISM)의 모든 인스턴스에 대한 컴포넌트를 같은 색으로 표시하는 시각화입니다.

인스턴스

씬의 각 인스턴스마다 다른 색을 적용하는 시각화입니다.

오버드로

씬 지오메트리에서 발생하는 오버드로의 양을 표시합니다. 가깝게 스택된 작은 오브젝트가 큰 오브젝트보다 더 많은 오버드로를 유발합니다.

머티리얼 복잡도

나나이트 지오메트리에서 머티리얼의 복잡도를 표시합니다.

머티리얼 ID

개별 나나이트 메시의 각 머티리얼 ID를 별도의 색으로 표시합니다.

라이트맵 UV

나나이트 메시 표면의 UV 좌표를 표시하는 시각화입니다.

콘솔 변수 및 명령

다음과 같은 통계 및 콘솔 변수를 사용하여 나나이트를 디버그 및 구성할 수 있습니다.

나나이트 통계 명령

Nanitestats 명령을 콘솔에 입력하면 현재 뷰의 화면 오른쪽에 나나이트 컬링 통계가 오버레이됩니다.

nanite-nanitestats.png

명령 인수는 나나이트가 화면에 어떤 통계를 표시할지 지정하는 데 사용됩니다. 인수가 제공되지 않으면 기본 뷰가 사용됩니다.

'Nanitestats List'는 디버그 출력에서 사용 가능한 뷰의 목록을 표시하며, 이는 다음과 같습니다.

  • 기본

  • VSM_Directional

  • VSM_Perspective

  • ShadowAtlas0

  • ShadowAtlas1

  • ShadowAtlas2

뷰를 선택할 때는 Nanitestats`를 입력하고 사용할 인수를 입력합니다. 예를 들어 Nanitestats VSM_Directional`과 같이 입력합니다.

패스가 2개인 오클루전 컬링을 사용하는 뷰의 경우, 통계가 메인 패스와 포스트 패스로 분리되어 표시됩니다.

통계 이름

설명

PRE-CULL

컬링 패스 전의 인스턴스 수입니다.

POST-CULL

비저빌리티 테스트를 거치고 남은 인스턴스 수입니다.

NODEVISITS

컬링 도중에 거친 계층구조 노드의 총 개수입니다.

CANDIDATES

계층구조 이동 도중에 발견된 비저빌리티 테스트가 필요한 클러스터의 수입니다.

CLUSTERSSW

소프트웨어 래스터화를 사용하여 렌더링된 가시 클러스터의 수입니다.

CLUSTERSHW

하드웨어 래스터화를 사용하여 렌더링된 가시 클러스터의 수입니다.

나나이트 스트리밍 풀 크기 제어

콘솔 변수 `r.Nanite.Streaming.StreamingPoolSize`를 사용하여 나나이트 스트리밍 데이터를 저장할 전용 메모리의 양을 제어할 수 있습니다. 더 큰 풀을 사용하면 씬에서 이동할 때 IO와 압축 해제 작업이 줄어들지만 메모리 점유율이 늘어납니다.

얼리 액세스 버전에서는 풀이 뷰에 필요한 모든 데이터를 저장하기에 충분하지 않은 경우 캐시 스래싱이 발생해서 정적인 뷰에서도 스트리밍이 안정화가 되지 않을 수 있습니다.

이 콘솔 변수는 런타임에 변경할 수 없으며 반드시 환경설정(.ini) 파일에서 지정해야 합니다.

단일 패스에서 최대 클러스터 설정

콘솔 변수 r.Nanite.MaxCandidateClusters 및 `r.Nanite.MaxVisibleClusters`로 단일 패스에서 사용되는 후보 및 가시 클러스터의 최대 수를 지정할 수 있습니다. 이 값은 중간 버퍼의 크기 설정에 사용되며, 기본값(각각 8388608, 2097152)은 일반적인 게임 렌더링 작업을 고려하여 선택되었습니다.

얼리 액세스 버전에서는 이 버퍼를 동적으로 리사이징하거나 오버플로 시에 자동으로 퀄리티를 낮추는 메커니즘이 제공되지 않습니다. 이에 따라 씬 복잡도에 비해 버퍼가 너무 작아져서 렌더링 아티팩트를 유발할 수 있으며, 이는 일반적으로 누락되거나 깜빡이는 지오메트리로 나타납니다. 이러한 유형의 아티팩트가 발생하면 `Nanitestats`를 사용하여 후보 및 가시 클러스터에 대해 보수적인 바운드를 설정합니다(CLUSTERSSW 및 CLUSTERSHW 통계 참조). 후보 클러스터의 메모리 비용은 현재 12바이트이며, 가시 클러스터는 16바이트입니다.

이 콘솔 변수는 런타임에 변경할 수 없으며 반드시 환경설정(.ini) 파일에서 지정해야 합니다.