본문 바로가기
개발 (Game)/Unreal 5

[Unreal5] Nanite

by 진현개발일기 2024. 4. 22.

※ 개인 학습용 기록이라 잘못된 정보를 내포할 수 있습니다. 계속 공부하면서 꾸준히 업데이트 예정

■ Nanite?

나나이트는 모니터 화면에 triangle을 이전보다 훨씬 효과적으로 그려내는 UE5의 기술이다.
이는 'Cluster Culling' 기술이 작용된다.

Lit Rendering 상태
Clusters Rendering 상태

 

 

[Cluster culling]

- 에디터에서 미리 메시의 삼각형을 클러스터화 시켜서 에셋에 저장해 둔다. 그리고 실제 렌더링 시에는 클러스터화 한 데이터를 필요한 만큼 스트리밍 로드 하여 사용한다 (마치 버추어 텍스쳐처럼). 물론 컬링 또한 메시가 아닌 클러스터 단위로 결정된다.


- 객체를 모니터의 해상도, 객체의 모니터 내 크기, 거리에 따라 개체를 형성하는 Cluster의 개수 및 크기를 자동으로 조정해주는 기술이다. 각각의 Cluster는 대략 128개의 삼각형으로 이루어진다.

 

Clustering 의 모습. 거리에 따라 Cluster의 Intensity와 Cluster instances의 개수가 달라지는 것을 볼 수 있음. 거리가 멀어지면 하나의 큰 Cluster로 변경되고 가까워질수록 여러 개의 Cluster로 쪼개져 디테일을 살리고 있음


- 이렇게 군집한 Cluster 중 Nanite는 '카메라에 보이는' 애들만 렌더링을 한다.

나나이트는 low quality 메시를 직접 만들고, 거리에 따른 LOD 설정이 필요없으며 LOD가 전환될 때 퀄리티 손실이 거의 발생하지 않는다.


그렇기 때문에 High Quality Mesh를 그대로 사용할 수 있으므로 노말맵을 사용해서 디테일을 표현할 필요가 없게 된다.

일반적으로, 픽셀보다 작은 지오메트리나 삼각형으로 Pixel scale detail을 달성할 수 없다.

이러한 점이 Nanite가 지오메트리를 매우 똑똑하고 효율적인 방식으로 최적화할 수 있는 곳이다.

* 하지만 Nanite는 Static Mesh에만 적용이 가능하다.
* 콘솔에 nanitestats list를 입력하면 관련 스탯 창을 띄울 수 있다.

■ Pros

1. Triangle Density

it can handles millions and millions of polygons on screen at a single time.

왜냐하면 변화된 부분만 Update 하기 때문.

2. All opaque geometry can be done on a 'single draw call'

즉, 이전까지의 렌더링 방식이었던 각 물체에 대한 Drawcall을 호출하는 것이 아니라 한 번의 Draw call로 모든 물체를 표현한다.

3. Only update changes  and not the entire frame as usual

즉, 변화가 일어난 부분에 대해서만 자원을 소모한다.

 

4. More than a Heightmap

이전에는 Overhangs 각도에 대해 묘사가 어렵거나 불가능했다. 하지만 Nanite로 인하여 그러한 디테일까지 표현이 가능해졌다.


5. Kitbashing is easier and better

Kitbashing이란 여러가지 사물을 한 번에 합쳐서 하나의 큰 구조물을 만드는 기법이다. 
UE4 까지는 Kitbashing이 이상적이지 않았다. 왜냐하면 각각의 물체에 대한 Drawcall을 호출하면서도 동시에 보이지 않는 물체를 그려내야했기에 퍼포먼스에 악영향을 많이 끼치기 때문이다.

 

하지만 UE5의 Nanite로 인하여 높은 퍼포먼스 최적화를 동시에 Kitbashing을 할 수 있게 되었다.

* 이로 인하여 Nanite로 인해 drawcall, amount of instances, amount of geo on screen, 삼각형 개수의 영향을 크게 받지 않게 되었다. 

6. Nanite compresses extremely well


2년전 영상 업로드 시점 기준 1million triangle mesh = 14mb only
 

(이는 일반적인 1개의 4K 노말맵 보다도 작은 크기이다)


Nanite Sample Project의 크기가 큰 이유는 nanite가 아니라 텍스처들이 모두 4K, 8K 의 고화질이기 때문. 

