Skip to content

브라우저에서 오픈 월드 만들기, 6부: 클립맵이 줄거리를 바꿨다

글쓴이 Oleg Sidorkin, Cinevva CTO 겸 공동 창업자

처음 오셨나요? 시리즈 가이드를 보세요. spike가 무엇인지 설명하고 모든 편을 링크해 둡니다.

Spike 10 이전까지 우리의 머릿속 모델은 여전히 "세계가 커지면 지오메트리도 많아진다"였습니다. Spike 10 이후 그 모델은 "지오메트리 예산은 고정, 카메라 중심의 링 업데이트"로 바뀌었습니다. 이 전환이 프로젝트의 방향을 바꿨습니다.

지오메트리 클립맵의 아이디어는 단순합니다. 지형을 카메라를 중심으로 한 동심원 링 묶음으로 렌더링합니다. 가장 안쪽 링이 정점 밀도가 가장 높습니다. 바깥으로 한 링 k씩 갈 때마다 정점 간격이 두 배가 되어 sk=s02k가 되고, 그래서 안쪽 링보다 4× 넓은 지면을 덮습니다.

이 두 배가 핵심 전부입니다. 시야 거리는 링 개수에 따라 기하급수적으로 늘어나는데 dviews02L, 정점 비용은 선형으로만 늘어납니다.

VtotalN2L

N×N 정점짜리 링 L개에 대해 그렇습니다. 얼마나 멀리 볼 수 있는지를 두 배로 늘리는 비용은 링 하나가 더 드는 것이지, 지오메트리가 네 배로 드는 게 아닙니다. 세계 크기와 상관없이 삼각형 수는 대체로 일정하게 유지됩니다. 항상 같은 L개의 링을 같은 해상도로 렌더링하기 때문입니다.

새 탭에서 Spike 10 열기 ↗ · 소스 보기

실전에서의 요령은 링 경계에서의 geomorphing이었습니다. 한 정점이 어떤 LOD 링에서 다음 링으로 넘어갈 때, 그 높이는 고해상도 샘플과 저해상도 샘플 사이에서 부드럽게 섞여야 합니다. 그게 없으면 카메라가 움직여 링이 이동할 때마다 눈에 띄는 pop이 생깁니다. 우리는 정점이 링 가장자리에서 떨어진 거리에 기반한 블렌드 계수로 이를 처리했고, 정점 셰이더에서 높이를 보간했습니다.

h=lerp(hfine,hcoarse,α),α=smoothstep(dnear,dfar,d)

여기서 d는 정점이 카메라에서 떨어진 거리입니다. 링 안쪽(ddnear)에서는 정점이 풀해상도 높이를 쓰고, 다음 링에 도달할 무렵(ddfar)에는 이미 그 링이 쓸 거친 높이로 옮겨가 있어서 pop이 일어날 게 남아 있지 않습니다.

미묘한 교훈 하나는 카메라 이동 테스트에서 나왔습니다. 정적 스크린샷으로 클립맵을 판단하면서 전환 아티팩트를 놓치기는 쉽습니다. 우리는 링 경계를 일정한 속도로 가로질러 다니며 시간 축의 노이즈를 살피는 데 시간을 들였습니다. 스크린샷은 거짓말을 했습니다. 움직임이 진실을 말했습니다.

이 spike는 또 깔끔한 아키텍처 경계도 줬습니다. 근거리 지형은 시간이 지나며 동적이고 비싸질 수 있습니다. 볼류메트릭 편집, 더 높은 머티리얼 복잡도, 물리 상호작용이 더해지면서요. 원거리 지형은 안정적이고 예측 가능하고 저렴하게 유지될 수 있습니다. 그 분리가 이 시점부터 모든 아키텍처 결정의 척추가 됐습니다.

자기 프로젝트에 클립맵을 검토하고 있다면, 예쁜 컷이 아니라 스트레스 루프를 테스트하세요. 긴 이동 경로, 변하는 카메라 고도, 반복되는 경계 횡단이야말로 진짜 문제를 드러내는 것들입니다.

7부에서는 볼류메트릭 메싱을 더해 "표면으로서의 지형"에서 "편집 가능한 볼륨으로서의 지형"으로 넘어갑니다. 이 프로젝트가 렌더러이기를 그만두고 월드 에디터가 되기 시작한 지점이 바로 거기였습니다.

이 장에서 언급한 기술

지오메트리 클립맵. Losasso와 Hoppe가 SIGGRAPH 2004에서 소개했으며(논문), 지오메트리 클립맵은 지형을 카메라를 중심으로 한 동심 정사각형 링으로 렌더링합니다. 각 링은 이전 링의 두 배 면적에 정점 해상도는 절반입니다. 전체 정점 수는 일정합니다. 대략 N2L입니다. N=256L=8 레벨이면 세계 크기와 상관없이 2562×8524,000개 정점입니다. CPU는 카메라가 움직일 때 각 링의 heightmap 데이터를 업데이트합니다. 정점 셰이더는 텍스처에서 높이를 읽어 평평한 그리드를 변위시킵니다. 지오메트리 클립맵에 관한 우리 지형 가이드GPU Gems 2, 2장을 보세요.

Geomorphing. 지형 LOD에서 가장 큰 시각적 아티팩트는 popping입니다. 패치가 LOD 레벨을 바꿀 때 정점이 갑자기 튀는 것이죠. Geomorphing은 전환 구간에 걸쳐 LOD 레벨 사이에서 정점 위치를 블렌딩해 이를 없앱니다. 각 정점은 현재 LOD 높이와 한 단계 거친 LOD 높이를 둘 다 저장합니다. 카메라 거리에 기반한 모프 계수가 둘 사이를 부드럽게 보간합니다. morphedHeight = mix(fineLodHeight, coarseLodHeight, smoothstep(lodNear, lodFar, distance)). 전환 구간은 보통 각 링의 바깥쪽 20%입니다. 정상적인 카메라 속도에서 전환은 보이지 않습니다. geomorphing 세부 내용을 보세요.

CDLOD(쿼드트리 적응형 클립맵). Strugar가 고정 링 클립맵을 개선한 것입니다(2014, 논문). 균일한 해상도의 동심 링 대신, CDLOD는 지형 복잡도에 적응하는 쿼드트리를 씁니다. 평평한 지역은 거친 노드를 쓰고, 디테일이 높은 지역(절벽, 능선)은 더 세밀하게 분할합니다. 이는 청크마다 복잡도가 크게 다른 창작자 세계에서 중요합니다. 우리 지형 가이드의 CDLOD를 보세요.


12부 중 6부.
이전: 5부 - 예쁜 것들에 예산 배정하기
다음: 7부 - 마칭 큐브와 첫 진짜 동굴들
시리즈 가이드: /ko/blog/2026-02-25-open-world-browser-series-guide