TECH 으로 돌아가기
TECH HACKER NEWS 오늘 8분 읽기 31 READS

삼각형을 미리 쪼개 두지 않는다: Nanite 테셀레이션은 디스플레이스먼트 문제를 어떻게 풀었나

삼각형을 미리 쪼개 두지 않는다: Nanite 테셀레이션은 디스플레이스먼트 문제를 어떻게 풀었나
SOURCE IMAGE · HACKER NEWS
삼각형을 미리 쪼개 두지 않는다: Nanite 테셀레이션은 디스플레이스먼트 문제를 어떻게 풀었나

Nanite를 만든 사람이 직접 풀어낸 테셀레이션 이야기

언리얼 엔진 5의 간판 기술인 Nanite를 설계한 에픽게임즈의 브라이언 캐리스가 자신의 블로그 Graphic Rants에 Nanite 테셀레이션에 관한 글을 올렸어요. Nanite 테셀레이션은 UE 5.3에서 실험 기능으로 처음 들어온 뒤 계속 다듬어지고 있는 기능인데, 그 설계를 만든 사람이 「왜 이렇게 만들었는지」를 직접 설명한다는 점에서 그래픽스에 관심 있는 분이라면 놓치기 아까운 글이에요. 이 글에서는 그 기술이 무엇이고 왜 어려운 문제였는지, 기존 방식과 뭐가 다른지를 차근차근 풀어볼게요.

먼저 Nanite가 뭐였는지부터

Nanite는 「가상화 지오메트리」라고 부르는 기술이에요. 이게 뭐냐면, 게임에 수억 개의 삼각형으로 된 초고해상도 모델을 그냥 넣어도 엔진이 알아서 화면에 필요한 만큼만 골라 그려주는 거예요. 메시를 128개 정도의 삼각형 덩어리인 클러스터로 쪼개고, 이 클러스터들을 여러 단계의 상세도로 미리 만들어 계층 구조로 저장해 둬요. 런타임에는 GPU가 카메라 거리와 화면 크기를 보고 어느 단계의 클러스터를 쓸지 결정하죠. 그리고 픽셀보다 작은 삼각형은 하드웨어 대신 직접 짠 소프트웨어 래스터라이저로 찍어요. 결과적으로 삼각형 개수가 아니라 화면 픽셀 수에 비례하는 비용으로 아무리 복잡한 모델도 그릴 수 있게 됐어요.

테셀레이션과 디스플레이스먼트는 또 뭘까

테셀레이션은 삼각형을 실행 중에 더 잘게 쪼개는 걸 말해요. 디스플레이스먼트는 그렇게 잘게 쪼갠 정점들을 텍스처 값에 따라 실제로 밀어 올리거나 눌러서 표면에 진짜 굴곡을 만드는 거고요. 흔히 쓰는 노멀맵과 비교하면 차이가 분명한데요, 노멀맵은 빛 계산만 속여서 울퉁불퉁해 보이게 만드는 거라 옆에서 보면 실루엣이 여전히 평평해요. 디스플레이스먼트는 형태 자체가 바뀌니까 실루엣도 살고 그림자도 제대로 생겨요.

문제는 이걸 Nanite 안에서 하는 게 생각보다 훨씬 까다롭다는 점이에요. 두 가지 쉬운 길이 있는데 둘 다 막혀 있거든요.

첫 번째 길은 DirectX 11부터 있던 하드웨어 테셀레이션 파이프라인을 쓰는 거예요. 헐 셰이더와 도메인 셰이더로 패치를 쪼개는 방식인데, 이건 고정 기능 단계라 Nanite의 클러스터 단위 컬링이나 소프트웨어 래스터라이저와 맞물리지 않아요. 게다가 작은 삼각형이 대량으로 나오면 하드웨어 성능이 급격히 떨어지는 것으로 오래전부터 악명이 높았고요.

두 번째 길은 아예 미리 잘게 쪼개서 Nanite 메시로 임포트하는 거예요. Nanite는 어차피 삼각형 수억 개도 감당하니까요. 그런데 디스플레이스먼트는 보통 타일링되는 텍스처예요. 바위 텍스처를 지형 전체에 반복해서 깔면 그 굴곡을 정점으로 미리 구워 둔 데이터가 지형 크기에 비례해 폭발해요. 재질을 바꾸거나 애니메이션을 걸 수도 없고요.

Nanite의 답: 쪼개되 저장하지 않는다

