나나이트 소개
나나이트는 한 가지 기능이 아니라 여러가기 기술들이 복합적으로 적용된 결과물
- 버추얼 텍스처링처럼 지오메트리 버전
- 뷰에 따라 필요한 디테일 수준의 지오메트리 데이터만 가상화
- 폴리곤 수나 드로 콜의 제약 없이 하이폴리곤 메시를 바로 사용
- 로우폴리곤 + 노멀 맵 대신 하이폴리곤 모델을 바로 사용 가능
나나이트 개발 목표
- 영화에 사용되는 에셋을 퀄리티 손실 없이 그대로 사용
- 가상화된 지오메트리 -> 화면에 보이는 것만 렌더링
- 제한 없는 렌더링 예산 -> 폴리곤 수, 드로 콜, 메모리
렌더링 파이프 라인을 새로 발명하는 수준의 개발이였다.
결국인 삼각형, 삼각형은 렌더링의 가장 기본 단위이다. 화면에 보이는 삼각형을 빠르게 그리자.
GPU 주도 파이프라인
Retained 모드 렌더러
- 전체 GPU씬 유지
- 변경된 부분에 대해서만 보수(Conservative) 하면서 업데이트
- 모든 버텍스/인덱스 데이터를 하나의 큰 리소스에 보관
뷰 단위로 한 번에 래스터화한다
- 전체 장면의 깊이를 그릴 때 드로 콜 1회 사용
- 머터리얼 연산은 별도의 패스로 분리가 되어 머터리얼 평가나 쉐이더의 변경 없이 전체 장면에서 깊이 버퍼만 그린다고 한다면 하나의 드로우 콜로 래스터화 하는 것이 가능 해짐
가시성 검사: 2pass 오클루전 컬링
이전 프레임에 보였던 것들이 현재 프레임에서도 보일 가능성이 높다.
이전 장면에는 보이지 않았지만 현재 프레임에 보이는 것들을 보수해서(Conservative) 그립니다.
이렇게 해서 오브젝트 단위가 아니라 필셀 단위로 가시성을 판단하게 되었고 완벽한 오클루전 컬링 데이터를 얻을 수 있었다. 이전 프레임의 정보 덕분에 효율적인 Conservative한 컬렁이 가능해 졌습니다.
HZB : Hierarchical Z-Buffer
두 번의 레스터화가 있습니다.
- 이전 프레임의 HZB로 보이는 오브젝트 빠르게 그리기
- HZB다시 빌드, 업데이트된 오브젝트 추가로 그리기
화면 전체를 두 번에 걸쳐 레스터화 한다고 하면 엄청 느릴 것으로 생각 될 수 있으나 생각 보다 빠릅니다.
그 이유는 비저빌리티 버퍼 덕분입니다.
비저빌리티 버퍼(Visibility Buffer, 가시성 버퍼)
레스터화가 느릴 것 같지만 생각 보다 빠름
- 최소한의 데이터 만으로 비저빌리티 버퍼 구성
- 캐쉬 히트율이 높게 개발 되었다
- 오버 드로가 거의 발생하지 않는다
- 오브젝트 개수에 관계없이 거의 고정 비용으로 처리한다
비저빌리티를 머터리얼로부터 분리
가시성검사를 한번에 마치기 위해 머터리얼 평가 부분을 분리 하였다.
별도의 디퍼드 머터리얼 패스 버퍼에서 별도의 지오메트리 패스 버퍼에 기록한다.
그 이후에는 기존의 디퍼드 셰이딩 랜더러에 통합된다.
이런 식으로 해서, 불투명한 지오메트리들을 한번의 드로 골로 그릴 수 있어짐
클러스터 컬링
가시성 검사를 거의 고정된 비용으로 할 수 있게 되었지만 메쉬의 일부가 다른 오브젝트에 묻혀있거나 거려져 있는 상황에서 화면에 보이지 않는 불필요한 연산 비용이 발생되는 문제가 있었습니다.
좀 더 효율적인 관리를 위해서 메쉬를 좀더 작은 단위인 클러스터로 나누게 되었습니다.
각각의 클러스터는 GPU의 최대 성능을 활용할 수 있도록 하게 위해 128개 이하의 삼각형으로 구성이 되었다.
각 클러스터 마다 바운딩 데이터를 만들고 각 클러스터별로 컬링을 하였습니다.
클러스터 LOD
가시성 버퍼와 클러스터 컬링으로 훨씬 더 빨라지긴 했지만 화면내 삼각형의 밀도가 높아 질 수록 점점 느려지는 문제는 여전히 남아 있었습니다. 크기가 작은 삼각형을 레스터화할때 효율이 떨어지는 편인데 삼각형의 크기가 레스터의 크기와 가까워 질 수록 성능은 더욱 떨어 집니다. 다음 그림가 같은 경우 입니다.
기존의 LOD 단위의 메쉬가 어느 정도 역할을 해주었지만 삼각형의 개수와 상관없이 일괄된 성능을 유지하려면 화면 전체에서 픽셀 보다 작은 삼각형이 되도록이면 나타나지 않도록 화면 전체의 삼각형의 수가 고르게 유지를 해야 했다. 클러스터 단위의 LOD를 만들게 되었다.
LOD 사이의 경계가 끊김없도록 이어지도록 클러스터 경계 보존을 합니다. (위 그림 주황색 점선)
폴리곤 개수에 관계 없이 고정된 성능을 가지게 되었다.
- 고정된 클러스터 개수만 랜더링
- 해상도에 비례한 성능 비용
메쉬 전체가 메모리에 로딩 되는 것이 아니라 스트리밍 방식으로 선택된 LOD만 로드되고 언로드 되기 때문에 메모리에는 화면에 보이는 데이터만 올라가게 된다. 만약, 장면 전환이 빠르거나 밀도가 높은 씬이라면 고성능의 디스크가 필하다.
HW 레스트라이저 보다 3배 빠른 SW 레스터라이저 개발
이런 방식으로 해서 화면을 픽셀 크기에 가까운 삼각형들로 채우는 것이 가능해 졌다. 기존에 사용되던 하드웨어 레스터라이저는 화면에 차지하는 삼각형의 크기가 작을 수록 점점 성능이 떨어 졌기 때문에 특화된 소프트웨어 래스터라이저를 구현 하였다.
삼각형의 클 경우에는 HW 래스터라이저가 유리할 수 있다. 때문에 장면 별로 마스킹 하여 SW + HW 하이브리드하게 래스터라이저를 사용한다.
밀도가 높은 부분은 SW 래스터라이저, 밀도가 낮은 부분은 HW 래스터라이저 사용.
나나이트 사용 관련하여 다음 글을 참고해 주세요.
[게임 개발/Unreal Engine] - [UE5] 나나이트 사용하기
https://epiclounge.co.kr/new/replay2021/view6.html
'게임 개발 > Unreal Engine' 카테고리의 다른 글
[UE4] 캐릭터 점프 속도 빠르게 하기 (0) | 2022.01.08 |
---|---|
[UE4] Project Setting 설정 추가하기(UDeveloperSettings) (0) | 2021.12.30 |
[UE4] visual studio 2019 자동 들여쓰기 설정 (0) | 2021.12.05 |
[UE4] Unreal Engine Anim blueprint C++ 개발 설정 (0) | 2021.12.04 |
[UE4] Unreal Engine 4 include 참조 경로 설정 (0) | 2021.12.04 |