스터디 목적 : 최근 Linkedin 에 올린 OPAQUE TREE 개시물에 여러 실무자 분들 중 일부가 이 Nanite를 이용한 많은 Tris 개수의 OPAQUE 식생이 기존 Card 식생보다 최적화 측면에 더 이득이 있을수는 있어도 조심하여 사용해야하고 이또한 최적의 결과물이라고는 할수 없다는 의견이 있었습니다. 따라서 저는 Nanite 라는 기능이 나옴에도 불구하고 왜 우리는 계속해서 Polygon에 자유롭지 못한가에 대한 의문이 생겼습니다.
Nanite를 enable 하면 무조건 빨라진다는것은 큰 착각이다. 최적화를 위해서는 triangle 개수도 중요하지만 동시에 중요한 것은 screen space 를 고려한 topology방법이다. 이 이유는 QUAD PIXEL & Scan Converter에 있다.
게임 오브제는 모두 Triangle 이고 모든 픽셀은 Sample position을 가지고 있는데 이 Triangle 면이 1번 사진처럼 sample position 내부로 들어오면 GPU POWER를 사용해 2번 사진처럼 화면에 삼각형 면을 그리게 된다.

1번 사진

2번 사진
하지만 모든 픽셀에세 이 프로세스가 진행되는것은 아니다. (1번 사진 처럼) 2 X 2 즉 “Quad” 라고 불리는 픽셀 단위에서 진행이 된다. 이때 (2번사진 처럼) 파란색으로 표시된 Quad 구역에 단 하나의 픽셀이라도 면이 포함된다면 2X2 QUAD 픽셀 전체에 GPU 렌더링이 실행되는 Quad inefficiency 즉, 과부화가 생긴다.

1번 사진Q

QUAD의 모든 영역을 GPU 낭비없이 사용

QUAD의 2/4, 50% GPU POWER 낭비

2번 사진

QUAD의 1/4, 1/4 GPU POWER 낭비

QUAD의 3/4, 75% GPU POWER 낭비
만약 triangle 이 2 x 2 quad 보다 작아지면 어떨까? 위 사진 (3/4 처럼 GPU power 낭비가 생긴다) 따라서 Triangle의 screen size가 작아질수록 quad inefficiency가 발생한다.

TOPOLOGY 최적화 비교 그래프
https://www.humus.name/index.php?page=Comments&ID=228&start=0
Scan Converter는 삼각형의 $X, Y$ 최소/최대 좌표를 이용해 Bounding Box를 만들고, 그 박스 안에 들어오는 '타일(Tile)'들을 훑으며 "여기에 삼각형 조각이 있나?"를 체크합니다.
이때 Fan 형태의 가늘고 긴 형태의 triangle은 빈 공간의 Bounding box, 즉 불필요한 검증 테스트가 여러번 중첩되어 과부화가 걸려 Rasterize 과정에 (Scan Converter와 Primitive Assembler 단계) 데이터가 병목(Bottleneck) 현상을 일으켜 전체 프레임 레이트가 떨어지는 문제가 발생합니다.

https://gpuopen.com/download/AMD_Graphics_pipeline_GIC2020.pdf
Triangle 개수만큼 중요한것은 “screen space”에서 triangle 면이 효율적으로 픽셀을 채우는것이 중요하다.