Nanite 기초
가상화 지오메트리 시스템의 원리와 기본 사용법
Nanite란?
가상화 마이크로폴리곤 지오메트리 시스템
Nanite는 UE5에서 도입된 가상화 지오메트리 시스템으로, 수십억 개의 폴리곤을 실시간으로 렌더링할 수 있게 합니다. 기존 LOD 시스템을 대체하여 자동으로 세밀도를 조절합니다.
핵심 기술
- 계층적 클러스터 분해
- GPU 기반 가시성 컬링
- 자동 LOD 스트리밍
- Software Rasterizer
장점
- 폴리곤 예산에서 해방
- 드로우콜 극적 감소
- LOD 수작업 불필요
- ZBrush 스컬프트 직접 사용
1. 임포트 시 메시를 삼각형 그룹의 계층적 클러스터로 분해
2. 렌더링 시 카메라 뷰 기반으로 클러스터를 동적 교체
3. 기존 드로우콜 시스템을 우회하는 별도 렌더링 패스 사용
4. SSD 기반 온디맨드 스트리밍
Nanite 활성화
스태틱 메시에 Nanite 적용하기
프로젝트 설정
// Project Settings > Engine > Rendering
Nanite:
Enable Nanite Support: true // 프로젝트 전체 Nanite 활성화
// 콘솔 변수로 런타임 제어
r.Nanite 1 // Nanite 활성화
r.Nanite.Visualize 1 // 시각화 디버그
스태틱 메시 설정
// Static Mesh Editor > Details Panel
Nanite Settings:
Enable Nanite Support: true
Preserve Area: false // 작은 삼각형 보존
Position Precision: 0 // 자동
Trim Relative Error: 0.0 // 단순화 허용 오차
// 임포트 시 자동 활성화 설정
Import Settings:
Build Nanite: true
C++에서 Nanite 상태 확인
// Nanite 활성화 여부 확인
bool IsNaniteEnabled(UStaticMesh* Mesh)
{
if (Mesh)
{
return Mesh->NaniteSettings.bEnabled;
}
return false;
}
// 런타임에서 Nanite 메시인지 확인
void AMyActor::CheckMeshType()
{
if (UStaticMeshComponent* SMC = FindComponentByClass<UStaticMeshComponent>())
{
if (UStaticMesh* Mesh = SMC->GetStaticMesh())
{
if (Mesh->NaniteSettings.bEnabled)
{
UE_LOG(LogTemp, Log, TEXT("This mesh uses Nanite"));
}
}
}
}
Nanite 적합성
어떤 메시에 Nanite를 사용해야 하는가
Nanite에 적합
- 고폴리 환경 메시 (건물, 바위, 절벽)
- 포토그래메트리 스캔
- ZBrush 스컬프트
- 디테일한 프롭
- 대량 인스턴싱 오브젝트
Nanite 부적합
- 스켈레탈 메시 (애니메이션)
- 버텍스 애니메이션 (WPO 제한적)
- 투명/반투명 머티리얼
- 마스크된 머티리얼 (부분 지원)
- 모프 타겟
하드 제한사항
| 제한 항목 | 값/상태 |
|---|---|
| 최대 인스턴스 수 | 1,600만 개/씬 |
| 지원 변형 | 변환, 회전, 비균일 스케일 |
| 모프 타겟 | 미지원 |
| 포워드 렌더링 | 미지원 |
| MSAA | 미지원 (TSR/TAA 사용) |
| VR 스테레오 | 제한적 지원 |
Nanite 시각화 및 디버깅
성능 분석과 문제 해결
// Nanite 시각화 모드
r.Nanite.Visualize 1 // 시각화 활성화
r.Nanite.Visualize.Mode 0 // 0: Triangles, 1: Clusters, 2: Groups
// 성능 통계
stat Nanite // Nanite 통계 표시
stat NaniteStreaming // 스트리밍 통계
// 디버그 옵션
r.Nanite.MaxPixelsPerEdge 1 // 엣지당 최대 픽셀 (품질)
r.Nanite.ShowStats 1 // 화면에 통계 표시
// 폴백 확인
r.Nanite.FallbackRelativeError 1 // 폴백 메시 오차
녹색: 적은 삼각형 (효율적)
노랑: 중간 삼각형 밀도
빨강: 많은 삼각형 (카메라 가까움 또는 고밀도)
C++에서 Nanite 통계 접근
#include "Nanite/NaniteSceneProxy.h"
// Nanite 렌더링 통계 (엔진 내부용)
// 일반적으로 stat 명령이나 Unreal Insights 사용 권장
// GPU 프로파일링 마커
TRACE_CPUPROFILER_EVENT_SCOPE(MyActor_NaniteCheck);
void AMyActor::ProfileNaniteUsage()
{
// Unreal Insights에서 확인
// trace.start cpu,gpu,frame
}
메모리 및 스트리밍
Nanite 데이터의 저장과 로딩
/*
┌─────────────────────────────────────────────────────────────┐
│ NANITE DATA FLOW │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Disk/SSD │ --> │ Memory │ --> │ GPU │ │
│ │ (Packed) │ │ (Staging) │ │ (Visible) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ 디스크: 전체 Nanite 데이터 (압축됨) │
│ 메모리: 스트리밍 대기 중인 클러스터 │
│ GPU: 현재 프레임에 보이는 클러스터만 │
│ │
└─────────────────────────────────────────────────────────────┘
*/
스트리밍 설정
; Nanite 스트리밍 설정
[/Script/Engine.RendererSettings]
r.Nanite.Streaming.PoolSize=512 ; 스트리밍 풀 크기 (MB)
r.Nanite.Streaming.MaxPendingPages=128 ; 대기 페이지 수
; SSD 권장 - HDD에서는 스트리밍 지연 발생 가능
Nanite는 온디맨드 스트리밍에 의존합니다. SSD가 아닌 환경에서는 카메라 이동 시 팝인 현상이 발생할 수 있습니다.
핵심 요약
- Nanite — 가상화 지오메트리, 자동 LOD, GPU 기반 컬링
- 활성화 — Static Mesh Editor에서 Enable Nanite Support
- 적합한 용도 — 고폴리 환경 메시, 포토그래메트리, 프롭
- 제한사항 — 스켈레탈 메시, 투명 머티리얼, 모프 타겟 미지원
- 디버깅 — r.Nanite.Visualize, stat Nanite로 분석
도전 과제
배운 내용을 직접 실습해보세요
RPG 오픈월드 환경 메시(바위, 건물, 절벽)를 임포트하고 Static Mesh Editor에서 Enable Nanite Support를 활성화하세요. C++에서 Mesh->NaniteSettings.bEnabled로 Nanite 상태를 확인하는 유틸리티 함수를 작성하세요.
콘솔에서 r.Nanite.Visualize 1을 실행하고, Triangles/Clusters/Groups 모드를 전환하면서 오픈월드 지형의 클러스터 분포를 분석하세요. stat Nanite로 삼각형 수와 GPU 시간을 확인하세요.
DefaultEngine.ini에서 r.Nanite.Streaming.PoolSize를 조정하고, 대규모 오픈월드에서 카메라 이동 시 팝인 현상이 줄어드는지 확인하세요. Unreal Insights의 trace.start cpu,gpu,frame으로 Nanite 렌더링 성능을 프로파일링하세요.