나나이트 폴리지는 나나이트 가상화된 지오메트리 렌더링을 사용하는 통합 시스템 세트로, 스케일에 따라 밀도가 높고 디테일이 뛰어난 폴리지를 구현합니다. 나나이트 폴리지는 인스턴싱, 스키닝된 메시, 복셀화, 애니메이션, 머티리얼 특성을 통해 기존 기법 및 새로운 기법을 활용하여 원본 프레임 비용의 일부만으로 탁 트인 전망의 대규모 오픈 월드를 한층 더 높은 퀄리티로 렌더링합니다. 이러한 시스템을 결합하면 생동감 넘치는 애니메이팅된 폴리지를 사용하여 보다 견고한 월드를 실현할 수 있습니다.
나나이트 폴리지의 목표와 나아갈 방향을 이해하려면, 과거에 효과적이던 방식이 앞으로 완전히 구현된 이러한 유형의 월드를 제작하는 데 효율적이지 않다는 점을 이해하는 것이 중요합니다.
이제 나나이트 폴리지에서 '기존 방식'의 폴리지 개발이 잘 작동하지 않는 몇 가지 사례를 살펴보겠습니다.
알파 마스킹: 오버드로가 많고 비용이 많이 들 수 있는 마스크 함수를 실행해야 하기 때문에 나나이트가 잘 작동하지 않습니다. 또한 알파 마스킹을 사용하면 복잡한 지오메트리를 구현하는 대신 폴리지가 계속 플랫 카드로 렌더링됩니다.
전체 나나이트 트라이앵글 표현: 원거리에서 부적절한 클러스터 컬링이 발생하고 단순화가 제대로 수행되지 않을 수 있습니다. 또한 각 폴리지 타입은 이를 저장하기 위해 많은 양의 디스크 공간을 필요로 합니다.
월드 포지션 오프셋: 머티리얼에서 WPO를 사용하여 폴리지의 잎과 가지를 움직여 바람을 시뮬레이션할 수 있습니다. 이는 버텍스별로 계산을 추가하고 머티리얼이 버텍스를 움직이는 방식을 알 수가 없으므로 나나이트가 렌더링할 수 있는 항목에 적합하지 않습니다. 이는 계산이 좀더 보수적이어야 한다는 것을 의미합니다.
이제 무엇이 잘 작동하지 않는지 어느 정도 파악했으므로 나나이트 폴리지 파이프라인을 통해 활엽과 침엽 하나하나까지 완벽하게 모델링된 나무를 렌더링하는 방법을 살펴보겠습니다. 레벨 오브 디테일(Levels Of Detail, LOD) 메시 없이 메모리 대비 효율적이고, 퍼포먼스가 뛰어나며 매우 다이내믹하면서도 대규모 오픈 월드로 스케일 조절되어야 합니다.
이를 위해 나나이트 폴리지는 다음과 같은 세 가지 시스템으로 구성됩니다.
나나이트 어셈블리는 폴리지 전체에서 매우 디테일한 인스턴스가 되는 '파츠'입니다. 이를 통해 메모리와 디스크 크기를 대폭 줄일 수 있습니다.
나나이트 복셀은 카메라 거리에 따라 트라이앵글 디테일, 애니메이션, 머티리얼 프로퍼티를 보존하는 픽셀 크기에 가까운 집계 복셀입니다. 트라이앵글은 복셀로 원활하게 전환되어 밀도가 높은 다이내믹 집계 트라이앵글 메시 렌더링 문제를 해결합니다. 이러한 복셀은 화면상의 크기 때문에 눈으로 식별할 수 없습니다.
나나이트 스키닝은 바람과 같은 시스템에서 폴리지가 동적으로 작동하는 방식을 정의하며, 여기서 바람은 본 계층구조를 통해 시뮬레이션됩니다. WPO를 사용하여 바람 애니메이션을 시뮬레이션하지 않으므로 나나이트 폴리지가 최적의 클러스터 바운드를 사용할 수 있습니다.
아래 예시에서 이 모든 것이 함께 작동하는 모습을 확인할 수 있습니다. 카메라가 디테일을 줌인하면 솔잎 하나하나에 이르기까지 나무가 얼마나 조밀하고 디테일한지 확인할 수 있습니다. 카메라가 멀어지면서 나나이트 클러스터가 충분히 작아지면 복셀로 끊김없이 전환됩니다. 이를 통해 나무는 멀리 있는 빌보드나 LOD에 의존하지 않고도 원거리에서 볼류메트릭 룩을 유지할 수 있습니다.
이 나무에는 다음과 같은 항목이 포함됩니다.
트라이앵글 4,100만 개
고유한 어셈블리 파츠 12개
어셈블리 파츠 인스턴스 2,160개
스켈레탈 본 850개
나나이트 폴리지 활성화하기
프로젝트에서 나나이트 폴리지를 활성화하려면 프로젝트 세팅(Project Settings) > 렌더링(Rendering)에서 '나나이트 폴리지(Nanite Foliage)' 박스를 체크합니다. 변경사항을 적용하려면 에디터를 다시 시작해야 합니다.
나나이트 어셈블리
나나이트 어셈블리는 나나이트 폴리지의 핵심 컴포넌트로, 나무의 가지나 잎처럼 복잡하고 반복 가능한 지오메트리의 렌더링을 효율적으로 처리하도록 디자인되었습니다. 어셈블리는 스태틱 및 스켈레탈 메시 에셋 모두와 함께 작동하므로 작고 매우 디테일한 파츠의 '마이크로 인스턴싱'이 가능합니다. 다른 메시의 인스턴스는 최대 65,000개까지 포함할 수 있습니다. 이러한 인스턴스를 어셈블리의 '파츠'라고 합니다. 이 접근법은 디스크 공간과 스트리밍 공간을 상당히 절약하지만, 클러스터 컬링 동안 퍼포먼스가 약간 저하됩니다.
나나이트 어셈블리는 빌드 시간 동안 파츠의 지오메트리를 복제하지 않고 파츠 메시의 클러스터를 가져와 최종 메시의 계층구조로 인코딩하는 방식으로 작동합니다. 런타임에서 나나이트는 클러스터 컬링 동안 계층구조를 내려갈 때 파츠 인스턴스의 최종 트랜스폼을 온디맨드로 계산하여 파츠 인스턴스를 처리합니다.
비나나이트 플랫폼에서는 각 파츠의 트라이앵글이 트랜스폼되어 단일 메시로 병합됩니다. 여기서 일반 나나이트 예비 메시와 동일하게 작동하는 예비 메시를 생성하는 작업으로 간소화됩니다.
어셈블리는 나나이트 폴리지에서 중요한 역할을 합니다. 이 툴이 없었다면 디스크 공간이나 스트리밍 메모리가 부족하여 언리얼 페스트 더 위처 4 테크니컬 데모에서 선보인 대규모 월드 숲을 렌더링할 수 없었을 것입니다. 예를 들어 데모에서 가장 큰 나무의 UASSET이 차지하는 디스크 공간은 3.5GB에서 약 29MB로 감소했습니다. 특정 뷰에서 나무 중 하나의 스트리밍 메모리는 약 36Mb에서 2.7Mb 정도로 감소하는 것으로 측정되었습니다. 이렇게 절약하면 한 씬에 수십 개의 나무 베리에이션 인스턴스 50만 개를 렌더링할 수 있으며, 각 나무는 매우 디테일하고 각각 100만~1,000만 개의 폴리곤으로 구성됩니다.
언리얼 엔진에서 어셈블리를 사용하고 생성하는 방법에 대한 자세한 내용은 나나이트 어셈블리를 참고하세요.
나나이트 복셀
나나이트 복셀은 픽셀 크기에 가까운 복셀로, 나나이트 복셀이 나타내는 지오메트리의 디테일, 애니메이션, 머티리얼 프로퍼티를 보존하고 잎의 볼류메트릭 룩을 보존합니다. 원거리에서 잎의 셰이프가 손실되는 것을 방지하기 위한 이전의 나나이트 기법은 단순화 프로세스에서 제거될 때 살아남은 트라이앵글에 표면적을 다시 추가하는 방식으로 충분히 잘 작동했습니다. 이는 원거리에서 단순화된 클러스터를 렌더링할 때 폴리지 지오메트리가 성겨지는 문제를 완화하기 위한 것입니다.
래스터화 프로세스
나나이트 복셀은 원거리에서 단순화하는 동안 집계 지오메트리(연결되지 않은 조각)의 일반적인 실루엣을 보존할 수 있습니다. 이런 복셀 지원 메시 클러스터를 단순화할 때 나나이트 빌더는 이를 최대 128개의 4x4x4 복셀 브릭 클러스터로 복셀화합니다. 복셀 표현의 단순화 오류는 단순화로 인해 트라이앵글에서 복셀로 전환되는지 여부를 결정하는 요소입니다. 그러면 트라이앵글을 사용하는 것보다 오류가 더 적은 경우 복셀로 전환됩니다.
런타임에서 복셀 클러스터는 트라이앵글 클러스터와 별도로 빈되며 특수 셰이더 순열로 래스터화됩니다. 클러스터는 뎁스 버킷으로 정렬되고 앞에서 뒤로 래스터화되어 초기 Z 테스트의 이점을 일부 얻습니다. 최종 결과는 일반적으로 래스터화된 트라이앵글보다 원거리에서 더 나은 퍼포먼스를 보여줍니다.
다음은 독립형 에셋과 더 위처 4의 테크니컬 데모에서 시각화된 복셀화 프로세스의 몇 가지 예시입니다.
셰이딩 프로세스
서로 다른 노멀을 가진 여러 표면이 단일 복셀로 덮인 영역 안에 포함될 수 있습니다. 따라서 복셀당 하나의 노멀을 저장하는 대신 노멀 분포를 저장합니다. 이는 머티리얼 러프니스가 셰이딩에 사용되는 마이크로패시트의 분포를 제어하는 것과 비슷한 콘셉트입니다.
GBuffer에 쓸 때 이 분포에서 픽셀당 확률적으로 노멀이 선택됩니다. 향후 출시 버전에서는 러프니스와 마찬가지로 셰이딩에서 분포가 직접 처리될 예정입니다. 이렇게 하면 더 위처 4 데모에서 이미 사용된 방식의 결과에서처럼 노이즈가 감소합니다.
이 경우 분포 통계를 저장할 추가 데이터가 필요합니다. 현재는 버텍스 컬러 알파 채널에 저장되어 있는 것을 오버라이드합니다. 이는 향후 버텍스 컬러와 독립된 데이터로 이동할 수 있습니다.
나나이트 복셀 활성화
나나이트 복셀화를 활성화하려면 다음 단계를 따릅니다.
스태틱 메시의 디테일(Details) 패널에서 나나이트 세팅(Nanite Settings) 카테고리를 확인합니다.
셰이프 보존(Shape Preservation)을 찾고 드롭다운을 사용하여 복셀화(Voxelize)를 선택합니다.
이 드롭다운 아래의 일부 프로퍼티는 복셀화가 설정되어 있으면 편집할 수 있게 됩니다. 대부분의 프로젝트에서는 이 항목을 조정할 필요가 없습니다. 일부는 아직 개발 중이며, 의도한 대로 작동하지 않거나 전혀 작동하지 않습니다. 이러한 세팅은 나나이트 폴리지가 완성됨에 따라 향후 버전의 언리얼 엔진에서 변경되거나 제거될 수 있습니다.
나나이트 폴리지의 애니메이션에 나나이트 스키닝 사용하기
게임에서 폴리지의 바람 애니메이션은 대부분 머티리얼에서 월드 포지션 오프셋을 사용하며, 보통 나뭇가지와 나뭇잎에 사용되는 머티리얼이 대상입니다. 지정된 버텍스에 대한 WPO는 임의의 오프셋이 될 수 있기 때문에, 아티스트는 최악의 경우에 대비하여 머티리얼에 최대 WPO 디스플레이스먼트를 설정함으로써 이러한 폴리지 에셋을 적절하게 컬링하는 데 필요한 컬링 바운드를 패딩해야 합니다. 하지만 이 경우 바운드가 지나치게 보수적이어서 오버드로 비용이 높아질 수 있습니다.
WPO는 버텍스 셰이더 로직도 변경하므로 각 머티리얼은 별도의 디스패치로 빈되며, 여기에는 관련 GPU 비용이 포함됩니다. 많은 머티리얼에서 이러한 프로그래밍 가능한 래스터 빈은 퍼포먼스 문제를 유발할 수 있습니다.
나나이트 스키닝은 이 문제를 해결합니다. 스키닝 매트릭스에서 더 정확한 바운드를 계산할 수 있고, 모든 것이 고정 함수 래스터화를 사용할 수 있기 때문입니다.
아래 스크린샷에서는 10만 개의 본이 업데이트되는 데 GPU에서 약 0.1밀리초가 소요되므로 나나이트 폴리지의 속도와 확장성을 크게 향상시켜줍니다. 애니메이션은 특정 화면 크기 미만의 나무에 자동으로 적용되지 않으며, 바람이 아주 멀리 있는 나무에 영향을 주므로 몰입감을 높일 수 있습니다. 이는 스켈레탈 메시를 사용하는 풀과 관목에도 적용됩니다.
다이내믹 윈드 플러그인
실험 단계 플러그인입니다.
다이내믹 윈드 플러그인은 나나이트 폴리지와 함께 작동하도록 디자인되었습니다. 특정 스켈레탈 메시에 대해 다이내믹 윈드 스켈레탈 데이터 에셋을 사용하는 추가 구성이 필요합니다. 이 에셋의 데이터는 스켈레톤의 본을 시뮬레이션 그룹으로 분류하여 시스템이 시뮬레이션에서 본 체인을 논리적으로 식별하는 데 도움이 될 뿐만 아니라 그룹별로 바람의 영향을 조정할 수도 있습니다.
렌더링(Rendering) 카테고리 아래 플러그인(Plugins) 브라우저에서 플러그인을 활성화할 수 있습니다.
이 플러그인은 .JSON 파일에서 필요한 데이터를 임포트할 수 있는 스크립트 기반 에셋 작업을 제공합니다. 또한 이 데이터를 제공하기 위해 스켈레톤에 적용할 수 있는 유니버설 씬 디스크립션(Universal Scene Description, USD) 스키마와 USD에서 JSON 파일을 생성하는 Python 스크립트 예시도 포함되어 있습니다.
다이내믹 윈드 트랜스폼 제공자 데이터
다이내믹 윈드 데이터 에셋의 사용자 데이터를 포함하는 스켈레탈 메시는 이 데이터를 사용하여 인스턴스드 스키닝된 메시 컴포넌트에서 바람 애니메이션을 제어할 수 있습니다.
스키닝된 메시에서 바람을 활성화하려면 컴포넌트에서 트랜스폼 제공자(Transform Provider) 드롭다운을 사용하여 트랜스폼 제공자 데이터(Transform Provider Data)를 선택합니다. 그러면 메시에 대한 새 다이내믹 윈드 데이터 에셋이 생성됩니다.
이 에셋은 컴포넌트를 윈드 시스템에 등록하는 데 필요합니다. 현재로서는 다른 용도로 사용되지 않습니다.
현재 제한 사항은 다음과 같습니다.
근거리와 같은 물리 기반 시뮬레이션을 추가합니다.
글로벌 바람 방향만 지원합니다.
플레이어 또는 오브젝트와의 콜리전이 없습니다.
다이내믹 윈드 스켈레탈 데이터는 JSON 파일로 임포트되어야 합니다.
향후 작업에는 USD를 임포트할 때 JSON 파일을 자동으로 임포트하는 작업이 포함됩니다.
다이내믹 윈드 트랜스폼 제공자 데이터에 조정을 추가합니다.
나나이트 스키닝 퍼포먼스 팁
폴리지 윈드 무브먼트에는 나나이트 스키닝이 WPO보다 잘 작동하지만 퍼포먼스에도 유의해야 합니다.
다음과 같은 사항에 주의해야 합니다.
버추얼 섀도 맵(Virtual Shadow Map, VSM) 퍼포먼스를 위해서는 원거리 애니메이션을 비활성화해야 합니다.
비활성화된 인스턴스드 메시는 스키닝되지 않은 래스터 빈으로 전환되고 고정된 함수 스태틱 메시처럼 렌더링됩니다(바인드 포즈).
컴포넌트에서 애니메이션 최소 화면 크기(Animation Min Screen Size)를 사용하여 오브젝트가 화면에서 작게 표시되는 경우 스키닝을 비활성화합니다.
항상 활성화된다는 점을 제외하면 월드 포지션 오프셋 비활성화 거리(World Position Offset Disable Distance) 세팅과 비슷합니다. 0으로 두면 글로벌 디폴트 값인 애니메이션 중지 시 오브젝트 화면 크기의 1/10(0.1)이 사용됩니다. 이 값은 콘솔 명령
r.Skinning.DefaultAnimationMinScreenSize를 사용하여 변경할 수 있습니다.