나나이트 어셈블리는 나나이트 폴리지 시스템의 핵심 컴포넌트로, 나뭇가지나 잎처럼 복잡하고 반복 가능한 지오메트리의 렌더링을 효율적으로 처리하도록 디자인되었습니다. 스켈레탈 메시와 스태틱 메시 모두를 위한 보조 기능으로, 작고 매우 디테일한 부분의 '마이크로 인스턴싱'을 가능하게 해줍니다.
나나이트 어셈블리는 나나이트 폴리지의 렌더링 파이프라인에서 중요한 역할을 합니다. 이 툴이 없었다면 디스크 공간이나 스트리밍 메모리가 부족하여 언리얼 페스트 위처 4 테크니컬 데모에서 선보인 대규모 월드 숲을 렌더링할 수 없었을 것입니다.
위의 데모 씬에서 가장 큰 나무가 차지하는 디스크 공간은 3.5GB에서 약 29MB로 감소했습니다. 특정 뷰에서 나무 중 하나의 스트리밍 메모리는 약 36Mb에서 2.7Mb 정도로 감소하는 것으로 측정되었습니다. 이렇게 절약하면 한 씬에 수십 개의 나무 베리에이션 인스턴스 50만 개를 렌더링할 수 있으며, 각 나무는 매우 디테일하고 각각 100만~1,000만 개의 폴리곤으로 구성됩니다.
나나이트 어셈블리 작동 방식
나나이트 어셈블리는 나나이트 폴리지를 제작하는 데 사용되는 파츠 메시 컬렉션입니다. 폴리지 조각 하나에서 인스턴스화되는 매우 디테일한 메시입니다. 이러한 인스턴스는 어셈블리의 로컬 스페이스 내에서 위치, 회전, 스케일을 변환합니다. 이러한 파츠를 나무 줄기 같이 인스턴스화되지 않은 베이스 메시와 결합하여 완전한 폴리지를 생성할 수 있습니다.
스켈레탈 메시의 경우 이러한 파츠를 하나 이상의 본에 어태치할 수 있으며, 디포메이션을 처리할 개별 가중치를 사용할 수 있습니다. 이를 통해 동적인 바람에 반응하는 것처럼 스켈레탈 애니메이션에 올바르게 반응하는 디테일한 애니메이팅된 폴리지를 생성할 수 있습니다.
런타임에서 나나이트는 어셈블리 레벨 오브 디테일(Levels Of Detail, LOD)을 동적으로 처리합니다. 즉, 카메라와 가까운 거리에 있는 어셈블리의 개별 파츠는 모든 지오메트리 디테일을 보존하면서 나나이트 인스턴스로 렌더링됩니다. 화면에서 오브젝트가 작아짐에 따라 이러한 부분은 단순화되므로, 나나이트의 렌더링 시스템은 전체 어셈블리가 하나의 단순화된 클러스터로 표현될 때까지 복잡도를 지능적으로 줄입니다. 이를 통해 최적의 퍼포먼스가 보장됩니다.
나나이트 어셈블리 vs 표준 인스턴싱
표준 인스턴싱의 경우, 고려해야 할 몇 가지 사항이 있습니다. 바로, 메모리 오버헤드와 렌더링될 거리입니다.
표준 인스턴싱은 대규모의 광활한 숲에 필요한 인스턴싱 양에 비해 GPU 씬 버퍼에 상당한 메모리 오버헤드를 유발합니다. 이를 통해 근거리와 원거리에서 인스턴스를 렌더링해야 하며, 보이는 각 인스턴스에는 최소 하나의 루트 클러스터를 그려야 합니다. 수천 개의 나무에 수천 개의 가지를 인스턴싱하려면 아무리 단순한 상황일지라도 수백만 개의 클러스터를 래스터화해야 높은 수준의 디테일을 유지할 수 있습니다.
두 경우 모두 나나이트 어셈블리가 퍼포먼스 및 시각적 퀄리티 측면에서 이 문제를 훨씬 잘 처리할 수 있습니다. 어셈블리는 단순히 큰 매트릭스 배열이기 때문에 인스턴스별 가중치 오버헤드가 훨씬 적습니다. 퍼포먼스가 저하된다는 것은 인스턴스별 데이터를 사용하여 머티리얼 그래프에서 수행할 수 있는 일부 작업을 나나이트 어셈블리 파츠에서 수행할 수 없다는 것을 의미합니다. 하지만 이것이 의미하는 것은 빌드 시간에 어셈블리 파츠의 루트 클러스터가 결합되어 어셈블리의 가장 낮은 해상도 레벨을 생성하므로 먼 거리에 있는 어셈블리는 단일 클러스터로 단순화된다는 것입니다. 이는 자체적인 내부 계층형 레벨 오브 디테일을 사용하는 것과 유사합니다.
먼 거리에서는 개별 파츠 인스턴스의 단순화된 레벨이 병합되어 지오메트리가 베이스 메시의 일부로 취급되며, 따라서 파츠는 인스턴스라는 정체성을 잃게 됩니다. 이러한 이유로 어셈블리 파츠의 머티리얼 그래프에는 인스턴스별 데이터가 노출되지 않습니다.
나나이트 어셈블리 스켈레탈 메시의 예시
아래 예시는 스켈레탈 어셈블리 나무 베이스 메시의 트라이앵글(줄기와 큰 가지)이 어셈블리 파츠 메시(가지에 어태치된 잔가지)에 대한 레퍼런스와 함께 에셋 자체에 저장되는 것을 보여줍니다. 이 잔가지들은 콘텐츠 폴더에서 찾을 수 있는 작은 스켈레탈 메시 에셋에 불과합니다.
스켈레탈 메시 어셈블리의 경우, 각 파츠 인스턴스는 베이스 메시의 스켈레톤에 있는 하나 이상의 본에 바인딩되므로 해당 피벗이 베이스 메시와 함께 애니메이팅됩니다.
이때 스켈레탈 어셈블리 파츠의 버텍스는 스키닝되지 않으므로 바인드 포즈에서만 고정된 상태로 애니메이팅됩니다.
나나이트 어셈블리 생성하기
언리얼 엔진에는 나나이트 어셈블리를 임포트하거나 에디터에서 생성하는 데 도움이 되는 몇 가지 실험 단계 플러그인이 포함되어 있습니다. 해당 플러그인은 다음과 같습니다.
| 플러그인 이름 | 설명 | |
|---|---|---|
나나이트 어셈블리 에디터 유틸리티 | 블루프린트에서 나나이트 어셈블리를 생성하는 데 사용됩니다. 에디터 블루프린트에 기능을 노출하여 스태틱 및 스켈레탈 어셈블리를 생성합니다. | |
프로시저럴 콘텐츠 제너레이션 프레임워크(PCG) 나나이트 어셈블리 인터롭 | 스태틱 메시 나나이트 어셈블리용 PCG 그래프에서 어셈블리를 생성하는 데 사용됩니다. | |
프로시저럴 베지테이션 에디터 | 그래프 기반 에디터로, 에디터에서 직접 고퀄리티 나나이트 지원 식생을 생성하는 데 사용됩니다. 다양한 식생 종에 대한 커스터마이징 및 베리에이션을 통해 자연스러운 성장 패턴을 모방하는 실제 식물의 원리를 적용합니다. | |
USD 임포터 | 나나이트 어셈블리는 USD 파일에서 직접 임포트할 수 있습니다. 어셈블리 제작을 위한 스키마는 USD 코어(USD Core) 플러그인에 포함되어 있습니다. |
USD를 사용하여 나나이트 어셈블리 임포트하기
USD 임포터(USD Importer) 플러그인을 사용하여 USD 파일에서 언리얼 엔진으로 나나이트 어셈블리를 임포트할 수 있습니다. 어셈블리 제작과 관련된 스키마는 USD 코어 플러그인에 포함되어 있습니다. 여기에는 NaniteAssemblyRootAPI, NaniteAssemblyExternalRefAPI, NaniteAssemblySkelBindingAPI가 포함됩니다.
이러한 스키마 사용법에 대한 자세한 내용은 소스 코드에서 스키마와 함께 제공된 문서를 참고하세요.
에디터 내 생성을 위해 나나이트 어셈블리 에디터 유틸리티 사용하기
에디터에서 나나이트 어셈블리 에디터 유틸리티(Nanite Assembly Editor Utilities) 플러그인을 사용하여 어셈블리를 생성할 수 있습니다. 이 플러그인은 UNaniteAssemblyStaticMeshBuilder 및 UNaniteAssemblySkeletalMeshBuilder 를 블루프린트에 노출하여 기존 에셋에서 어셈블리를 간편하게 생성할 수 있게 해줍니다.
이 플러그인에는 다음과 같은 작업이 가능한 레벨 에디터 스크립트 액션도 포함되어 있습니다.
레벨 에디터에서 스태틱 메시를 선택하여 스태틱 메시 어셈블리를 생성합니다.
스켈레탈 메시 액터와 여기에 어태치된 스켈레탈 메시 컴포넌트에서 스켈레탈 메시 어셈블리를 생성합니다.
에디터 내 생성에 프로시저럴 베지테이션 에디터 사용하기
프로시저럴 베지테이션 에디터(Procedural Vegetation Editor, PVE)는 언리얼 엔진 및 프로시저럴 콘텐츠 제너레이션(Procedural Content Generation, PCG) 프레임워크와 통합된 강력한 그래프 기반 툴입니다. 이를 통해 사용자는 에디터 내에서 나나이트에 바로 사용할 수 있는 고퀄리티 베지테이션 에셋을 직접 생성할 수 있습니다. PVE는 실제 식물의 원리를 활용하여 호르몬 분포와 적응 반응을 기반으로 식물의 생성을 시뮬레이션합니다.
이 툴과 사용법에 대한 자세한 내용은 프로시저럴 베지테이션 에디터를 참고하세요.
알려진 제한 사항
다음은 현재 알아야 할 몇 가지 제한 사항입니다.
다른 어셈블리의 어셈블리는 생성할 수 없습니다. 이 시스템은 현재 단일 인스턴싱 레이어를 지원합니다.
동일한 파츠 메시를 참조하는 어셈블리 간에는 지오메트리가 복제되지 않습니다. 각 어셈블리는 자체적인 파츠 데이터 사본을 저장합니다.
스켈레탈 메시의 경우 개별 파츠의 포즈를 지정할 수 없으며, 바인드 포즈로만 렌더링됩니다.
향후 업데이트에서는 개별 파츠에서 애니메이션을 인스턴싱하는 지원이 추가될 예정입니다.