그래서 Nanite 테셀레이션이 택한 방향은 이래요. 클러스터 컬링이 끝나고 화면에 보이는 게 확정된 삼각형만, 래스터라이즈하기 직전에 그 자리에서 쪼개고, 쪼갠 결과는 메모리에 남기지 않고 바로 소프트웨어 래스터라이저로 흘려보내는 거예요. 옛날 픽사의 REYES 렌더러가 표면을 픽셀 크기의 마이크로폴리곤으로 잘게 다이싱해서 그리던 방식이 실시간으로 돌아온 셈이죠.

세부적으로 몇 가지 장치가 있어요. 얼마나 쪼갤지는 삼각형의 각 변이 화면에서 차지하는 길이로 정해요. 변 단위로 계산하기 때문에 인접한 두 삼각형이 공유하는 변은 항상 같은 정도로 쪼개지고, 그래서 표면에 틈이 생기지 않아요. 이걸 워터타이트하다고 하죠. 쪼개는 패턴은 삼각형 안을 균일한 마이크로 삼각형 격자로 채우는 방식이고, 쪼갬 정도가 큰 삼각형은 GPU 작업 큐에 다시 넣어 여러 단계로 재귀적으로 처리해요. 쪼개진 정점 하나하나의 위치는 재질 그래프에 정의된 디스플레이스먼트 로직으로 계산되니, 아티스트가 재질을 바꾸면 형태도 바로 따라와요.

이 구조의 장점은 비용이 다시 픽셀 수에 비례한다는 거예요. 멀리 있어서 작게 보이는 바위는 조금만 쪼개고, 코앞에 있는 바위만 잘게 쪼개요. 미리 구워 둘 필요가 없으니 저장 공간은 원본 메시와 텍스처뿐이고요.

업계 흐름에서 보면

디스플레이스먼트를 실시간에 제대로 하려는 시도는 여럿 있었어요. 엔비디아는 RTX 40 시리즈에서 Displaced Micro-Mesh라는 접근을 내놨는데, 이건 디스플레이스먼트를 압축된 형태로 미리 구워 두고 하드웨어 레이트레이싱까지 그 데이터를 그대로 쓰는 방식이에요. 「미리 구워서 작게 저장」 대 「필요할 때 즉석에서 생성」이라는 정반대 철학이 공존하고 있는 셈이죠. 메시 셰이더는 Nanite가 하드웨어 래스터 경로에서 이미 활용하고 있고요. 유니티나 고도 같은 다른 엔진에는 아직 이 수준의 런타임 디스플레이스먼트가 없어서, 이 분야는 당분간 언리얼이 한참 앞서 있다고 봐야 해요.

한국 개발자에게는

국내 대형 게임 스튜디오 상당수가 UE5로 개발 중이니 실무 영향이 바로 있어요. 아티스트 워크플로가 바뀌거든요. 지금까지는 저폴리 메시에 노멀맵을 얹는 게 표준이었는데, 앞으로는 단순한 메시에 타일링 디스플레이스먼트 텍스처를 얹어서 지형, 바위, 벽돌 같은 디테일을 무한히 확대해도 무너지지 않게 만들 수 있어요. 다만 아직 실험 단계 딱지가 붙어 있고 PC와 콘솔 위주라, 모바일 프로젝트라면 당분간 구경만 해야 해요.

그래픽스 엔지니어를 지망한다면 이 글은 좋은 교재예요. GPU 작업 큐, 소프트웨어 래스터라이저, 비저빌리티 버퍼, 워터타이트 테셀레이션 같은 개념이 한 문제 안에서 어떻게 엮이는지 볼 수 있으니까요. 면접에서 「Nanite가 왜 소프트웨어 래스터라이저를 쓰나요」 같은 질문이 나올 때 자신 있게 답할 수 있게 될 거예요.

정리

핵심 한 줄: Nanite 테셀레이션은 삼각형을 미리 쪼개 저장하는 대신, 보이는 삼각형만 그리기 직전에 쪼개고 버리는 방식으로 디스플레이스먼트의 저장 폭발 문제를 풀었다.

여러분 프로젝트에서 노멀맵 대신 진짜 디스플레이스먼트를 쓰고 싶은 곳이 있나요? 그리고 「미리 구워 저장」과 「즉석 생성」 중 어느 쪽이 앞으로 더 많은 영역을 차지할지 의견도 궁금해요.


🔗 출처: Hacker News

SOURCE · HACKER NEWS
원문 전체 보기 → http://graphicrants.blogspot.com/2026/02/nanite-tessellation...
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기
처리 중...