즉, 리소스들의 크기임. 놀라운건 Nanite는 이미 거의 완벽히 압축을 하고 있음에도 불구하고 꾸준히 Nanite 압축 시스템을 업그레이드하고 있음.

■ Cons

 

1. Overdraw 


여러 지오메트리 레이어가 겹쳐있을 때 나나이트는 그릴 필요가 없는 픽셀들 또한 계산을 하기 때문에 Overdraw가 심할수록 2배 혹은 그 이상의 성능을 요구하게 된다.

 

* 이는 Nanite에 국한되는 문제가 아니라 현대 렌더링 기술 전반에서 발생할 수 있는 문제이다.


Nanite Visualization -> Overdraw를 보면 Overdraw의 강도를 열화상 카메라처럼 볼 수 있게 되는데 따뜻한 색깔 (빨간색) 일수록 Overdraw가 강하다는 의미이다.

예시 사진 (2024. 4. 22)


그렇기 때문에 항상 레벨링할 때는 합리적인(reasonable) 선에서 제작을 해야한다.

(★) the layers of stack geometry 를 항상 minimum으로 유지해야한다. (Tip: 10cm이상 금지)

 

2. 나나이트는 아래에 대하여 서포트하지 않는다

- Translucent / Masked Materials
- Two-sided faces
- Deforming / Skeletal Meshes
- Tesselation / Displacement (-> 5.4부터 가능해짐)


- Aggregate Geometry (If use, performance is really going to struggle)
: Fine Details like Hair, Tree, Leavse, Foilage  (-> 5.1로 업데이트 되면서 이때부터 가능해짐)

즉, Skeletal Animation, Morph Targets, Spline Meshes에는 지원이 안되고 나나이트가 활성화된 메시는

Vertex Painting을 지원하지 않는다. 왜냐하면 나나이트가 활성화된 정적메시의 Vertex Tangent는 데이터 크기를 줄이기 위해 탄젠드 데이터를 저장하지 않는다고 언급되어있다. 하지만 향후에는 vertex tangent를 지원해줄 계획이 있다고는 한다.

5.2 문서

■ When should I use Nanite?

A mesh is a good candidate for Nanite if:
- Many triangles with very small size on-screen
- Many instances used in the scene
- Acts as a major occluder of Nanite geometry

(ex) Giant Cliff Phase, Big closed watertight meshes  <- Perfect things for nanite

 

[개인 생각]

▼ 참고 (링크)

모든 정적 메시에 적용을 해놓으면 더 빠르게 렌더링한다고 하지만, 외국 커뮤니티를 찾아보면 LOD보다 성능을 더 갉아먹는 사례가 종종 보인다.

 

공식 문서와 여러 사례를 조사해보고 짧은 지식을 갖고 있는 나의 생각을 정리 해봤다 (24. 04. 22)

 

Nanite를 모든 메시에 적용하는 overuse를 하기 보다는 적절히 사용할 수 있는 곳 (2m+ polys meshes)에만 사용하고 나머진 기존 LOD 기법을 적용하는 것이 이상적인 것 같다.

 

정리하자면

1. Dynamic한 scene이 아니라 카메라 무빙이 거의 정적이라면 굳이 Nanite를 쓸 필요가 없고 LOD를 쓰는 것이 더 최적화에 좋을 것이다.

 

2. Triangle의 개수가 무수히 많은 Photorealistic한 메시를 위주로 적용하는 것이 좋을 것 같다.

 

3. Scene에서 수 많은 개체가 공통적으로 갖고있는 메시에 Nanite를 적용하는 것이 좋을 것 같다.

 

(+4. VSM과 같이 한 번 사용해보는 실험을 해봐야겠다.)

unsung hero는 보이지 않는 곳에서 시민들을 도와주는 영웅과 같은 것을 의미함

[용어]

* 오클루더 (Occluder)

다른 오브젝트를 가리는 역할. 사전 연산을 걸쳐서 데이터를 미리 Bake 해놓는다. 따라서 Static 오브젝트이다.


* 오클루디 (Occludee)

오클루더에 의해 가려지는 오브젝트.

 

■ Reference

https://www.youtube.com/watch?app=desktop&v=P65cADzsP8Q

 

728x90