브라우저 오픈 월드를 위한 동적 LOD 및 스트리밍 기반 지형 생성
펄린 노이즈를 적용한 하이트맵은 절차적 지형을 만들 때 흔히 선택하는 출발점입니다. fBm 옥타브를 몇 겹 쌓고 색상 그레이디언트를 적용하면 얼추 지형처럼 보이는 결과물이 나옵니다. 대부분의 튜토리얼은 여기에서 끝납니다. 하지만 실제 지형은 노이즈를 겹친 것처럼 보이지 않습니다. 물이 깎아 만든 하곡, 응력 균열로 형성된 절벽면, 수백만 년에 걸친 침식으로 만들어진 동굴과 아치가 존재합니다. 또한 지형을 형성한 동일한 물리적 과정에서 비롯되는 상관관계가 있는 텍스처도 있습니다. 평지에는 풀이 자라고, 가파른 경사면에는 암석이 드러나며, 수목 한계선 위에는 눈이 쌓입니다.
이 가이드에서는 노이즈 다음 단계에 무엇이 있는지 살펴봅니다. 물리학에 기반한 생성 방식, 동굴과 돌출 지형을 처리할 수 있는 볼류메트릭 표현, 확산 기반 신경망 지형 합성, 그리고 이 모든 것을 브라우저 탭에서 60fps로 렌더링하는 데 필요한 GPU 주도 LOD 및 스트리밍 파이프라인을 다룹니다.
여기서 다루는 모든 내용은 WebGL 2 / WebGPU에서 실행되고 네트워크를 통해 스트리밍되며 크리에이터가 편집할 수 있는 멀티플레이어 오픈 월드라는 구체적인 제약을 전제로 합니다.
하이트맵만으로는 충분하지 않은 이유
하이트맵은 각 그리드 지점마다 하나의 높이 값을 저장합니다. 즉, (x, z)가 주어지면 y를 반환하는 2D 함수입니다. 이 표현 방식은 작고 GPU 친화적이며 빠르게 렌더링할 수 있습니다. 하지만 크리에이터 월드에서 문제가 되는 근본적인 한계가 있습니다.
동굴이나 돌출 지형을 표현할 수 없습니다. 하이트맵은 하나의 지점에 서로 다른 두 높이가 존재하는 지형을 표현할 수 없습니다. 따라서 동굴, 아치, 돌출된 절벽, 터널, 공중섬은 모두 구현할 수 없습니다. Minecraft, No Man's Sky, Deep Rock Galactic이 모두 볼류메트릭 지형을 필요로 하는 이유입니다.
수직 지형을 표현할 수 없습니다. 하이트맵에서 수직 절벽면은 거의 무한대에 가까운 경사가 되며, 이로 인해 심각한 텍스처 늘어짐과 충돌 판정 아티팩트가 발생합니다. 실제 절벽에는 암붕이나 틈새 같은 수평적 특징이 있지만 하이트맵으로는 이를 표현할 수 없습니다.
노이즈는 결국 노이즈처럼 보입니다. fBm을 8옥타브로 쌓고 도메인 워핑까지 적용하더라도 지형에는 인공적인 느낌이 남습니다. 능선, 배수망, 퇴적물, 지각 습곡과 같은 실제 지질의 방향성 구조가 없기 때문입니다. 이러한 패턴은 노이즈 함수가 아니라 물리적 과정에서 생겨납니다.
크리에이터의 편집 범위가 제한됩니다. 크리에이터가 높이만 수정할 수 있다면 터널을 파거나 동굴을 만들거나 지하 공간을 구축할 수 없습니다. 크리에이터가 진정으로 변형할 수 있는 월드를 만들려면 지형 표현 방식이 추가뿐 아니라 제거도 지원해야 합니다.
해답은 하이트맵을 완전히 버리는 것이 아닙니다. 단순한 표면으로 구성된 지형의 90%에는 여전히 하이트맵이 가장 적합한 표현 방식입니다. 해답은 하이브리드 접근 방식입니다. 기본 지형에는 하이트맵을 사용하고 복잡한 지오메트리가 필요한 곳에는 볼류메트릭 오버레이를 적용하며, 사실적인 지형에는 물리적으로 정확한 생성 방식을, 노이즈로는 얻을 수 없는 다양성에는 신경망 합성을 사용합니다.
빠른 답변: 실제로 구축할 시스템
본격적으로 살펴보기 전에 먼저 의사 결정 프레임워크부터 제시하겠습니다. 이 글의 나머지 부분에서 각 요소를 자세히 설명합니다.
지형 표현
하이브리드 하이트맵 + SDF 시스템을 사용합니다. 하이트맵은 전체 월드를 담당합니다. 저렴하고, 작으며, 이미 검증된 방식입니다. SDF 볼륨은 동굴, 돌출 지형 또는 크리에이터가 깎아 만든 요소가 필요한 곳에만 존재합니다. 전체 청크의 약 5~10% 정도입니다. 이렇게 하면 월드의 90%는 하이트맵 수준의 비용으로 처리하면서 필요한 곳에서는 임의의 지오메트리를 지원할 수 있습니다.
생성 파이프라인
서버 측에서 다음과 같은 연쇄 프로세스로 실행합니다.
- Terrain Diffusion 또는 텍스트 프롬프트용 MESA가 시드에서 기본 하이트맵을 생성합니다. 실제 고도 데이터로 학습한 지질학적으로 사실적인 지형을 사용해 노이즈를 대체합니다.
- 해석적 침식(하천 동력 법칙)이 수 밀리초 안에 하이트맵을 다듬어 하천망과 능선을 만듭니다.
- TerraFusion 또는 Geodiffussr가 하이트맵에서 상관관계가 있는 텍스처를 생성합니다. WebGL 2 폴백에는 절차적인 경사도/고도 규칙을 사용할 수도 있습니다.
- 생태계 시뮬레이션이 식생 밀도 맵을 생성합니다.
- Arenite 방식의 침식이 지형에 필요한 절벽면, 아치, 동굴을 위한 SDF 볼륨을 생성합니다.
- 청크로 분할하고 압축한 뒤 CDN에 업로드합니다. 평균 청크 크기는 2~8KB이며, 볼류메트릭 데이터가 있는 복잡한 청크는 20~100KB입니다.
크리에이터는 매개변수를 조정하거나("더 습하게", "산을 더 많이", "동굴 추가"), 의도를 스케치하거나, 브러시와 SDF 도구로 직접 조형하는 방식으로 이 파이프라인과 상호작용합니다.
LOD 전략
| 브라우저 기능 | 하이트맵 LOD | 볼류메트릭 LOD | 식생 LOD |
|---|---|---|---|
| WebGPU | 컴퓨트 컬링 + 간접 드로를 사용하는 GPU 주도 쿼드트리(CDLOD) | 컴퓨트 마칭 큐브 + Transvoxel을 사용하는 다중 해상도 SDF | 간접 드로를 사용하는 ComputeInstanceCulling |
| WebGL 2 | CPU 측 링 업데이트를 사용하는 지오메트리 클립맵 | 2~3단계 LOD로 사전 생성하고 캐시한 메시 | CPU 프러스텀 컬링, InstancedMesh |
두 경로 모두 팝 현상 없는 전환을 위해 버텍스 셰이더에서 지오모핑을 사용합니다. 먼 거리의 식생에는 모두 빌보드 임포스터를 사용합니다. WebGPU 경로가 더 빠르지만(지형 예산 3.5ms), WebGL 2 경로도 충분히 실용적입니다(6.5ms).
스트리밍
점진적 로딩을 사용합니다. 지형 지오메트리를 먼저(<100ms), 텍스처를 두 번째(<300ms), 식생을 세 번째(<1초), 볼류메트릭 데이터를 네 번째(<3초)로 로드합니다. 플레이어의 속도를 기준으로 미리 가져옵니다. 전체 지형 메모리 예산은 256MB입니다.
편집
표면 조형에는 하이트맵 브러시를 사용합니다(올리기, 내리기, 부드럽게 하기, 침식). 볼류메트릭 편집에는 SDF 프리미티브를 사용합니다(동굴 파기, 아치 추가). 두 방식 모두 로컬에서는 즉시 반영되고 100~300ms 안에 서버와 동기화되며 델타 업데이트를 통해 다른 플레이어에게 전파됩니다.
어떤 순서로 구축할 것인가
1~2개월차: 지오메트리 클립맵을 사용한 하이트맵 지형. WebGL 2만 지원합니다. CDN에서 스트리밍하고 절차적 경사도/고도 머티리얼을 사용합니다. 이렇게 하면 모든 브라우저에서 지형을 화면에 표시할 수 있습니다. 생성에는 노이즈 + 해석적 침식을 사용합니다. Terrain Diffusion은 나중에 도입해도 됩니다.
3~4개월차: 식생과 대기. 밀도 맵에서 생성한 GPU 인스턴싱 풀과 나무, 낮/밤 주기가 있는 절차적 하늘, 대기 안개, 캐스케이드 섀도 맵을 구현합니다. 월드가 실제 장소처럼 느껴지기 시작합니다.
5~6개월차: 크리에이터 편집 기능. 하이트맵 브러시 도구, 멀티플레이어 지형 편집을 위한 델타 기반 동기화, 동시 편집을 위한 공간 잠금을 구현합니다. 이 시점부터 크리에이터가 월드를 직접 다듬기 시작합니다.
7~9개월차: 볼류메트릭 지형과 WebGPU 경로. 동굴과 돌출 지형을 위한 SDF 오버레이, WebGPU 컴퓨트 기반 마칭 큐브, LOD 경계를 위한 Transvoxel, SDF 조형 도구를 구현합니다. 이를 통해 완전한 제작 도구 모음이 열립니다.
10~12개월차: 신경망 생성과 완성도 향상. 기본 하이트맵에는 Terrain Diffusion 또는 MESA를, 텍스처에는 TerraFusion/Geodiffussr를 사용합니다. 마이크로 디테일에는 페이저 노이즈를, 반복 패턴 방지에는 육각 타일링을 적용합니다. 가상 텍스처링과 라플라시안 블렌딩도 추가합니다. 지형이 프로덕션 품질에 도달합니다.
이 순서라면 2개월 후에는 플레이 가능한 결과물이, 4개월 후에는 아름다운 결과물이, 6개월 후에는 편집 가능한 결과물이, 12개월 후에는 최첨단 수준의 결과물이 완성됩니다.
이 글의 나머지 부분에서는 각 결정의 근거가 된 연구를 살펴봅니다.
하이트맵을 넘어선 지형 표현
부호 거리장(SDF)
부호 거리장은 3D 공간의 모든 지점에 가장 가까운 표면까지의 거리를 저장합니다. 양수 값은 외부, 음수 값은 내부를 나타내며 0을 지나는 지점이 표면 자체입니다. SDF는 동굴, 아치, 공중 지오메트리를 포함한 임의의 3D 형태를 표현할 수 있습니다.
SDF를 메시로 렌더링하려면 마칭 큐브 또는 그 변형 알고리즘을 실행하여 0 교차점을 삼각형으로 추출합니다. 메시 해상도는 그리드 해상도에 따라 결정됩니다. 256x256x256 SDF 그리드는 1미터 해상도로 대략 하나의 청크를 덮는 지형을 생성합니다.
브라우저 구현: WebGPU 마칭 큐브는 컴퓨트 셰이더를 통해 GPU에서 전적으로 실행됩니다. Will Usher의 webgpu-marching-cubes 구현은 브라우저에서 256^3 그리드를 실시간으로 처리하며 네이티브 수준의 성능을 냅니다. 이 알고리즘은 각 셀이 독립적으로 처리되는 완전 병렬화에 적합한 구조이므로 GPU 컴퓨트에 이상적입니다.
@compute @workgroup_size(4, 4, 4)
fn marchingCubes(@builtin(global_invocation_id) id: vec3<u32>) {
let sdfValues = sampleSDF(id);
let caseIndex = classifyCell(sdfValues);
if (caseIndex == 0u || caseIndex == 255u) { return; }
let triangles = lookupTriangulation(caseIndex);
let vertices = interpolateEdges(sdfValues, triangles);
appendToMeshBuffer(vertices);
}저장 비용: 8비트로 양자화한 256^3 SDF는 압축하지 않았을 때 16MB입니다. 하지만 볼륨 대부분은 표면에서 멀리 떨어진 빈 공간입니다. 실행 길이 인코딩이나 희소 옥트리 저장 방식을 사용하면 일반적으로 청크당 100~500KB까지 줄일 수 있어 하이트맵 지형과 비슷한 수준이 됩니다.
편집: SDF 지형은 본질적으로 편집에 적합합니다. 재질 추가는 거리장에 대한 min() 연산입니다. 재질 제거, 즉 땅 파기는 부호를 반전한 형태와의 max() 연산입니다. 형태 사이의 부드러운 블렌딩에는 smoothMin()을 사용합니다. 이러한 연산은 컴퓨트 셰이더에서 인터랙티브한 속도로 실행됩니다.
듀얼 컨투어링
마칭 큐브는 그리드 모서리에 정점을 배치하므로 부드러운 표면을 만들지만 절벽 끝이나 바위 모서리 같은 날카로운 특징은 사라집니다. 듀얼 컨투어링은 각 셀 안의 표면을 가장 잘 나타내는 위치에 셀당 하나의 정점을 배치하여 날카로운 모서리와 꼭짓점을 보존합니다.
이 알고리즘은 각 그리드 지점에서 거리장 값과 표면 노멀, 즉 SDF의 그래디언트를 모두 필요로 합니다. 각 셀마다 작은 최소제곱 문제를 풀어 최적의 정점 위치를 찾습니다. 그 결과 부드러운 지형과 날카로운 암석 특징을 모두 포착하는 메시를 얻을 수 있습니다.
Neural Dual Contouring(Chen 외, 2022, arXiv:2202.01999)은 최소제곱 솔버를 최적의 정점 위치와 모서리 교차점을 예측하는 신경망으로 대체합니다. 특히 복잡한 자연 암석 지형에서 더 높은 표면 재구성 정확도와 특징 보존 성능을 제공합니다.
Transvoxel 알고리즘
볼류메트릭 지형에서 가장 어려운 문제는 메시 생성이 아니라 LOD 전환입니다. 고해상도 청크가 저해상도 청크와 맞닿으면 경계에서 메시가 정확히 정렬되지 않아 눈에 띄는 틈이 생깁니다.
Eric Lengyel이 설계한 Transvoxel 알고리즘(transvoxel.org)은 서로 다른 해상도 사이의 경계를 따라 특수한 전환 셀을 삽입하여 이 문제를 해결합니다. 이 셀은 양쪽과 정확히 맞는 추가 삼각형으로 해상도 차이를 연결합니다. 이 알고리즘은 복잡한 경계 문제를 73개의 동치 클래스로 축소합니다. 무차별 대입 방식이라면 약 120만 개의 경우를 처리해야 합니다.
Transvoxel은 복셀 데이터가 동적으로 변경되는 실시간 애플리케이션을 위해 특별히 설계되었습니다. 크리에이터 편집, 침식, 채굴 같은 작업에 적합합니다. 특허 제약이 없으며 Space Engineers와 Astroneer 같은 출시 게임에도 사용되었습니다. 편집 가능한 볼류메트릭 지형을 갖춘 브라우저 월드에는 Transvoxel이 적합한 LOD 솔루션입니다.
하이브리드: 하이트맵 기반 + 볼류메트릭 오버레이
브라우저 오픈 월드에서 실용적인 접근 방식은 다음과 같은 계층형 시스템입니다.
레이어 1: 하이트맵 지형이 전체 월드를 덮습니다. 구릉, 계곡, 산을 위한 저렴하고 작은 표현 방식입니다. 청크마다 작은 하이트맵 패치로 스트리밍되며 각각 2~4KB입니다. 렌더링에는 GPU 비용이 일정한 지오메트리 클립맵을 사용합니다.
레이어 2: 볼류메트릭 오버레이는 복잡한 지오메트리가 필요한 청크에만 존재합니다. 동굴, 절벽면, 아치, 크리에이터가 깎아 만든 터널, 지하 공간은 희소 SDF 볼륨으로 저장됩니다. 볼류메트릭 데이터가 있는 청크에만 SDF 저장 공간과 마칭 큐브 비용이 발생합니다.
레이어 3: 크리에이터 수정 사항은 기본 레이어 위에 SDF 편집 데이터로 저장됩니다. 크리에이터가 터널을 파면 터널의 SDF 형태가 저장됩니다. 렌더링 시스템은 하이트맵 표면과 볼류메트릭 제거 및 추가 연산을 결합하여 최종 메시를 생성합니다.
이 하이브리드 방식은 평평한 지형에서는 하이트맵 비용만 들어 거의 아무런 추가 비용이 없으며, 복잡성이 존재하는 곳에서만 비용이 증가합니다. 일반적인 월드에서는 청크의 약 5~10%만 볼류메트릭 데이터를 필요로 할 수 있습니다.
물리적으로 정확한 지형 생성
노이즈는 무작위 지형을 만들고 물리학은 사실적인 지형을 만듭니다. 그 차이는 눈으로도 분명히 드러납니다. 노이즈 지형은 전체가 무작위로 울퉁불퉁해 구조가 없는 반면, 물리적 지형에는 침식과 지각 운동에서 비롯된 하천망, 능선, 선상지, 절벽 띠가 있습니다.
수력 침식: 핵심 기반
물은 아래로 흐르면서 퇴적물을 실어 나르고 속도가 느려지면 이를 쌓습니다. 수백만 년에 해당하는 가상 시간 동안 이 단일 과정을 시뮬레이션하면 특징 없는 노이즈가 식별 가능한 지질학적 특징을 갖춘 지형으로 바뀝니다. 입자 기반 접근법은 높이맵 위에 시뮬레이션된 빗방울을 떨어뜨립니다. 각 물방울은 경사를 따라 내리막으로 흐르고, 속도와 경사도에 따라 물질을 침식하며, 퇴적물을 용해된 하중으로 운반하다가 속도가 감소하거나 운반 용량을 초과하면 퇴적시킵니다. 200,000~500,000개의 입자를 처리하면 지형에 다음과 같은 특징이 형성됩니다.
- 최대 물 흐름 경로를 따르는 하곡
- 배수 유역을 구분하는 능선
- 가파른 계곡이 평탄한 평야로 이어지는 곳에 형성되는 선상지
- 산악 지형의 V자형 계곡과 빙하 지형의 U자형 계곡
GPU 구현: 입자 시뮬레이션은 병렬화할 수 있습니다. 각 입자는 독립적입니다. 이 근사법은 입자 간 상호작용을 무시하지만 침식 시뮬레이션에는 문제가 없습니다. WebGPU 컴퓨트 셰이더는 60fps에서 프레임당 10,000개의 입자를 처리하여 실제 시간으로 약 3초 만에 200,000개의 입자 처리를 완료합니다.
Sebastian Lague의 오픈 소스 구현(GitHub)은 일반적인 출발점입니다. C# 단일 스레드에서 실행되며 몇 초 만에 1024x1024 높이맵을 처리합니다. GPU 버전은 이보다 50~100배 빠릅니다.
열 침식
물만이 침식을 일으키는 것은 아닙니다. 온도 변화는 암석에 균열을 만들고 부스러지게 합니다(열 풍화). 두 지형 지점 사이의 경사도가 물질의 안식각을 초과하면 높은 지점의 물질이 낮은 지점으로 떨어집니다. 이 과정은 다음과 같은 특징을 형성합니다.
- 절벽 아래의 애추 사면(떨어진 암석 더미)
- 시간이 지나며 완만해지는 능선
- 물질별 지형 윤곽(단단한 암석은 가파른 경사를 유지하지만 부드러운 토양은 무너져 완만한 경사를 이룸)
열 침식은 수력 침식보다 단순합니다. 각 셀에서 인접 셀과의 높이 차이를 비교하는 국소 연산입니다. 경사도가 임계값을 초과하면 물질을 내리막으로 이동시킵니다. 반복당 하나의 컴퓨트 셰이더 패스로 실행되며 50~100회 반복하면 수렴합니다.
수력 침식과 열 침식을 결합하면 어느 한쪽만 사용할 때보다 훨씬 자연스러운 지형을 만들 수 있습니다. 물은 계곡을 깎고, 열 침식은 계곡 사이의 능선을 완만하게 만들며 계곡 바닥을 암설로 채웁니다.
하천력 법칙: 해석적 침식
최근 연구에서는 입자 기반 시뮬레이션을 대체할 수 있는 접근법을 제시합니다. 배수 면적과 경사도에 침식률을 연관 짓는 지형학 방정식인 하천력 법칙은 반복 시뮬레이션 대신 해석적으로 풀 수 있습니다.
Cordonnier 외 연구진(2024, HAL)은 해석적 하천력 법칙을 산사태 및 산비탈 확산 과정과 결합합니다. 그 결과 물리적 근거를 갖추면서도 시간 기반 시뮬레이션이 아닌 수학 함수로 실행되는 지형 생성 기법이 만들어집니다. 노이즈 기반 높이맵과 매개변수(강우량, 암석 경도, 지각 융기 속도)를 입력하면 밀리초 만에 침식된 지형을 얻을 수 있습니다.
이 해석적 접근법은 반복 실행할 필요 없이 지형 생성 중 서버 측에서 한 번만 실행되므로 브라우저 월드에 적합합니다. 크리에이터는 매개변수를 조정할 수 있습니다. 예를 들어 "이 지역을 더 산악 지형답게 만들기"는 융기 속도를 조정하고, "더 습하게 만들기"는 강우량을 늘려 계곡을 더 깊게 만듭니다.
Arenite: 다중 물리 침식(SIGGRAPH 2025)
Arenite(프로젝트 페이지)는 단순한 초기 조건에서 아치, 암굴, 후두, 뷰트를 생성하는 물리 기반 사암 시뮬레이터입니다. 사용자는 침식 가능성 맵(연암층과 경암층)과 식생을 칠한 다음, 시스템에서 다음 과정을 시뮬레이션합니다.
- 암주 전체의 응력 분포
- 노출된 연질 물질을 우선적으로 제거하는 풍식
- 물의 흐름으로 발생하는 하천 침식
- 새로운 지형을 형성하는 입자 퇴적
GPU 구현은 데스크톱 GPU에서 복잡한 지형을 5분 이내에 생성합니다. 실시간 브라우저 용도로는 너무 느리지만 서버 측 생성에는 충분히 빠릅니다. 크리에이터는 연암층과 경암층이 있는 절벽면을 정의하고 몇 분 안에 사실적인 아치 지형을 얻을 수 있습니다.
출력은 3D 복셀 필드이므로 SDF/마칭 큐브 파이프라인에 직접 적용할 수 있습니다.
다양한 표현 방식에 적용 가능한 유연한 침식
IRIT-STORM의 2024년 논문("유연한 지형 침식", Springer)은 대부분의 침식 기법이 높이 필드에서만 작동한다는 실용적인 문제를 해결합니다. 지형에 복셀, SDF 또는 계층형 재질을 사용한다면 각 표현 방식에 별도의 침식 코드가 필요합니다.
유연한 침식 기법은 침식을 서로 독립적인 두 과정, 즉 지형 변경(표면에서 물질 제거)과 물질 운반(기본 물리 법칙을 따르는 입자로 퇴적물 이동)으로 분해합니다. 각 입자에는 크기, 밀도, 반발 계수, 퇴적물 운반 용량을 설정할 수 있습니다. 선택적인 벡터 필드로 입자 움직임을 제어하여 사실적인 유체 역학을 구현할 수도 있습니다.
입자가 통합된 물질 변경 인터페이스를 통해 지형과 상호작용하므로 동일한 시뮬레이션을 높이 필드, 복셀 그리드, 암시적 표면, 계층형 재질 스택에 적용할 수 있습니다. 높이맵 기반과 SDF 오버레이를 결합한 하이브리드 지형에서는 하나의 침식 시스템으로 두 표현 방식을 모두 처리할 수 있습니다. 입자 시뮬레이션은 GPU에서 병렬로 실행됩니다.
하천망과 배수 유역
침식은 하천을 깎아 내지만, 설득력 있는 하천망을 생성하려면 단순히 물을 내리막으로 흘려보내는 것만으로는 부족합니다. 다음 두 가지 접근법으로 더 나은 결과를 얻을 수 있습니다.
배수 우선 생성(Amit Patel, Red Blob Games, 프로젝트)은 고도를 지정하기 전에 하천망을 구축합니다. 그래프(보로노이 또는 삼각형 메시)로 시작하여 간선을 능선(흐름 없음), 유입구(물이 들어옴), 유출구(물이 나감)로 분류합니다. 이를 통해 작은 지류가 주요 수로로 합류하는 사실적인 배수 계층을 만들 수 있으며, 평탄한 지형의 망상 수로와 산악 지형의 좁은 협곡 등 여러 하천 유형에 대한 Rosgen 분류 체계를 따릅니다.
유량 누적은 각 지형 셀을 통과하는 물의 양을 추적합니다. 시뮬레이션된 비를 균일하게 뿌리고 내리막으로 흐르게 한 다음, 각 셀을 통과한 횟수를 셉니다. 누적량이 높은 셀은 하천 수로가 되고, 중간 수준인 셀은 계절성 하천이 됩니다. 누적 맵은 침식 강도(물이 많을수록 침식도 증가)와 식생 분포(강둑은 더 습하여 다른 식물 종이 자람)도 제어합니다.
크리에이터 월드에서는 지형 생성 중 서버 측에서 하천망을 생성하고, 청크마다 2D 흐름 방향 맵과 물 누적 맵으로 저장합니다. 브라우저 클라이언트는 이러한 맵을 사용하여 수면을 렌더링하고(하천 수로의 올바른 높이에 평면 배치), 식생 분포를 제어합니다(물 근처에 더 울창하게 배치).
해안과 해안선 생성
해안선은 지형과 물이 만나는 곳이며, 일반적인 침식으로는 만들어지지 않는 해식 절벽, 해빈 퇴적층, 갯벌, 시 스택, 파식대 같은 독특한 특징이 있습니다.
NEWTS1.0(2024, MIT)은 균일 후퇴(일정한 침식률)와 파랑 침식(취송 거리와 입사파 각도에 따른 침식률)이라는 두 침식 메커니즘을 사용해 암석 해안선의 변화를 모델링합니다. 이 모델은 수천 년의 시간을 시뮬레이션하여 실제 해안 지형과 유사한 곶, 만, 시 스택, 아치를 생성합니다.
브라우저 월드의 해안 지형은 월드 생성 중 미리 생성할 수 있습니다. 크리에이터는 매개변수(주된 파도 방향, 해안을 따라 달라지는 암석 경도)를 통해 해안선의 특성을 제어할 수 있습니다. "노르웨이 피오르" 설정은 양쪽 경사가 가파른 만을 생성합니다. "열대 환초" 설정은 석호를 둘러싼 낮은 모래 해안을 생성합니다.
동굴과 지하 생성
높이맵은 밀폐된 공간을 표현할 수 없으므로 동굴에는 완전한 볼륨형 지형(SDF 또는 복셀)이 필요합니다. 생성 접근법은 다음과 같습니다.
3D 노이즈 임계값 처리는 가장 간단한 방법입니다. 각 복셀에서 3D Perlin 또는 simplex 노이즈를 샘플링합니다. 임계값보다 낮은 값은 고체, 높은 값은 빈 공간으로 설정합니다. 임계값과 노이즈 매개변수를 조정하여 터널 직경, 연결성, 공동 크기를 제어합니다. 이 방식은 Minecraft를 연상시키는 유기적이고 벌레 굴 같은 동굴 시스템을 생성합니다.
PLUME(절차적 계층 지하 모델링 엔진)(2024, arXiv:2508.20926)는 계층형 절차 규칙을 사용하여 사실적인 동굴과 용암 동굴 환경을 생성합니다. 원래 우주 탐사 연구(화성 용암 동굴 시뮬레이션)를 위해 개발되었으며, 종유석, 석주, 공동 시스템이 포함된 지질학적으로 타당한 지하 구조를 생성합니다.
메타볼 조각을 사용하는 L-시스템 터널은 L-시스템 문법으로 지형 내부에 분기하는 터널 경로를 성장시킨 다음, 메타볼 암시적 표면을 사용해 실제 터널 형상을 깎아냅니다. 메타볼은 매끄럽고 둥근 동굴 벽을 만듭니다. 서로 다른 매개변수로 여러 패스를 실행하면 주요 통로, 측면 공동, 좁은 연결 터널을 만들 수 있습니다.
크리에이터 월드에서 동굴 생성은 SDF 오버레이 시스템과 연계됩니다. 기본 지형은 동굴이 없는 높이맵입니다. 청크에 동굴이 필요하면(절차적 생성 또는 크리에이터의 설계에 따라) 기본 지형에서 동굴 형상을 빼는 SDF 볼륨을 생성합니다. 마칭 큐브 파이프라인은 결합된 표면을 렌더링합니다.
물리적 과정으로서의 식생
게임의 식생은 일반적으로 "2,000m 아래에는 풀, 1,500m 아래에는 나무, 3,000m 위에는 눈" 같은 규칙으로 절차적으로 배치됩니다. 이 방식은 빠르지만 균일하고 비현실적인 분포를 만듭니다.
물리적 기반 식생 시뮬레이션은 각 식물이 자원(빛, 물, 토양 영양분)을 놓고 경쟁하는 과정을 모델링합니다. 시뮬레이션 과정은 다음과 같습니다.
- 지형 전체에 씨앗을 뿌립니다.
- 각 식물은 이용할 수 있는 자원에 따라 성장합니다. 물은 수력 침식 시뮬레이션의 흐름을 따르고, 일조량은 경사도와 사면 방향에 따라 달라지며, 토양 깊이는 침식 이력에 따라 달라집니다.
- 식물은 서로 경쟁합니다. 나무는 그늘을 만들어 풀의 성장을 막고, 울창한 수관은 새로운 묘목의 성장을 방해합니다.
- 시뮬레이션 시간이 흐르면 생물군계가 자연스럽게 나타납니다. 물이 흐르는 계곡에는 숲이 형성되고, 바람이 거센 능선에는 식생이 드물며, 물이 고이는 곳에는 습지가 형성됩니다.
Deussen 외 연구진의 생태계 시뮬레이션(논문)은 현실 세계의 생태학적 패턴과 일치하는 숲 분포를 생성합니다. 시뮬레이션은 2D 그리드(지형 청크당 하나의 셀)에서 실행되며, 렌더링 시스템이 GPU 인스턴싱 식생 배치에 사용할 밀도 맵과 종 할당 정보를 생성합니다.
브라우저 월드에서는 월드 생성 중 서버 측에서 식생 시뮬레이션을 한 번 실행합니다. 출력은 청크별 밀도 맵 세트, 즉 나무 밀도, 풀 밀도, 꽃 밀도, 암석 잔해 밀도입니다. 브라우저 클라이언트는 이러한 맵과 GPU 인스턴싱을 사용하여 런타임에 식생을 배치합니다.
확산 기반 지형 합성
현재 가장 빠르게 발전하는 분야입니다. 이미지용 Stable Diffusion의 기반 기술과 동일한 확산 모델이 지형 생성에 적용되고 있으며, 그 결과는 노이즈 기반 기법보다 훨씬 사실적입니다.
Terrain Diffusion: Perlin 노이즈의 후속 기술
Terrain Diffusion(Goslin, 2025, arXiv:2512.08309, 프로젝트 페이지)은 1985년 Perlin 노이즈 이후 절차적 지형 생성 분야에서 가장 중요한 발전입니다. 이 연구는 이후 SIGGRAPH 2026에 채택되었으며, arXiv의 공식 제목은 현재 "InfiniteDiffusion: 학습된 충실도와 오픈 월드 지형 생성을 위한 절차적 활용성의 연결"입니다. InfiniteDiffusion 알고리즘과 Terrain Diffusion 프레임워크는 같은 논문을 구성하는 두 축입니다.
핵심 혁신은 무한 영역에 맞게 확산 샘플링을 재구성한 알고리즘인 InfiniteDiffusion입니다. 기존 확산 모델은 고정 크기의 출력(예: 512x512 높이맵)을 생성합니다. InfiniteDiffusion은 다음 특성을 갖춘 무한한 범위의 지형을 생성합니다.
- 시드 일관성: Perlin 노이즈처럼 동일한 시드는 항상 동일한 지형을 생성합니다.
- 상수 시간 임의 접근: 인접 지역을 먼저 생성하지 않고도 어느 지점에서든 높이를 조회할 수 있습니다.
- 경계 아티팩트 없음: 눈에 띄는 이음새나 반복 없이 무한히 생성합니다.
이 시스템은 계층형 확산 모델 스택을 사용합니다. 최상위 레벨은 대륙과 산맥 같은 행성 규모의 특징을 포착합니다. 이후 각 레벨에서는 개별 산봉우리, 계곡, 소규모 표면 거칠기처럼 더 세밀한 디테일을 추가합니다. 압축된 라플라시안 인코딩은 해수면부터 히말라야 산봉우리까지 이르는 방대한 동적 범위 전반에서 출력을 안정화합니다.
성능: 생성 속도는 실시간 탐색 속도를 따라갑니다. 논문에 따르면 이론적 극한인 궤도 속도(약 7,700m/s)에서도 일반 소비자용 GPU의 지형 합성 속도가 이동 속도보다 9배 빠릅니다. 프로젝트에는 실시간 지형 합성을 보여주는 Minecraft 통합 예제가 포함되어 있습니다. 이것이 중요한 이유: Terrain Diffusion은 실제 고도 데이터(지구의 실제 지형)를 학습해 경관을 생성합니다. 결과물의 하천망, 산맥, 해안 지형, 고원 구조는 수작업으로 조정한 노이즈 매개변수가 아니라 학습 데이터에서 자연스럽게 나타납니다. 크리에이터가 "스코틀랜드 고지대 같은 지형을 생성해 줘"라고 하면 확산 모델이 그에 맞는 지질학적 특성을 갖춘 결과를 만들어낼 수 있습니다.
모델은 월드 생성 중 서버 측에서 실행됩니다. 출력은 표준 높이맵이며, 다른 지형 데이터와 마찬가지로 브라우저에 스트리밍됩니다. 클라이언트에서는 어떤 생성 방식을 사용했는지 알 수 없습니다.
TerraFusion: 지오메트리와 텍스처의 공동 생성
TerraFusion(2025, arXiv:2505.04050은 높이맵과 지형 텍스처를 함께 생성함으로써 한 단계 더 나아갑니다. 핵심 통찰은 지형 지오메트리와 표면 외관 사이에 상관관계가 있다는 것입니다(하상은 모래로 되어 있고, 절벽 면은 바위로 되어 있으며, 평지는 풀로 덮여 있습니다). 둘을 따로 생성하면 서로 어긋나는 결과가 나옵니다.
TerraFusion은 높이맵과 텍스처에 각각 별도의 VAE를 사용하는 잠재 확산 모델로, 둘의 결합 분포를 모델링하도록 학습됩니다. 이 시스템은 다음을 지원합니다.
- 무조건 생성: 서로 어울리는 텍스처가 적용된 무작위의 그럴듯한 지형
- 스케치 조건부 생성: 크리에이터가 대략적인 지도(여기에는 계곡, 저기에는 능선, 이 가장자리를 따라서는 절벽)를 그리면 모델이 스케치와 일치하는 세밀한 지오메트리와 텍스처를 생성
크리에이터 월드에서 이는 강력한 기능입니다. 크리에이터가 자신의 구역에 대한 전체적인 배치를 스케치하면 시스템이 적절한 표면 재질과 함께 지질학적으로 그럴듯한 지형을 채워 넣습니다. 높이맵 페인팅, 텍스처 스플래팅, 수동 재질 할당이 필요하지 않습니다.
MESA: 텍스트로 지형 생성
MESA(2025, arXiv:2504.07210, CVPR 2025 워크숍)는 텍스트 설명에서 지형을 생성합니다. Copernicus 프로그램의 전 세계 원격 감지 데이터로 학습했기 때문에 지구상에 존재하는 모든 유형의 경관을 접했습니다.
"가파른 화강암 절벽으로 둘러싸여 바위투성이 해안선으로 이어지는 피오르" 같은 프롬프트를 입력하면 적절한 지질 구조를 갖춘 높이맵이 생성됩니다. "완만한 구릉과 넓은 강 계곡이 있는 기복진 농경지"를 입력하면 완전히 다른 결과가 나옵니다.
MESA는 전 세계 위성 이미지와 디지털 고도 모델을 짝지은 Major TOM Core-DEM 확장 데이터셋을 도입합니다. 이 학습 데이터 덕분에 모델은 모든 축척과 기후대에서 실제 지형이 어떤 모습인지 이해할 수 있습니다.
Geodiffussr: 텍스트 기반 지형 텍스처링
Geodiffussr(2025, arXiv:2511.23029)는 기존 높이맵을 입력받아 고도 데이터를 준수하면서 텍스트 설명에 따라 텍스처를 생성합니다. "가을 숲"은 완만한 경사면에 주황색과 황금색 수목을 배치하고 가파른 면에는 노출된 암석을 표현합니다. "열대 해안"은 낮은 지대에 야자 식생을 배치하고 해수면에는 산호 모래를 표현합니다.
이 시스템은 다중 스케일 콘텐츠 집계를 사용하여 텍스처 할당이 고도를 준수하도록 합니다. 눈은 물리적으로 그럴듯한 고도 이상에서만 나타나고, 물 지형은 움푹한 곳에 자리 잡으며, 식생은 고도가 높아질수록 듬성듬성해집니다.
크리에이터 월드에서는 지오메트리를 변경하지 않고도 텍스트 프롬프트로 지형 텍스처를 다시 생성할 수 있다는 뜻입니다. 크리에이터가 원하는 지형을 조형한 다음 분위기("어두운 화산 황무지" 또는 "울창한 온대림")를 설명하면 시스템이 적절한 표면 재질을 생성합니다.
브라우저 지형을 위한 동적 LOD
브라우저에서 대규모 지형 전체를 항상 최고 해상도로 렌더링하는 것은 불가능합니다. 1미터 해상도의 4km x 4km 월드는 지형에만 1,600만 개의 버텍스가 필요합니다. 동적 LOD는 월드 크기와 관계없이 이를 일정하고 관리 가능한 버텍스 수로 줄여 줍니다.
지오메트리 클립맵
지오메트리 클립맵(Losasso와 Hoppe, SIGGRAPH 2004, 논문)은 여전히 높이맵 지형 LOD의 표준으로 여겨집니다. 핵심 아이디어는 카메라를 중심으로 한 여러 개의 동심 정사각형 링으로 지형을 렌더링하는 것입니다. 각 링의 면적은 이전 링의 두 배이지만 해상도는 절반입니다.
카메라에 가까운 곳(가장 안쪽 링): 최고 해상도, 1미터 격자 간격. 바깥쪽 한 번째 링: 2미터 간격, 4배의 면적을 포함. 다음 링: 4미터 간격, 16배의 면적을 포함. 이런 방식으로 가장 바깥쪽 링이 전체 가시거리를 포함할 때까지 6~8개 레벨을 사용합니다.
전체 버텍스 수는 일정합니다. 대략 N^2 * 레벨 수이며, 여기서 N은 버텍스 단위의 링 너비입니다. N=256이고 8개 레벨을 사용하면 전체 버텍스 수는 약 50만 개입니다. 월드 너비가 1km이든 100km이든 동일한 비용으로 렌더링됩니다.
브라우저 구현: 지오메트리 클립맵에는 표준 버텍스 버퍼 업데이트만 필요하므로 컴퓨트 셰이더 없이도 WebGL 2에서 작동합니다. 카메라가 이동하면 CPU는 적절한 해상도로 지형을 샘플링하여 각 링의 높이맵 데이터를 업데이트합니다. 버텍스 셰이더는 텍스처에서 높이 값을 읽어 평평한 격자를 변위시킵니다.
모핑: LOD 레벨 사이의 전환을 단순하게 처리하면 눈에 띄는 "팝핑"이 발생합니다. 아래의 별도 섹션에서 자세히 설명하는 지오모핑은 버텍스 셰이더의 전환 영역에서 레벨 간 버텍스 위치를 블렌딩해, 추가 드로 콜 비용 없이 부드럽고 팝핑 없는 전환을 만들어냅니다.
CDLOD: 쿼드트리 적응형 클립맵
CDLOD(Strugar, 2014, 논문)는 고정된 동심 링 대신 쿼드트리를 사용해 지오메트리 클립맵을 개선합니다. 쿼드트리는 지형에 맞춰 적응합니다. 평평한 영역에는 성긴 노드를 사용하고, 디테일이 많은 영역(절벽, 능선)은 더 세밀하게 분할합니다.
크리에이터 월드에서는 청크마다 복잡도가 다르기 때문에 이것이 중요합니다. 평평한 초원에는 최소한의 해상도만 필요합니다. 절벽과 동굴이 있는 산악 지대에는 최대 디테일이 필요합니다. CDLOD는 중요한 곳에 해상도를 할당합니다.
CPU 측 쿼드트리 순회는 수백 개 정도의 노드만 처리하므로 가볍고, 어떤 지형 패치를 어떤 해상도로 그릴지 결정합니다. GPU는 각 패치를 패치별 LOD 유니폼이 적용된 인스턴스 격자로 렌더링합니다.
동시성 이진 트리: 행성 규모 테셀레이션
동시성 이진 트리(CBT)는 Benyoub와 Dupuy(Intel, HPG 2024, 논문, GitHub)가 발표한 적응형 지형 테셀레이션용 GPU 친화적 데이터 구조입니다.
핵심 아이디어는 각 노드가 삼각형인 이진 트리로 지형을 표현하는 것입니다. 적응형 세분화는 카메라와 가까운 삼각형을 분할하고 멀리 있는 삼각형을 병합합니다. 이진 트리는 1차원 배열(이진 힙) 형태로 GPU 메모리에 완전히 상주하며, 분할 및 병합 작업은 컴퓨트 셰이더로 실행됩니다.
2024년 논문은 CBT를 정사각형 높이맵 영역에서 임의의 폴리곤 메시로 확장합니다. 즉, 구체(행성 렌더링용)나 임의의 기본 메시(직사각형이 아닌 경계를 가진 게임 월드용)를 테셀레이션할 수 있습니다. 핵심 개선점은 CBT를 암시적 인코딩 대신 메모리 풀 관리자로 사용함으로써 훨씬 높은 세분화 레벨을 지원한다는 것입니다.
성능은 콘솔급 하드웨어에서 행성 규모 지형을 0.2ms 미만으로 테셀레이션하는 수준입니다. 알고리즘 성능은 프로세서 수에 따라 선형적으로 확장됩니다. 구현 복잡도는 높지만, WebGPU에서는 이를 통해 브라우저에서 행성 규모의 지형을 렌더링할 수 있습니다.
WebGPU를 활용한 GPU 주도형 LOD
WebGPU를 사용하면 LOD 결정에 CPU가 관여하지 않는 완전한 GPU 주도형 지형 파이프라인을 구현할 수 있습니다.
컴퓨트 패스 1: 절두체 및 오클루전 컬링. 컴퓨트 셰이더가 각 지형 패치의 경계 상자를 뷰 절두체 및 오클루전 버퍼(이전 프레임의 깊이 버퍼를 다운샘플링한 것)와 대조해 검사합니다. 보이지 않는 패치는 완전히 제외됩니다.
컴퓨트 패스 2: LOD 선택. 보이는 패치의 화면 공간 크기를 계산하고 적절한 LOD 레벨을 선택합니다. LOD 레벨과 패치 ID를 간접 드로 버퍼에 기록합니다.
컴퓨트 패스 3: 메시 생성(볼류메트릭 지형용). SDF 데이터가 있는 청크에는 마칭 큐브를 실행하여 선택된 LOD 해상도로 메시를 생성합니다.
간접 드로. 단일
drawIndexedIndirect()호출로 모든 지형 패치를 렌더링합니다. 무엇을 어떤 해상도와 순서로 그릴지 GPU가 모두 결정합니다.
이 파이프라인은 월드의 크기나 복잡도와 관계없이 CPU 비용이 일정합니다(컴퓨트 셰이더 디스패치와 간접 드로 호출). 패치별 결정은 모두 GPU가 처리합니다.
@compute @workgroup_size(64)
fn lodSelection(@builtin(global_invocation_id) id: vec3<u32>) {
let patchIdx = id.x;
let bounds = patchBounds[patchIdx];
if (!frustumTest(bounds, viewProjection)) { return; }
if (occlusionTest(bounds, depthPyramid) == OCCLUDED) { return; }
let screenSize = projectedSize(bounds, viewProjection, screenDimensions);
let lod = clamp(u32(log2(maxScreenSize / screenSize)), 0u, MAX_LOD);
let drawIdx = atomicAdd(&drawCount, 1u);
drawArgs[drawIdx] = DrawArgs(patchIdx, lod, indexCount[lod], indexOffset[lod]);
}지오모핑: 팝핑 없는 LOD 전환
지형 LOD에서 가장 눈에 띄는 시각적 아티팩트는 팝핑입니다. 패치의 LOD 레벨이 바뀔 때 버텍스가 갑자기 새로운 위치로 이동하는 현상입니다. 지오모핑은 전환 영역에 걸쳐 LOD 레벨 사이의 버텍스 위치를 부드럽게 보간하여 이를 제거합니다.
구현은 전적으로 버텍스 셰이더 안에서 이루어집니다. 각 버텍스는 현재 LOD 위치와 그다음으로 낮은 LOD 위치를 모두 저장합니다. 카메라 거리가 전환 임계점을 지나면 모프 계수가 두 위치를 블렌딩합니다.
float morphFactor = smoothstep(lodNear, lodFar, distanceToCamera);
float morphedHeight = mix(fineLodHeight, coarseLodHeight, morphFactor);
gl_Position = viewProjection * vec4(worldPos.x, morphedHeight, worldPos.z, 1.0);Hoppe의 지오메트리 클립맵 논문(GPU Gems 2, 2장)에서는 클립맵 링을 위한 전체 구현을 설명합니다. 모프 영역은 각 링 바깥쪽 20%입니다. 이 영역 안에서 버텍스는 다음 링의 해상도로 부드럽게 수렴합니다. 시각적으로 지형 지오메트리가 갑자기 바뀌는 대신 디테일 레벨 사이에서 "녹아들듯" 전환됩니다. 일반적인 카메라 이동 속도에서는 전환이 보이지 않습니다.
이미지 공간 블렌딩(Scherzer 외, 논문)은 화면 공간에서 두 LOD 레벨의 렌더링 이미지를 블렌딩하는 대안입니다. 메시에서 빌보드로 전환하는 경우처럼 LOD 차이가 더 극단적일 때도 처리할 수 있지만, 전환 영역에 추가 렌더 패스가 필요합니다.
GPU 주도형 식생 컬링
식생(나무, 풀, 바위)은 오픈 월드에서 드로 콜을 가장 많이 발생시키는 요소인 경우가 많습니다. 단순한 방식은 매 프레임 모든 식생 인스턴스를 그립니다. 이제 Three.js에서 WebGPU를 통해 사용할 수 있는 GPU 주도형 컬링은 보이지 않는 인스턴스가 래스터라이저에 도달하기 전에 제거합니다.
Three.js의 ComputeInstanceCulling(문서)은 인스턴스 메시를 위한 절두체 및 LOD 컬링을 제공하며, 인스턴스 수가 많을 때 10~100배의 성능 향상을 제공합니다. 파이프라인은 다음과 같습니다.
- 컴퓨트 셰이더가 모든 인스턴스의 경계 구를 읽습니다
- 각 경계 구를 카메라 절두체와 대조해 검사합니다(6개 평면 검사)
- 거리 기반 LOD를 적용합니다. 임계 거리 너머의 인스턴스는 더 낮은 디테일로 전환하거나 완전히 컬링합니다
- 남은 인스턴스를 버퍼에 압축하고
drawIndirect로 그립니다 CPU는 인스턴스별 작업을 전혀 수행하지 않습니다. 초기 설정 후에는 인스턴스 수와 관계없이 식생 유형마다 컴퓨트 디스패치 한 번과 간접 드로우 콜 한 번만 필요합니다.
더 빽빽한 식생의 경우 Three.js의 IndirectBatchedMesh(문서)는 여러 지오메트리 유형(나무, 덤불, 바위)을 단일 버퍼에 패킹하고 멀티 드로우 인다이렉트로 렌더링합니다. 청크의 모든 식생을 드로우 콜 한 번으로 렌더링할 수 있습니다.
이를 식생 시스템의 밀도 맵 기반 산포와 결합하면 다음과 같습니다. 밀도 맵이 컴퓨트 셰이더에서 풀잎 위치 50,000개를 생성하고, 컬링 패스가 화면 밖에 있거나 너무 멀리 있는 70%를 제거한 다음, 간접 드로우 콜 한 번으로 남은 풀잎 15,000개를 렌더링합니다. 총 CPU 비용은 무시할 수 있는 수준입니다.
볼류메트릭 지형의 LOD
볼류메트릭 지형(SDF + 마칭 큐브)은 미리 제작된 메시가 아니라 생성되는 메시이므로 자체 LOD 시스템이 필요합니다. 접근 방식은 다음과 같습니다.
다중 해상도 SDF 저장. SDF를 밉맵과 유사한 계층 구조의 여러 해상도로 저장합니다. 레벨 0은 전체 해상도(1미터 복셀)입니다. 레벨 1은 2미터 복셀로, 데이터가 8배 적습니다. 레벨 2는 4미터 복셀입니다. 각 레벨에서 최소 절대 거리를 취해 SDF를 다운샘플링합니다.
LOD 선택형 마칭 큐브. 원하는 LOD에 맞는 SDF 레벨에서 마칭 큐브를 실행합니다. 가까운 청크는 레벨 0을 사용합니다. 먼 청크는 레벨 2 또는 3을 사용합니다. Transvoxel 알고리즘이 서로 다른 레벨 사이의 경계를 처리합니다.
캐싱. 생성된 메시는 SDF가 변경되거나(크리에이터 편집) LOD 레벨이 변경될 때(카메라가 크게 이동)까지 캐시됩니다. 정적 지형의 경우 메시를 한 번 생성한 후 재사용합니다.
지형 스트리밍 아키텍처
청크 데이터 형식
각 지형 청크(64x64미터)는 압축된 바이너리 패키지로 스트리밍됩니다.
ChunkPacket {
header: {
chunkX: i16, chunkZ: i16,
version: u32,
flags: u8 // hasHeightmap | hasVolumetric | hasVegetation
}
heightmap: {
resolution: u8, // 65x65 for full, 33x33 for half, 17x17 for quarter
quantizedHeights: u16[resolution * resolution], // delta-encoded, zlib compressed
splatMap: u8[4 * resolution * resolution] // RGBA blend weights, LZ4 compressed
}
volumetric?: { // only present if flags.hasVolumetric
sdfResolution: u8, // typically 32 or 64
sparseOctree: bytes // run-length encoded sparse SDF
}
vegetation?: { // only present if flags.hasVegetation
treeDensityMap: u8[16 * 16], // 4m resolution density grid
grassDensityMap: u8[32 * 32], // 2m resolution density grid
rockDensityMap: u8[16 * 16]
}
creatorObjects: {
count: u16,
objects: PlacedObject[] // assetId + transform + properties, ~40 bytes each
}
}일반적인 크기:
- 높이 맵 전용 청크(평평한 지형): 압축 시 2~4KB
- 높이 맵 + 식생: 4~8KB
- 높이 맵 + 볼류메트릭 + 식생(복잡한 청크): 20~100KB
- 5x5 전체 디테일 인접 영역: 총 50~500KB
점진적 청크 로딩
청크는 거리, 이동 방향, 데이터 유형에 따라 우선순위대로 로드됩니다.
우선순위 1(즉시, <100ms): 플레이어가 곧 진입할 청크의 높이 맵 지오메트리입니다. 지형 표면이 가장 먼저 나타납니다. 가장 낮은 해상도(청크당 17x17)에서도 지면은 표시됩니다.
우선순위 2(빠름, <300ms): 스플랫 맵과 지형 텍스처입니다. 지면에 색상이 입혀집니다.
우선순위 3(스트리밍, <1s): 전체 해상도 높이 맵 업그레이드와 식생 밀도 맵입니다. GPU 인스턴싱으로 나무와 풀이 생성됩니다.
우선순위 4(백그라운드, <3s): 동굴이나 돌출부가 있는 청크의 볼류메트릭 SDF 데이터입니다. Web Worker에서 마칭 큐브로 메시를 생성한 후 버퍼를 메인 스레드로 전송합니다.
우선순위 5(지연 로딩, <10s): 크리에이터가 배치한 오브젝트, 구조물용 고해상도 텍스처, 꽃·작은 바위·잔해 같은 디테일 오브젝트입니다.
예측형 프리페칭
플레이어가 청크에 진입할 때까지 기다렸다가 로드하지 마세요. 속도를 바탕으로 이동 방향을 예측해 미리 로드합니다.
- 걷는 속도(5km/h): 앞쪽 청크 2개(128m)를 프리페치합니다. 일반적인 광대역 지연 시간 기준으로 200~400ms의 여유 시간이 생깁니다.
- 달리기/탑승 이동(15km/h): 앞쪽 청크 4개를 프리페치합니다. 로드 링은 속도 방향에 맞춰 이동합니다.
- 비행/빠른 이동: 전환 중에는 렌더링을 일시 중지합니다. 목적지 청크를 최우선으로 스트리밍합니다. 첫 프레임을 표시할 데이터가 충분해지면 렌더링을 재개합니다.
프리페치 시스템은 캐시에 있는 청크, 전송 중인 청크(요청했지만 아직 도착하지 않은 청크), 필요한 청크를 추적합니다. 우선순위 큐는 대기 중인 요청을 긴급도에 따라 정렬합니다. 플레이어가 멀어진 청크의 요청은 취소합니다.
메모리 예산과 축출
데스크톱의 브라우저 탭에는 2~4GB가 할당됩니다. 지형 시스템은 그중 일부만 사용해야 합니다. 나머지는 렌더링, 물리, 네트워킹, JavaScript 힙에 필요합니다.
목표 예산: 모든 지형 데이터에 256MB.
일반적인 청크 크기를 기준으로 하면 다음과 같습니다.
- 전체 디테일 캐시 청크: 약 100개(10x10 인접 영역), 각각 5~100KB = 원시 데이터 5~10MB
- GPU 지형 지오메트리: 약 50MB(표시되는 지형의 버텍스 버퍼와 인덱스 버퍼)
- 지형 텍스처: 약 100MB(KTX2 압축, 아틀라스 패킹)
- 식생 인스턴스 버퍼: 약 50MB(GPU 인스턴싱용 위치, 회전, 크기)
- SDF 볼륨과 캐시된 마칭 큐브 메시: 약 50MB
가시 범위를 벗어난 청크는 먼저 GPU 메모리에서 축출되고(텍스처, 버텍스 버퍼), 그다음 CPU 캐시에서 축출됩니다. 원시 높이 맵 데이터는 유지 비용이 가장 낮고 플레이어가 뒤를 돌아볼 때 가장 중요하므로 마지막에 제거됩니다.
바이옴 전환과 반복 패턴 방지
부드러운 바이옴 경계
실제 자연경관에서 바이옴 사이에 딱 끊기는 경계는 없습니다. 숲이 선 하나를 기준으로 끝나고 바로 사막이 되지는 않습니다. 울창한 숲이 드문드문 나무가 있는 지역으로 옅어지고, 이어서 관목 지대와 식생이 드문 사막으로 변하는 그라데이션이 존재합니다. 이를 제대로 구현하면 월드가 타일처럼 나뉘지 않고 연속적으로 느껴집니다.
AutoBiomes(Kötter 외, 논문)는 절차적 지형 생성과 단순화된 기후 시뮬레이션을 결합합니다. 각 지점의 온도, 습도, 고도가 바이옴 유형을 결정합니다. 바이옴 사이에서는 전환 구역(일반적으로 폭 50~100미터)에 걸쳐 머티리얼 가중치와 식생 밀도가 보간됩니다. 전환 폭은 바이옴 조합에 따라 달라집니다. 숲에서 초원으로의 전환은 넓고 점진적이며, 절벽에서 물로의 전환은 좁고 급격합니다.
크리에이터 월드에서는 바이옴 할당이 저해상도 그리드(16x16미터 영역당 바이옴 샘플 하나)에서 실행됩니다. 지형 셰이더는 현재 프래그먼트와 인접 프래그먼트의 바이옴 값을 읽고, 전환 구역에서 머티리얼 가중치를 보간한 다음 그에 따라 텍스처를 블렌딩합니다. 식생 산포에도 동일하게 보간된 밀도 값이 사용되므로 숲 가장자리에서 나무 밀도가 점진적으로 감소합니다.
크리에이터 제어 기능으로는 자신의 플롯에 바이옴 오버라이드를 칠할 수 있게 합니다. 시스템은 지형 속성에서 기본 바이옴을 생성하지만 크리에이터가 이를 재정의할 수 있습니다. 저지대에 "늪"을 칠하면 머티리얼이 탁한 물, 이끼, 고사목으로 바뀝니다. 바이옴 페인트 맵은 절차적 할당을 재정의하는 청크별 16x16 바이옴 ID 그리드(256바이트)입니다.
헥스 타일링: 텍스처 반복 제거
지형 렌더링에서 가장 흔한 시각적 아티팩트는 텍스처 반복입니다. 1미터 크기의 잔디 텍스처를 100미터 초원 전체에 타일링하면 격자 패턴이 눈에 띕니다. 다음 두 기법으로 이를 해결할 수 있습니다.
헥스 타일링(Mikkelsen, 데모)은 정사각형 타일링 그리드를 육각형 그리드로 대체합니다. 각 육각형 타일은 임의의 오프셋과 회전으로 텍스처를 샘플링합니다. 육각형 경계는 이음새를 숨기도록 블렌딩됩니다. 그 결과 타일처럼 반복되지 않고 균일하게 무작위적인 표면이 만들어집니다. 비용은 프래그먼트당 추가 텍스처 샘플 약 3회입니다. 이 기법은 상용 게임에서 널리 사용되며 모든 프래그먼트 셰이더에서 실행할 수 있습니다.
확률적 텍스처 필터링(Pharr 외, NVIDIA, 2024, 논문)은 확률적 샘플링을 사용해 셰이딩 전이 아니라 셰이딩 후에 필터링을 적용합니다. 확률적 샘플링의 오차는 작으며 시공간 디노이징으로 효과적으로 처리됩니다. 이를 통해 더 정확한 필터링 결과를 얻을 수 있고 압축/희소 텍스처에도 사용할 수 있습니다. 지형에서는 타일링 아티팩트뿐 아니라 전환 구간에서 헥스 타일링이 때때로 유발하는 필터링 아티팩트까지 제거합니다.
브라우저 월드에서는 헥스 타일링이 실용적인 선택입니다. 어떤 셰이더에서도 작동하기 때문입니다. 확률적 필터링에는 더 많은 기반 기술이 필요하지만, 시간적 디노이징을 사용할 수 있다면 더 나은 결과를 냅니다. TAA를 사용하는 WebGPU 경로라면 이를 사용할 수 있습니다.
지형 머티리얼 시스템
트라이플래너 매핑
표준 UV 매핑 텍스처는 UV 좌표가 압축되기 때문에 가파른 경사면에서 심하게 늘어납니다. 트라이플래너 매핑은 세 축(X, Y, Z) 모두를 따라 텍스처를 투영하고 표면 노멀을 기준으로 블렌딩합니다.
vec3 blending = abs(normal);
blending = normalize(max(blending, 0.00001));
blending /= (blending.x + blending.y + blending.z);
vec4 xaxis = texture(material, worldPos.yz * scale);
vec4 yaxis = texture(material, worldPos.xz * scale);
vec4 zaxis = texture(material, worldPos.xy * scale);
vec4 color = xaxis * blending.x + yaxis * blending.y + zaxis * blending.z;절벽 면에는 X 또는 Z 투영이 적용되어 늘어남이 발생하지 않습니다. 평평한 지면에는 Y 투영이 적용됩니다. 블렌딩은 부드럽고 자동으로 이루어집니다. UV 언래핑이 필요하지 않습니다.
Babylon.js에는 TriPlanar Material이 내장되어 있습니다. Three.js에는 커스텀 셰이더가 필요하지만 구현에는 GLSL 약 30줄이면 충분합니다.
PBR 지형에서는 알베도, 노멀, 러프니스, 앰비언트 오클루전의 모든 채널에 트라이플래너 매핑을 적용합니다. 각 채널에는 동일한 블렌딩 가중치가 적용됩니다.
경사도 및 고도 기반 머티리얼 할당
스플랫 맵을 직접 칠하는 대신 지형 속성을 기반으로 머티리얼을 절차적으로 할당합니다.
float slope = acos(dot(normal, vec3(0, 1, 0)));
float altitude = worldPos.y;
float grassWeight = smoothstep(0.3, 0.0, slope) * smoothstep(2000.0, 1500.0, altitude);
float rockWeight = smoothstep(0.2, 0.5, slope);
float snowWeight = smoothstep(2500.0, 3000.0, altitude) * smoothstep(0.4, 0.1, slope);
float sandWeight = smoothstep(5.0, 0.0, altitude) * smoothstep(0.15, 0.0, slope);저고도의 평평한 지면에는 풀이 적용됩니다. 가파른 경사면에는 바위가 적용됩니다. 고지대에는 눈이 적용되지만, 눈이 쌓일 만큼 평평한 표면에만 적용됩니다. 해수면 근처에는 모래가 적용됩니다. 전환은 부드럽고 물리적으로 타당합니다.
크리에이터 월드에서는 고도 임계값과 블렌드 구역을 청크별로 칠할 수 있는 매개변수로 제공합니다. 크리에이터는 수목 한계선을 높이거나 낮추고, 적설 범위를 확장하거나, 자신의 플롯에 적용되는 머티리얼 규칙을 조정해 풀이 무성한 언덕을 모래 사막으로 바꿀 수 있습니다.
GPU 친화적 라플라시안 텍스처 블렌딩
표준 텍스처 블렌딩(레이어 사이의 선형 보간)은 눈에 띄는 이음새를 만들거나 색이 바래고 대비가 낮은 결과를 냅니다. 라플라시안 피라미드 블렌딩은 이 문제를 해결하지만 전통적으로 비용이 많이 드는 사전 계산이 필요합니다.
Wronski(NVIDIA, 2025, JCGT)는 사전 계산과 추가 메모리 없이 실시간 셰이더에서 작동하는 GPU 친화적 변형을 제시합니다. 이 기법은 표준 밉맵 체인을 라플라시안 피라미드의 근사치로 사용합니다. 현재 밉 레벨과 더 낮은 해상도의 레벨에서 텍스처를 샘플링하고, 그 차이(라플라시안)를 계산한 다음 각 레이어의 라플라시안 기여도를 블렌딩합니다.
그 결과 큰 스케일에서는 부드럽게 블렌딩하면서도 개별 풀잎이나 바위 균열 같은 선명한 국소 특징을 보존합니다. 비용은 프래그먼트당 추가 텍스처 탭 몇 회입니다. 픽셀당 4개 이상의 머티리얼 레이어를 블렌딩하는 지형에서는 선형 블렌딩보다 눈에 띄게 더 좋은 결과를 내며, 특히 풀, 바위, 모래 사이의 전환 구간에서 효과적입니다.
침식 디테일을 위한 페이저 노이즈
표준 지형은 침식 시뮬레이션이 높이 맵 해상도(1미터 그리드)에서 작동하기 때문에 근거리에서 평평하게 보이는 경우가 많습니다. 실제 지형에는 센티미터 단위의 미세한 침식 패턴인 세류, 도랑, 풍화 균열이 존재합니다.
Grenier 외(2024, CGF)는 페이저 노이즈를 사용해 실시간으로 지형 마이크로 디테일을 추가합니다. 페이저 노이즈는 주기 함수에 입력되는 확률적 위상 필드를 정의해 구조화된 패턴을 합성합니다. 지형에 적용하면 공간적으로 변화하는 다음과 같은 침식 패턴을 생성합니다.
- 여러 스케일에 걸쳐 좁은 세류가 더 큰 도랑으로 이어짐
- 지형 경사에 자동 정렬됨(침식 패턴이 최대 경사선을 따름)
- 최대 32배 증폭 달성(높이 맵 해상도의 32배 디테일 추가)
- 인터랙티브 프레임 속도로 프래그먼트 셰이더에서 완전히 실행됨
브라우저 월드에서는 페이저 노이즈가 지형 셰이더의 디테일 레이어로 실행됩니다. 높이 맵이 큰 스케일의 형태를 제공합니다. 페이저 노이즈는 지오메트리 복잡도를 높이지 않고 프래그먼트 셰이더에서 설득력 있는 미세 침식을 추가합니다. 매개변수(패턴 주파수, 진폭, 방향)는 바이옴별로 달리 설정할 수 있습니다. 노출된 바위에는 깊은 세류, 모래언덕에는 완만한 물결, 마른 진흙에는 거친 나무껍질 같은 텍스처를 적용할 수 있습니다.
지형용 가상 텍스처링
대규모 환경에서는 지형 텍스처 아틀라스가 감당하기 어려울 정도로 커집니다. 센티미터당 1텍셀인 4km x 4km 월드에는 400,000 x 400,000픽셀 텍스처가 필요합니다. 이는 명백히 불가능합니다.
가상 텍스처링(id Software의 Rage에서 유래한 메가텍스처라고도 함)은 지형 텍스처를 페이징된 구조로 취급해 이 문제를 해결합니다. 전체 텍스처는 개념적으로 존재하지만 화면에 보이는 타일만 GPU 메모리에 로드됩니다. 파이프라인:
- 피드백 패스: 각 픽셀에 필요한 텍스처 타일(타일 ID와 밉 레벨)을 출력하는 셰이더로 지형을 렌더링합니다. 이 데이터를 CPU로 다시 읽거나 컴퓨트 셰이더로 처리합니다.
- 타일 로딩: CDN에서 요청된 타일을 불러오거나 스플랫 맵 데이터로 절차적으로 생성합니다.
- 간접 참조 텍스처: 작은 텍스처를 사용해 가상 타일 좌표를 텍스처 아틀라스의 물리적 타일 좌표에 매핑합니다.
- 렌더 패스: 지형 셰이더가 간접 참조 텍스처를 조회해 올바른 물리적 타일을 찾은 다음, 아틀라스에서 머티리얼 텍스처를 샘플링합니다.
WebGPU의 컴퓨트 셰이더는 피드백 분석과 페이지 테이블 관리를 전부 GPU에서 처리할 수 있습니다. CPU는 타일 I/O만 관리합니다.
그 결과 텍스처 메모리 사용량이 폭증하지 않으면서 어떤 해상도에서도 고유한 텍스처를 지닌 지형을 구현할 수 있습니다. 카메라에서 먼 타일은 낮은 해상도로 로드되고, 가까운 타일은 높은 해상도로 로드됩니다. 전체 메모리 사용량은 고정된 예산(일반적으로 텍스처 아틀라스에 128~256MB) 이내로 유지됩니다.
동적 지형 효과
웅덩이와 젖음 효과
비는 단순히 내리기만 하지 않습니다. 빗물은 쌓입니다. 움푹 팬 곳에서는 웅덩이를 만들고, 표면에는 젖은 광택을 남기며, 가파른 경사면에서는 흘러내립니다. 이를 시뮬레이션하면 날씨가 단순한 시각적 오버레이가 아니라 지형과 연결된 것처럼 느껴집니다.
셰이더 기반 접근 방식은 유체 역학을 시뮬레이션하지 않습니다. 대신 지형 높이맵을 사용해 물이 고이는 위치를 결정합니다.
float concavity = heightCenter * 4.0 - heightLeft - heightRight - heightUp - heightDown;
float puddleDepth = max(0.0, concavity * rainIntensity - evaporationRate * timeSinceRain);
float wetness = smoothstep(0.0, 0.02, puddleDepth);
vec3 wetColor = baseColor * 0.7;
float wetRoughness = baseRoughness * 0.3;
vec3 finalColor = mix(baseColor, wetColor, wetness);
float finalRoughness = mix(baseRoughness, wetRoughness, wetness);오목한 영역(높이맵 라플라시안의 음수 값)에 물이 고입니다. 더 깊이 오목할수록 웅덩이는 더 커집니다. 젖은 표면은 어두워지고 반사율은 높아집니다(거칠기 감소). 비가 그친 뒤에는 시간이 지나면서 효과가 사라집니다.
완전한 웅덩이 반사를 구현하려면 웅덩이 표면에 평면 반사 패스를 추가하세요. 또는 비용이 더 저렴하고 Three.js와 Babylon.js의 포스트 프로세싱 스택 모두에서 이미 사용할 수 있는 화면 공간 반사(SSR)를 사용할 수 있습니다.
웅덩이 표면의 빗방울에는 피드백 텍스처에서 간단한 2D 파동 방정식을 사용합니다(Saurel, 2026, 블로그). 각 빗방울은 바깥쪽으로 퍼지다가 감쇠하는 잔물결을 만듭니다. 파동 텍스처가 웅덩이 노멀 맵을 변조하여 60fps에서 사실적인 잔물결 패턴을 만듭니다.
발자국과 지형 변형
플레이어가 부드러운 지형(모래, 눈, 진흙)을 걸을 때 발자국은 실제로 그곳에 존재한다는 감각을 더해 줍니다. 기법은 다음과 같습니다. 높이 오프셋을 저장하는 작은 변형 텍스처를 청크마다 유지합니다(64x64픽셀 = 4KB). 캐릭터가 부드러운 지형을 밟으면 발자국 모양을 변형 텍스처에 찍습니다.
지형 버텍스 셰이더는 변형 텍스처를 읽고 높이에서 오프셋을 뺍니다. 지형 프래그먼트 셰이더는 발자국 영역을 어둡게 만들고(압축된 토양은 더 어둡습니다) 거칠기를 높입니다(흐트러진 표면).
변형 텍스처를 점진적으로 0으로 되돌리면 발자국은 시간이 지나면서 사라집니다(눈이 다시 쌓이고, 비가 진흙 발자국을 씻어 냅니다). 사라지는 속도는 날씨에 따라 달라집니다. 비가 올 때는 빠르고 건조한 환경에서는 느립니다.
멀티플레이어 월드에서 발자국 데이터는 일시적이며 로컬로 처리됩니다. 각 클라이언트는 보이는 플레이어의 발자국을 생성합니다. 변형 텍스처는 클라이언트 간에 동기화할 필요가 없습니다(각자 일시적인 발자국에 대한 자신의 버전을 봅니다). 따라서 모든 발걸음을 브로드캐스트하는 네트워크 비용을 피할 수 있습니다.
절차적 하늘과 낮/밤 주기
하늘은 모든 오픈 월드에서 가장 넓게 보이는 표면입니다. 하늘은 전체 지형의 분위기를 결정합니다.
Three.js에는 절차적 태양과 달, 낮/밤 주기, 구름, 별, 렌즈 플레어를 포함하는 완전한 하늘 시스템이 있습니다. Three.js에 내장된 Sky 예제(WebGPU에서도 이용 가능)는 Preetham의 해석적 하늘 모델을 구현합니다.
물리적으로 더 정확한 결과를 위해 webgpu-sky-atmosphere는 Hillaire의 대기 모델을 WebGPU 포스트 프로세스로 구현합니다. 여러 산란 위상 함수를 지원하며, 정확한 공중 원근법(멀리 있는 지형이 더 흐릿하게 보이는 현상), 태양 및 일몰 색상, 하늘 그라데이션을 기본 원리부터 계산해 만들어 냅니다.
TerrainView7은 사전 계산된 대기 산란을 사용해 WebGPU에서 실제 규모의 행성을 렌더링하며, 물리적으로 정확한 대기 렌더링이 브라우저에서 실행될 수 있음을 입증합니다.
크리에이터 월드에서는 하늘 매개변수(태양 위치, 구름 양, 연무 밀도)가 서버의 월드 시계를 기준으로 모든 클라이언트에 동기화됩니다. 하늘 셰이더는 각 클라이언트에서 로컬로 실행되어 모든 플레이어에게 일관된 조명을 제공합니다.
지형 조명: 간접광
직사광은 섀도 맵으로 처리합니다. 하지만 그림자 속 지형의 색상과 밝기(앰비언트/간접광)도 시각적 품질에 똑같이 중요합니다. 완전히 검은 그림자는 부자연스럽습니다. 그림자에는 하늘색의 색조가 반영되어야 합니다(맑은 날에는 파란색, 흐린 날에는 회색).
브라우저 월드에서 실용적인 접근 방식은 다음과 같습니다.
가시성 비트마스크를 사용하는 화면 공간 간접 조명(Jimenez 외, 2023, 논문)은 픽셀마다 32개 방향의 가시성 섹터를 추적해 표준 SSAO를 개선합니다. 이를 통해 한 지점이 얼마나 가려졌는지뿐 아니라 가려진 방향까지 포착합니다. 얇은 표면에서는 반대편의 빛이 올바르게 통과할 수 있습니다. 그 결과 전역 조명 인프라 없이도 주변 지오메트리에 반응하는 간접광을 구현할 수 있습니다.
비용은 SSAO와 비슷한 수준(1~2ms)입니다. 시각적 개선 효과는 큽니다. 협곡 안의 지형은 협곡 벽에서 반사된 빛을 받고, 돌출부 아래쪽은 지면 반사광으로 밝아집니다. 이 효과는 하늘 셰이더의 대기 산란과 결합되어 물리적 원리에 기반한 앰비언트 조명을 만들어 냅니다.
지형 물리 통합
Rapier 높이 필드 콜라이더
Rapier의 WASM 물리 엔진은 지형에 최적화된 네이티브 높이 필드 콜라이더를 제공합니다. 지형 콜라이더 생성은 간단합니다.
const heights = new Float32Array(65 * 65);
// Fill with heightmap data...
const groundCollider = RAPIER.ColliderDesc.heightfield(
64, 64, heights, new RAPIER.Vector3(64.0, 100.0, 64.0)
);
world.createCollider(groundCollider);높이 필드 콜라이더는 구조화된 그리드를 사용해 효율적인 광역 단계 쿼리를 수행합니다. 높이 필드에 대한 레이캐스팅 복잡도는 삼각형 메시의 O(n)이 아니라 O(log n)입니다. 65x65 청크의 충돌 쿼리는 마이크로초 단위로 처리됩니다.
체적 지형(SDF 오버레이)이 있는 청크에서는 마칭 큐브 출력으로 삼각형 메시를 생성하고 트라이메시 콜라이더를 사용합니다. 이는 높이 필드 콜라이더보다 비용이 많이 들지만 임의의 지오메트리를 처리할 수 있습니다. 플레이어와 가장 가까운 3~5개 청크에만 트라이메시 콜라이더를 생성하세요. 먼 청크에는 물리 처리가 필요하지 않습니다.
성능: 65x65 청크용 Rapier 높이 필드 콜라이더는 캐릭터 컨트롤러 쿼리에서 물리 스텝마다 약 0.1ms를 추가합니다. 높이 필드 콜라이더가 있는 활성 청크 5개는 0.5ms, 체적 청크용 트라이메시 콜라이더 1개는 0.2~0.5ms가 걸립니다. 전체 지형 물리 예산은 1ms 미만으로, 전체 월드의 물리 예산인 2~3ms 이내에 충분히 들어옵니다.
지형 인식 캐릭터 컨트롤러
캐릭터 컨트롤러는 지형 속성에 반응해야 합니다.
- 경사 제한: 캐릭터는 최대 45도의 경사면을 걸을 수 있습니다. 더 가파른 경사면에서는 미끄러집니다. 캐릭터 위치의 지형 노멀을 사용하며, 이 값은 높이맵 기울기에서 저렴하게 계산할 수 있습니다.
- 표면 재질 반응: 바위 위를 걸을 때는 모래나 진흙 위를 걸을 때와 다른 발소리와 이동 속도를 적용합니다. 지형의 스플랫 맵은 어느 지점에서든 표면 재질 정보를 제공합니다.
- 단차 오르기: 캐릭터는 최대 0.5m 높이의 턱을 올라갈 수 있습니다. Rapier의
KinematicCharacterController는 설정 가능한 단차 높이를 통해 이를 자동으로 처리합니다.
브라우저에서의 인터랙티브 지형 편집
크리에이터 월드에서 지형은 단순히 생성되는 것이 아닙니다. 플레이어가 조각하고 수정하며 형태를 바꿉니다. 편집 도구는 반응성이 뛰어나야 하고(즉각적인 시각적 피드백), 네트워크로 연결되어야 합니다(다른 플레이어가 몇 초 이내에 변경 사항을 볼 수 있어야 함).
WebGPU SDF 편집기
Reinder Nijhoff의 WebGPU SDF 편집기는 모든 기능을 갖춘 SDF 모델링이 현재 브라우저에서 작동할 수 있음을 보여 줍니다. 이 편집기는 다음을 지원합니다.
- 위치, 회전, 크기 조절이 가능한 6가지 기본 도형(구, 상자, 원뿔, 원기둥, 캡슐, 토러스)
- 부드러운 블렌딩과 설정 가능한 블렌드 반경을 지원하는 불리언 연산(합집합, 차집합, 교집합)
- 그룹과 중첩 연산을 지원하는 계층적 씬 그래프
- 여러 GPU 컴퓨트 셰이더 단계, 16,384개 그리드 셀을 아우르는 옥트리 기반 공간 분할, 마칭 큐브 또는 서피스 넷을 통한 표면 추출을 사용하는 실시간 렌더링
- 섀도 맵을 통한 시간적 안티앨리어싱 및 앰비언트 오클루전
각 기본 도형은 단일 GPU 버퍼에 28개의 부동소수점 값(112바이트)으로 저장됩니다. 이 간결한 표현 덕분에 동굴 입구, 아치 또는 깎아 낸 절벽 면을 정의하는 수십 개의 SDF 기본 도형으로 구성된 복잡한 지형 편집도 5KB 미만이며, 다른 플레이어에게 즉시 동기화됩니다.
크리에이터 월드의 SDF 편집 워크플로는 다음과 같습니다.
- 크리에이터가 조각 도구를 선택합니다(구 추가, 상자 빼기, 부드러운 블렌딩).
- 월드에서 클릭하거나 드래그하여 SDF 기본 도형을 배치하고 크기를 조정합니다.
- 클라이언트가 수정된 SDF에 즉시 마칭 큐브를 실행해 로컬 메시를 업데이트합니다(16ms 미만의 피드백).
- SDF 편집 내용(기본 도형 유형 + 트랜스폼 + 블렌드 모드, 약 100바이트)이 서버로 전송됩니다.
- 서버가 편집 내용을 검증한 뒤(크리에이터의 구획 안에 있고 보호 구역과 교차하지 않는지 확인) 주변 플레이어에게 브로드캐스트합니다.
- 다른 플레이어의 클라이언트가 SDF 편집을 적용하고 로컬 메시를 재생성합니다.
편집 내용이 다른 플레이어에게 표시되기까지 걸리는 전체 왕복 시간은 네트워크 지연 시간에 따라 100~300ms입니다. 크리에이터에게는 서버 확인 전에 로컬에서 적용되므로 편집 결과가 즉시 보입니다.
브러시 기반 높이맵 편집
체적 기능이 필요하지 않은 지형의 90%를 차지하는 높이맵 레이어에는 더 단순한 편집 모델이 적합합니다. 크리에이터는 브러시로 높이 변경 사항을 칠합니다.
- 높이기/낮추기: 감쇠가 적용되는 반경 내에서 높이를 더하거나 뺍니다.
- 다듬기: 반경 내 높이의 평균을 계산하여 날카로운 지형을 제거합니다.
- 평탄화: 반경 내 모든 높이를 목표값으로 설정합니다.
- 침식 브러시: 브러시 반경 안에서 몇 단계의 수력 침식을 로컬로 적용합니다.
높이맵 편집은 기본 지형 위에 겹쳐지는 작은 높이 변경 패치인 델타입니다. 델타 패치는 매우 작으며(16비트 높이 오프셋으로 구성된 32x32 그리드 = 2KB), 단일 메시지로 다른 플레이어에게 동기화됩니다. 청크마다 여러 델타 패치가 누적되며, 서버에서 주기적으로 청크의 영구 높이맵에 병합됩니다.
협업 편집 제약 조건
여러 크리에이터가 같은 청크를 동시에 편집할 때는 시스템에 규칙이 필요합니다.
- 공간 잠금: 한 번에 한 명의 크리에이터만 특정 8x8m 하위 영역을 편집할 수 있습니다. 크리에이터가 편집 스트로크를 시작하면 잠금을 획득하고 브러시를 떼면 해제합니다. 10초 동안 활동이 없으면 잠금이 만료됩니다.
- 겹치지 않는 편집: 두 크리에이터가 같은 청크의 서로 다른 부분을 편집하면 두 편집 내용이 충돌 없이 적용됩니다(서로 다른 높이맵 셀이나 SDF 영역을 수정하기 때문).
- 겹치는 편집: 두 크리에이터가 같은 위치를 편집하면 서버가 도착 순서대로 편집 내용을 직렬화합니다. 조정이 끝난 뒤 두 클라이언트 모두 동일한 최종 결과를 봅니다.
이는 배치된 오브젝트에 사용하는 완전한 CRDT 접근 방식보다 단순합니다. 지형 편집은 불연속적인 오브젝트 상태가 아니라 연속 필드(높이, SDF 거리)에 대한 누적 연산이기 때문입니다.
WebGPU의 나나이트 스타일 가상 지오메트리
Unreal Engine 5의 Nanite는 빌드 시 클러스터 DAG(방향성 비순환 그래프)를 구축하고, 런타임에 화면 공간 오차를 기준으로 클러스터별 적절한 LOD를 선택하여 수십억 개의 삼각형을 렌더링합니다. 전체 파이프라인은 GPU에서 실행됩니다. 이 접근 방식은 WebGPU로도 이식되었습니다.
Nanite WebGPU
Scthe가 만든 Nanite WebGPU(GitHub 스타 1.1천 개 이상)는 Nanite 핵심 아키텍처를 브라우저에서 완전히 구현한 프로젝트입니다.
- meshoptimizer의 클러스터 생성을 사용해 오프라인으로 구축하는 메시렛 LOD 계층 구조
- WGSL 컴퓨트 셰이더로 구현한 소프트웨어 래스터라이저(하드웨어 래스터화로 클러스터별 드로우를 효율적으로 처리할 수 없는 WebGPU의 제약 내에서 작동)
- 프러스텀 및 오클루전 테스트를 사용하는 인스턴스별 및 메시렛별 컬링
- 매우 멀리 있는 오브젝트를 위한 빌보드 임포스터
- 텍스처 및 버텍스별 노멀 지원 파이프라인은 메시를 약 128개의 삼각형으로 구성된 클러스터로 분할합니다. 인접한 클러스터를 그룹화하고, 공유 경계를 유지하면서 각 그룹을 단순화합니다(meshoptimizer 사용). 이 과정은 전체 메시가 단일 클러스터로 축소될 때까지 재귀적으로 반복됩니다. 런타임에는 컴퓨트 셰이더가 DAG를 순회하며 현재 화면 해상도에서 오차가 1픽셀 미만인 그룹별 최저 정밀도 클러스터를 선택합니다.
THREE-Nanite는 개발 중인 Three.js 구현체로, 수십만 개의 삼각형을 처리하면서도 내장 그래픽 하드웨어에서 20~40fps를 달성합니다. 이는 저사양 브라우저 하드웨어에서도 Nanite 스타일 렌더링이 실용적이라는 점을 보여줍니다.
meshoptimizer: LOD 파이프라인의 기반
meshoptimizer(Arseny Kapoulkine 제작)는 브라우저 호환 LOD 파이프라인 대부분의 기반이 되는 라이브러리입니다. 버전 1.0(2025)은 다음 기능을 제공합니다.
- 오차 메트릭을 사용하는 메시 단순화(형상이 얼마나 바뀌었는지 측정하며 LOD 선택에 사용)
- Nanite 스타일 메시렛 계층 구조를 위한 클러스터 생성
- GPU 친화적인 삼각형 순서를 위한 버텍스 캐시 최적화
- 픽셀 셰이더 비용을 줄이는 오버드로 최적화
- 다운로드 크기를 줄이는 버텍스 양자화 및 압축
2025년 12월에 출시된 meshoptimizer 1.0에는 Nanite 스타일 연속 LOD를 직접 구현하는 새로운 단일 헤더 clusterlod.h가 포함되어 있습니다. 이 헤더는 점진적으로 그룹화되고 단순화되는 클러스터 계층 구조를 구축하며, 그대로 사용하거나 커스텀 파이프라인의 참고 구현으로 활용할 수 있습니다. 이는 지형 파이프라인이 SDF/마칭 큐브 메시 LOD를 위해 필요로 하는 정확한 클러스터 DAG 기본 요소입니다.
지형 파이프라인에서는 meshoptimizer가 SDF 지형의 마칭 큐브 출력물을 LOD 계층 구조를 갖춘 최적화된 클러스터 메시로 처리합니다. 오프라인 처리는 서버 측에서 실행됩니다. 브라우저는 사전 클러스터링된 메시를 수신하고 런타임에 GPU 기반 LOD 선택을 수행합니다.
LOD 생성에 meshoptimizer를 사용하고 런타임 선택에 WebGPU 컴퓨트를 사용하는 조합은 브라우저 지형에 Nanite와 동일한 아키텍처 패턴을 적용하되, 웹 환경의 제약에 맞게 조정한 것입니다.
지형을 고려한 레벨 디자인
지형은 단순히 걸어 다니는 표면이 아닙니다. 지형의 형태는 플레이어의 움직임을 유도하고, 시선을 이끌며, 탐험의 감정적 리듬을 만듭니다. 최고의 오픈 월드는 지형을 디자인 도구로 활용합니다.
시야선과 랜드마크
The Level Design Book의 길 찾기 챕터는 지형의 고도가 플레이어가 무엇을 보고 어디로 이동하는지를 어떻게 제어하는지 설명합니다. 능선은 그 너머를 가려 호기심을 유발합니다. 계곡은 가장 낮은 지점을 향해 이동을 유도합니다. 멀리서도 보이는 높은 랜드마크(탑, 산봉우리, 독특한 나무)는 플레이어에게 걸어갈 목표를 제공합니다.
크리에이터 월드에서는 지형 생성이 자연스러운 길 찾기 요소를 만들어야 합니다. 능선은 시야를 끊어 플레이어가 언덕 꼭대기에 올라 새로운 지역을 보는 순간에 ‘발견의 순간’을 만들어야 합니다. 계곡은 흥미로운 장소를 향해 모여야 합니다. 크리에이터가 멀리서도 보이는 랜드마크를 배치할 수 있도록 높은 지점도 있어야 합니다.
호기심이 이끄는 탐험
퍼듀 대학교의 연구(논문)는 공간 탐험을 유발하는 네 가지 요인을 제시합니다.
- 극단적인 지점에 도달하기(가장 높은 봉우리, 가장 먼 경계, 가장 깊은 동굴). 지형에는 도달했을 때 보람을 주는 명확한 극점이 있어야 합니다.
- 시각적 장애물 너머 확인하기(저 절벽 뒤에는 무엇이 있을까? 저 동굴 안에는 무엇이 있을까?). 시야를 가리는 지형은 숨겨진 것을 찾기 위한 이동을 유도합니다.
- 주변과 어울리지 않는 오브젝트(황야의 구조물, 어둠 속의 불빛). 크리에이터가 자연 지형에 배치한 오브젝트는 시선을 끄는 대비를 만듭니다.
- 공간적 연결 이해하기(이 계곡은 저 해안과 어떻게 이어질까?). 알아보기 쉬운 지형 구조는 지도 판독과 경로 계획을 장려합니다.
PlotMap: AI 지원 POI 배치
PlotMap(arXiv:2309.15242)은 서사적 요구 사항(이 퀘스트에는 강 근처의 마을이 필요하고, 저 퀘스트에는 언덕 꼭대기의 폐허가 필요함)을 입력받아 공간적 제약 조건을 충족하는 지형 위치를 찾아 관심 지점 배치를 자동화합니다. 크리에이터 월드에서도 이와 유사한 시스템이 지형 특성에 따라 구조물 배치 위치를 제안할 수 있습니다. 예를 들면 “이 언덕 꼭대기는 시야가 좋아 감시탑에 적합합니다”, “바람을 피할 수 있는 이 계곡은 마을에 적합합니다”와 같은 제안입니다.
흐르는 물과 폭포
강과 폭포는 시각적 매력에 환경음을 더하고, 게임플레이 어포던스까지 제공하는 지형 요소입니다. 물은 장벽이나 자원, 또는 이동 경로가 될 수 있습니다.
강 렌더링
오픈 월드의 강은 일반적으로 지형 표면을 따라가는 텍스처 스트립으로 렌더링됩니다. 스트립 메시는 제어점으로 저장된 강 스플라인에서 생성한 뒤 지형 높이맵에 투영합니다. 강 셰이더는 다음 효과를 적용합니다.
- 강의 흐름 방향으로 스크롤되어 물이 흐르는 것처럼 보이게 하는 흐름 정렬 UV
- 강과 둑이 만나는 가장자리의 거품(해안선 거품과 유사한 깊이 기반 효과)
- 수로 폭에 따른 속도 변화(좁은 구간은 더 빠르게 흐르고 넓은 구간은 느려짐)
- 깊이 기반 색상이 적용된 투명도(얕은 곳은 맑고 깊은 곳은 어두움)
브라우저 월드에서 강 데이터는 매우 작습니다. 강 구간당 20~50개의 제어점으로 구성된 스플라인(약 400바이트)에 폭과 유속 매개변수를 더하면 됩니다. 클라이언트는 스플라인을 지형 표면에 투영하여 강 메시를 로컬에서 생성합니다.
폭포 렌더링
강이 절벽 아래로 떨어지는 지점에서는 평평한 강 표면을 폭포 파티클 시스템으로 대체합니다. 실시간 물 시뮬레이션 연구의 하이브리드 접근 방식(EG)에서는 높이 필드로 표현할 수 없는 영역(폭포, 물 튀김)을 물보라, 튀는 물, 거품 파티클로 변환하며, 이 파티클은 유체 시뮬레이션과 질량 및 운동량을 교환합니다.
브라우저 월드의 폭포는 더 단순합니다. 강 스플라인이 지형의 불연속적인 높이 변화를 가로지르는 지점을 감지하고, 해당 위치에 아래쪽 속도를 가진 파티클 시스템을 생성한 뒤 바닥에 거품 물보라를 추가합니다. 파티클은 스크롤되는 알파 텍스처를 사용하는 GPU 인스턴싱 쿼드입니다. 폭포당 파티클 500개를 하나의 드로 콜로 렌더링합니다. 떨어지는 물소리에는 거리 감쇠와 함께 Web Audio API를 사용합니다.
멀리 있는 지형 요소를 위한 임포스터
나무, 바위, 건물과 같은 지형 요소는 멀리 떨어지면 매우 작게 보입니다. 이를 완전한 3D 메시로 렌더링하면 GPU 연산을 낭비하게 됩니다. 임포스터는 멀리 있는 오브젝트를 카메라를 향하는 사전 렌더링된 평면 이미지로 대체합니다.
팔면체 임포스터 아틀라스
팔면체 임포스터는 여러 시야각에서 3D 오브젝트의 모습을 캡처하여 텍스처 아틀라스에 저장합니다. 런타임에 셰이더는 현재 시선 방향에 따라 아틀라스를 샘플링하고, 가장 가까운 두 캡처 각도 사이를 보간합니다.
반구형 팔면체 아틀라스는 위쪽 반구의 시점만 사용합니다. 나무를 아래에서 올려다볼 일은 드물기 때문에, 동일한 텍스처 크기에서 전체 팔면체 아틀라스보다 두 배 높은 각도 해상도를 제공합니다. Unity의 임포스터 시스템에 따르면 각각 14만 개의 삼각형으로 구성된 나무 인스턴스 1,600개를 실제 메시에서 임포스터로 전환했을 때 프레임 시간이 111ms에서 5.78ms로 감소했습니다.
브라우저 월드의 임포스터 파이프라인은 다음과 같습니다.
- 서버 측: 각 에셋을 16~32개 시야각에서 렌더링하여 색상, 노멀, 깊이 캡처
- 아틀라스 텍스처로 패킹(에셋당 아틀라스 하나, 약 256x256픽셀, KTX2 기준 100KB 미만)
- 런타임: 임포스터 거리(일반적으로 100~200m) 너머의 인스턴스를 아틀라스를 샘플링하는 빌보드로 렌더링
- 전환을 감추기 위해 20m 전환 구간에서 메시와 임포스터를 크로스페이드
빌보드 스플래팅(BBSplat)
Billboard Splatting(2024, arXiv:2411.08508은 학습 가능한 텍스처 평면 프리미티브를 사용하여 이 방식을 한 단계 더 발전시킵니다. BBSplat은 사전 렌더링된 시점을 사용하는 대신, 어떤 각도에서도 3D 오브젝트를 가장 잘 표현하도록 빌보드 위치와 텍스처를 최적화합니다. 이를 통해 시점 의존적 외형을 유지하면서 3D Gaussian Splatting 대비 최대 17배의 압축률을 달성합니다. 브라우저 월드의 멀리 있는 지형 요소에 BBSplat을 사용하면 각도 범위를 개선하면서 에셋별 임포스터 저장 공간을 줄일 수 있습니다.
전문 지형 도구와 그로부터 얻는 교훈
지형 파이프라인을 처음부터 구축하기 전에 전문 오프라인 도구가 무엇을 하는지 이해할 필요가 있습니다. 이러한 도구에는 수십 년간의 지형 생성 연구가 프로덕션 워크플로로 집약되어 있습니다.
Gaea(QuadSpinner)는 GPU 가속을 지원하며 변경 사항에 거의 즉각적인 피드백을 제공합니다. 한 변당 최대 200만 픽셀의 타일 빌드와 자동 LOD 메시 내보내기를 지원하며, 각 노드가 침식, 퇴적, 융기, 열적 풍화와 같은 물리적 과정을 나타내는 노드 기반 그래프를 제공합니다. Gaea의 침식 노드는 일반적인 노이즈가 아닌 구체적인 물리 과정을 모델링하므로 손으로 조각한 듯한 지형을 만듭니다. 핵심은 Gaea가 단일 침식 알고리즘을 사용하지 않는다는 점입니다. 하천 침식(강의 침식 작용), 열적 침식(절벽 붕괴), 해안 침식(파도 작용), 풍식(사구 형성)을 위한 별도의 노드를 제공합니다. 이를 그래프로 결합하면 특정 기후의 지질학적 특성을 지닌 지형을 만들 수 있습니다.
World Machine은 지형의 거시적 구조에 중점을 두면서 이와 유사한 그래프 접근 방식을 사용합니다. ‘레이아웃 생성기’를 이용하면 아티스트가 지형 요소의 대략적인 형태(여기에 산, 저기에 계곡, 이 가장자리를 따라 해안선)를 스케치하고, 시스템이 물리적으로 그럴듯한 디테일을 채웁니다. 이는 우리가 원하는 크리에이터 워크플로와 정확히 일치합니다. 의도를 스케치하면 지질 구조가 생성됩니다.
World Creator는 편집 중 실시간 미리보기와, 지형을 분석하고 배수 분석을 바탕으로 흐름 경로를 자동 계산하는 내장 강 생성 기능으로 차별화됩니다.
이러한 도구에서 얻는 교훈: 물리 과정을 결합하는 노드 그래프 접근 방식은 어떤 단일 알고리즘보다 강력합니다. 서버 측 생성 파이프라인은 노이즈 기반 > 지각 융기 > 수력 침식 > 열적 풍화 > 해안 침식 > 식생과 같은 체이닝을 지원해야 합니다. 크리에이터는 각 단계의 매개변수를 제어합니다. 파이프라인은 서버 측에서 몇 초 만에 실행되어 높이맵, 스플랫 맵, 식생 밀도 맵을 생성합니다.
SoilMachine: 오픈 소스 지형 형성 시뮬레이터
SoilMachine은 여러 침식 시스템(수력, 열적, 풍식)을 퇴적물 운반 및 퇴적과 결합하는 오픈 소스 모듈식 지형 형성 시뮬레이터입니다. C++와 GPU 컴퓨트로 구축되었으며, 전문 도구에서 사용하는 다중 과정 침식 접근 방식의 참고 구현을 제공합니다.
관련 라이브러리인 soillib(C++20, MIT 라이선스)는 기반이 되는 지형 형성 시뮬레이션 기본 요소를 재사용 가능한 라이브러리로 제공합니다. 또한 hydro-gen은 OpenGL 컴퓨트 셰이더에서 그리드 기반(천수 방정식) 및 파티클 기반(빗방울) 수력 침식을 모두 구현하며 실시간 매개변수 조정을 지원합니다.
이러한 오픈 소스 도구는 서버 측 생성 파이프라인에 맞게 조정할 수 있습니다. 향후 크리에이터에게 실시간 피드백을 제공하기 위해 브라우저에서 침식을 실행하려는 경우, 컴퓨트 셰이더 구현을 WebGPU로 직접 옮길 수 있습니다.
다중 레이어 지형 머티리얼
실제 지형은 하나의 표면이 아닙니다. 맨 아래에는 기반암이 있고, 그 위에 토양이 있으며, 표면에는 눈이나 모래가 쌓입니다. 동적 레이어링은 계절, 날씨, 크리에이터의 행동에 따라 지형의 시각적 특성을 변화시킵니다.
계층형 높이 필드 표현
단일 높이맵 대신 그리드 셀마다 여러 높이 레이어를 사용합니다.
Cell {
bedrock_height: f16, // 영구적인 암석 표면
soil_height: f16, // 기반암 위에 쌓인 토양/퇴적물
snow_height: f16, // 동적으로 쌓인 눈
water_height: f16 // 고여 있는 물의 깊이
}총 셀당 8바이트입니다(단일 높이맵은 2바이트). 65x65 청크에서는 압축 전 34KB이며, 여전히 작은 크기입니다.
시각적 표면은 bedrock + soil + snow입니다. 지형 셰이더는 모든 레이어를 읽고 그에 따라 머티리얼을 블렌딩합니다. 토양이 얇은 곳에서는 암석이 드러납니다. 눈이 쌓인 곳에서는 표면이 하얗게 보입니다. 물이 고인 곳에는 웅덩이나 호수가 생깁니다.
동적 퇴적
눈이 내릴 때는 평평하고 위쪽을 향한 표면에 눈이 쌓입니다. 적설 속도는 표면 노멀(가파른 경사면에는 눈이 쌓이지 않음), 온도(고도에 따라 달라짐), 차폐 여부(오버행 아래에는 눈이 쌓이지 않음)에 따라 달라집니다. 컴퓨트 셰이더 패스는 날씨 틱마다(몇 초 간격) 눈 레이어를 업데이트합니다.
모래도 이와 유사하게 바람에 의해 운반되고 퇴적됩니다. 바람은 노출된 표면의 입자를 운반하여 장애물 뒤와 바람이 차단된 영역에 퇴적시킵니다.
크리에이터 월드에서 동적 퇴적을 사용하면 날씨에 따라 지형의 모습이 달라집니다. 눈보라가 치는 동안 세상이 눈으로 덮이고, 날씨가 개면 녹습니다. 비가 내리면 움푹한 곳에 물이 고입니다. 크리에이터가 아무 작업도 하지 않아도 월드가 반응하는 것처럼 느껴집니다.
다중 레이어 침식
2024년 논문 “다중 레이어 높이맵을 사용한 3D 실시간 수력 침식 시뮬레이션”(EG)은 침식이 여러 레이어에 걸쳐 작동하도록 확장합니다. 물은 기반암보다 토양을 더 빠르게 침식합니다. 퇴적물은 새로운 토양 레이어로 쌓입니다. 시뮬레이션은 레이어의 무결성(기반암이 토양 아래에 유지됨)을 보존하면서 오버행(기반암 아래의 토양이 침식되어 기반암이 돌출된 형태)과 같은 복잡한 요소를 구현할 수 있게 합니다. 성능: 2048x2048 해상도의 RTX 3070에서 시뮬레이션 단계당 약 6ms입니다. 서버 측 생성에는 충분히 빠르지만 브라우저에서 프레임마다 시뮬레이션하기에는 너무 느립니다. 계층형 표현은 정적 지형 생성에 적합하며, 동적인 눈/물 축적은 더 저렴한 프레임별 셰이더로 실행됩니다.
잔디, 바위 및 디테일 렌더링
랜드스케이프에는 지형 지오메트리와 텍스처만으로는 부족합니다. 바람에 흔들리는 풀잎, 비탈에 흩어진 바위, 그리고 꽃, 자갈, 떨어진 나뭇가지처럼 근접 화면을 자연스럽게 보이게 하는 작은 디테일이 필요합니다.
GPU 인스턴싱 잔디
브라우저 기반 잔디 렌더링은 Three.js에서 충분히 검증되었으며 GPU 인스턴싱을 통해 구현할 수 있습니다. al-ro의 잔디 데모는 InstancedBufferGeometry를 사용해 단일 드로 콜로 풀잎 100,000개를 렌더링합니다.
각 풀잎은 단순한 쿼드(삼각형 4~8개)입니다. 인스턴스별 속성은 위치, 높이, 휘어지는 방향, 색상 변화, 바람 위상을 정의합니다. 버텍스 셰이더는 다음을 수행합니다.
- 인스턴스별 변환을 읽습니다
- 월드 위치와 시간을 기준으로 한 사인파를 사용해 바람 애니메이션을 적용합니다
- 바람 세기에 따라 풀잎을 휘게 합니다(끝부분은 더 많이 휘고 밑부분은 휘지 않음)
- 색상 그라디언트를 적용합니다(서브서피스 스캐터링을 위해 밑부분은 더 어둡게, 끝부분은 더 밝게)
Codrops의 풍성한 잔디 튜토리얼(2025, 튜토리얼)은 셸 텍스처링 방식을 보여 줍니다. 지면 평면을 점점 큰 오프셋으로 여러 번 렌더링하고, 각 레이어에서 노이즈 텍스처를 샘플링하여 빽빽한 잔디 볼륨처럼 보이게 합니다. 매우 조밀한 영역에는 개별 풀잎 인스턴싱보다 저렴하지만, 가까이에서 보면 사실감이 떨어집니다.
크리에이터 월드에서 잔디 밀도는 청크별 식생 밀도 맵으로부터 가져옵니다. GPU는 렌더링 시 밀도 맵을 기반으로 풀잎 위치를 분산 배치합니다. 풀잎별 데이터는 저장하거나 스트리밍하지 않습니다. 밀도 맵은 청크당 32x32 그리드(1KB)이며, GPU가 이를 바탕으로 수천 개의 풀잎 인스턴스를 생성합니다.
절차적 바위 및 절벽 디테일
절벽 면과 암석 지형에는 기본 높이 맵이나 SDF가 합리적인 해상도에서 제공할 수 없는 기하학적 디테일이 필요합니다. 다음 두 접근 방식은 서로를 보완합니다.
GPU 메시 셰이더 재표면화(Raad 외, Eurographics 2025, 논문)는 거친 제어 메시로부터 렌더링 시 절차적 지오메트리를 생성합니다. 메시 셰이더가 기본 지형 표면을 읽고 디테일 지오메트리를 메모리에 저장하지 않은 채 변위, 균열, 돌출부를 추가합니다. 이를 통해 VRAM 사용량을 줄이고 동적 LOD를 구현할 수 있습니다.
인스턴싱 바위 분산 배치는 GPU 인스턴싱을 사용해 미리 제작한 바위 메시를 가파른 비탈과 절벽 가장자리에 배치합니다. 컴퓨트 셰이더가 지형 노멀과 경사를 읽고, 경사가 임계값을 초과하는 곳에 바위 인스턴스를 분산 배치합니다. 각 인스턴스는 무작위 회전과 크기가 적용된 작은 메시(삼각형 200~500개)입니다. 인스턴싱을 사용하면 바위 10,000개를 배치해도 렌더링 비용 증가는 미미합니다.
도로와 길
크리에이터가 배치한 도로, 오솔길, 통로는 지형을 따라야 하며 표면 재질도 수정해야 합니다. 예를 들어 잔디를 흙이나 돌로 대체해야 합니다.
모든 주요 게임 엔진이 사용하는 방식은 다음과 같습니다. 경로를 스플라인, 즉 일련의 제어점으로 정의합니다. 스플라인을 지형 표면에 투영합니다. 스플라인을 따라가며 지형보다 약간 위에 놓이는 스트립 메시를 생성합니다. 스트립에 도로 텍스처를 적용합니다. 지형 셰이더에서는 투영 텍스처나 데칼을 사용해 스플라인 너비 내의 지형 재질을 도로 재질 쪽으로 블렌딩합니다.
브라우저 월드에서 크리에이터는 지형 위에 경로를 그립니다. 클라이언트는 제어점을 생성해 서버로 전송합니다(vec3 값 수십 개). 서버는 스플라인을 저장합니다. 모든 클라이언트는 스플라인을 각자의 지형 메시에 투영하여 도로 스트립을 로컬에서 렌더링합니다. 도로 데이터는 매우 작지만(경로 스플라인 점, 약 200바이트) 시각적 효과는 큽니다. 크리에이터가 만든 건축물을 연결하는 길은 월드에 실제로 누군가 살아가는 듯한 느낌을 줍니다.
지형 그림자
지형 그림자는 가독성(지형의 형태 파악)과 분위기(시간대에 따른 정서)에 매우 중요합니다. 오픈 월드에서는 태양이 보이는 전체 지형에 그림자를 드리웁니다.
캐스케이드 섀도 맵(CSM)
CSM은 뷰 프러스텀을 3~4개의 거리 범위(캐스케이드)로 나눕니다. 각 캐스케이드는 거리에 적합한 해상도로 태양 시점의 섀도 맵을 렌더링합니다. 가까운 캐스케이드는 고해상도로 나무와 건물 아래의 세밀한 그림자를 표현합니다. 먼 캐스케이드는 저해상도로 넓은 산 그림자를 표현합니다.
Three.js와 Babylon.js는 모두 CSM을 지원합니다. 지형에서 중요한 최적화는 개별 풀잎이나 작은 디테일이 아니라 지형만 섀도 맵에 렌더링하는 것입니다. 잔디는 자체 섀도 맵이 아닌 지형의 섀도 맵을 사용해 자체 음영을 표현합니다.
성능 예산: 각각 1024x1024인 섀도 캐스케이드 3~4개. 지형을 섀도 맵에 렌더링하는 데는 0.5~1ms가 걸립니다(지형 지오메트리는 이미 GPU 메모리에 있음). 지형 셰이더에서 캐스케이드 4개를 샘플링하면 0.2~0.3ms가 추가됩니다.
높이 맵 기반 지형 자체 그림자
CSM 비용이 너무 커지는 매우 넓은 지형에서는 호라이즌 맵을 미리 계산합니다. 각 지형 셀에 대해 8개 방위에서의 최대 고도각을 저장합니다. 렌더링 시 태양 각도와 호라이즌 맵을 비교하여 해당 지점이 그림자 안에 있는지 판단합니다. Skyrim은 CSM 범위 밖의 원거리 지형에 이 방식으로 자체 그림자를 처리합니다.
호라이즌 맵은 서버 측에서 높이 맵을 바탕으로 계산되며(처리 시간 수초), 청크당 128x128 텍스처(압축 시 16KB)로 스트리밍됩니다. 시각적 효과는 상당합니다. 극단적으로 먼 거리에서도 산골짜기가 사실적으로 어두워집니다.
스트리밍용 지형 데이터 압축
브라우저 월드에서는 네트워크가 병목입니다. 지형 데이터에서 단 1바이트라도 줄이면 로딩 시간이 빨라집니다.
높이 맵 압축
인접한 셀의 값이 비슷하므로 원시 16비트 높이 맵은 잘 압축됩니다. 파이프라인은 다음과 같습니다.
- 델타 인코딩: 각 셀과 예측값(이웃 값의 평균)의 차이를 저장합니다. 델타 값은 작고 0 근처에 집중됩니다.
- 양자화: 먼 청크에서는 정밀도를 16비트에서 12비트 또는 8비트로 줄입니다. 500m 거리에서는 100m 높이 범위에서 0.4m 해상도인 8비트 높이 정밀도와 16비트 정밀도를 구별할 수 없습니다.
- 엔트로피 코딩: 델타 인코딩된 스트림에 zlib 또는 brotli 압축을 적용합니다. 일반적인 압축률은 4~8배입니다.
결과적으로 65x65 크기의 16비트 청크는 원시 데이터 8.4KB에서 압축 후 1~2KB로 줄어듭니다. 8비트로 정밀도를 낮추면 0.5~1KB입니다.
점진적 높이 맵 스트리밍
먼저 낮은 해상도의 지형을 전송한 다음 점진적으로 세분화합니다. 17x17 높이 맵(셀 간격 4m인 64m 청크의 최소 크기)은 원시 데이터로 578바이트이며, 압축하면 200바이트 미만입니다. 지형이 즉시 표시됩니다. 그런 다음 33x33 세분화 데이터(홀수 행/열 샘플 추가)를 스트리밍하고, 이어서 전체 해상도인 65x65 데이터를 전송합니다. 각 단계는 이전 데이터를 교체하지 않고 디테일을 추가합니다.
이는 지오메트리 클립맵의 LOD 링과 대응합니다. 먼 지형은 저해상도 버전(17x17), 중간 거리 지형은 중간 해상도(33x33), 근접 지형은 전체 해상도(65x65)를 사용합니다. 스트리밍 우선순위는 렌더링 LOD와 일치합니다.
SDF 볼륨 압축
대부분의 복셀이 표면에서 멀리 떨어진 빈 공간이므로 희소 SDF 볼륨은 매우 높은 비율로 압축됩니다. 사용할 수 있는 방식은 다음과 같습니다.
런 길이 인코딩: 동일한 값이 연속되는 구간(빈 복셀)을 인코딩합니다. 일반적인 SDF 볼륨은 95% 이상이 비어 있으므로 RLE로 10~50배 압축할 수 있습니다.
희소 옥트리: 표면과 교차하는 복셀을 포함한 옥트리 노드만 저장합니다. 빈 공간에는 노드가 없습니다. 동굴 터널 하나가 있는 64^3 SDF 볼륨에는 점유 노드가 2,000~5,000개뿐일 수 있으며(전체 복셀은 262,144개), 각 노드는 1~2바이트로 저장됩니다.
엔트로피 기반 점진적 압축(2024, HAL)은 엔트로피에 최적화된 평면과 적응형 양자화를 사용해 공간을 재귀적으로 분할함으로써 3D 공간 데이터에 적용됩니다. 이 방식은 율-왜곡 절충에 최적화된 세분화 스트림을 생성하며, 특히 네트워크 스트리밍의 낮은 비트레이트에서 유용합니다.
전체 구성: 브라우저 지형 파이프라인
이 글의 맨 위에 있는 전략적 개요에서는 빠른 의사결정 프레임워크와 단계별 구축 계획을 제시합니다. 이 섹션에서는 서버 측 생성 파이프라인과 브라우저 렌더링 파이프라인 모두에 대한 전체 기술 세부 사항을 제공합니다.
생성 파이프라인(서버 측)
생성 파이프라인은 Gaea와 World Machine의 노드 그래프 방식에서 영감을 얻은 물리 프로세스의 방향성 그래프로 실행됩니다. 각 단계는 이전 단계의 출력을 받아 세분화합니다. 크리에이터는 각 단계의 매개변수를 제어할 수 있습니다.
| 단계 | 입력 | 프로세스 | 출력 | 시간 |
|---|---|---|---|---|
| 1. 기본 지형 | 시드 또는 텍스트 프롬프트 | Terrain Diffusion / MESA / 노이즈 + fBm | 16비트 높이 맵 | 1~5초 |
| 2. 침식 | 높이 맵 | 해석적 하천력 + 열 침식 | 침식된 높이 맵, 유량 누적 맵, 퇴적물 맵 | 0.5~2초 |
| 3. 강 | 침식된 높이 맵, 흐름 맵 | 배수망 추출, 수로 조각 | 강 스플라인, 수위 맵 | 0.5초 |
| 4. 해안 | 해수면 근처의 높이 맵 | NEWTS 방식의 파랑 침식 | 해안 지형 요소(절벽, 해변, 해식 기둥) | 1~3초 |
| 5. 볼류메트릭 | 높이 맵 + 크리에이터 의도 | Arenite 침식 / 동굴 생성 / SDF 조형 | 영향을 받는 청크의 희소 SDF 볼륨 | 1~60초 |
| 6. 재질 | 높이 맵 + 침식 맵 | TerraFusion / Geodiffussr / 절차적 규칙 | 스플랫 맵, 지형 텍스처 | 1~5초 |
| 7. 식생 | 높이 맵 + 흐름 맵 + 재질 | 생태계 경쟁 시뮬레이션 | 청크별 생물군계 밀도 맵 | 1~3초 |
| 8. 호라이즌 맵 | 최종 높이 맵 | 8방향 최대 고도각 | 청크별 자체 그림자 텍스처 | 2~5초 |
| 9. 청크 분할 | 모든 출력 | 분할, 델타 인코딩, 압축, 해싱 | CDN의 청크 패키지 | 5~10초 |
| 합계 | 15~90초 |
새로운 4x4km 월드는 15~90초 안에 생성됩니다. 크리에이터 편집 작업(조형, 매개변수 변경)은 영향을 받는 청크에 대해 관련 단계만 다시 실행하며, 일반적으로 5초 이내에 완료됩니다.
렌더링 파이프라인(브라우저)
| 단계 | WebGPU 경로 | WebGL 2 폴백 | 프레임 예산 |
|---|---|---|---|
| 1. 스트리밍 | 우선순위 큐, 예측형 프리페치 | 동일 | 해당 없음(비동기) |
| 2. 높이 맵 지형 | GPU 구동 CDLOD 쿼드트리, 컴퓨트 컬링, 간접 드로 | 지오메트리 클립맵, CPU 링 업데이트 | 0.5~1ms |
| 3. 볼류메트릭 메시 | 컴퓨트 마칭 큐브 + Transvoxel | Web Worker에서 미리 생성한 메시, 캐시된 LOD 2~3개 | 0.5~2ms |
| 4. LOD 전환 | 버텍스 셰이더의 지오모핑 | 동일 | 위 항목에 포함 |
| 5. 재질 | 트라이플래너 PBR + 라플라시안 블렌딩 + 페이저 노이즈 디테일 + 가상 텍스처링 | 트라이플래너 PBR + 선형 블렌딩 + 사전 베이크된 스플랫 맵 | 1~1.5ms |
| 6. 식생 | ComputeInstanceCulling + IndirectBatchedMesh, 육각 타일식 지표 피복 | CPU 프러스텀 컬링 + InstancedMesh | 1~1.5ms |
| 7. 물 | 흐름 정렬형 강 스트립, 수심 기반 해안 거품 | 동일(더 단순한 반사) | 0.5ms |
| 8. 그림자 | 3~4단계 CSM + 호라이즌 맵 자체 그림자 | 2단계 CSM | 0.5~1ms |
| 9. 대기 | Hillaire 하늘 모델 + 볼류메트릭 안개 + 기상 파티클 | Preetham 하늘 + 거리 안개 | 0.5ms |
| 10. 동적 효과 | 웅덩이 축적, 발자국 변형, 눈/비 | 웅덩이 축적, 빗방울 파티클 | 0.3ms |
| 전체 지형 | 3.5~6.5ms |
60fps(프레임당 16.6ms)에서 지형 시스템은 WebGPU 프레임 예산의 21%, WebGL 2 프레임 예산의 39%를 사용합니다. 나머지는 플레이어 아바타, 크리에이터 오브젝트, UI, 네트워킹, 포스트 프로세싱에 사용할 수 있습니다.
브라우저에서 작동하는 이유
전체 파이프라인은 브라우저의 세 가지 제약을 중심으로 설계되었습니다.
메모리(최대 2~4GB): 높이 맵 청크는 각각 2~8KB(델타 인코딩), SDF 볼륨은 희소 구조(볼류메트릭 청크당 100~500KB), 식생은 1KB 밀도 맵으로부터 런타임에 생성되며, 텍스처는 KTX2 압축(1024x1024당 150KB)을 사용하므로 256MB의 지형 예산 안에 들어갑니다. 어느 시점이든 브라우저에 표시되는 월드의 전체 용량은 50~200MB입니다.
디스크 접근 불가: 모든 데이터는 네트워크를 통해 스트리밍됩니다. 점진적 로딩 덕분에 플레이어는 100ms 이내에 지형(저해상도 높이 맵), 300ms 이내에 텍스처가 적용된 지형, 3초 이내에 전체 디테일을 볼 수 있습니다. 속도 기반 프리페치는 일반적인 탐험 중 로딩 시간을 감춰 줍니다.
GPU 성능 편차가 큼: WebGPU 경로는 고성능 데스크톱을 처리합니다. WebGL 2 폴백은 모바일을 포함한 나머지 모든 기기를 지원합니다. 같은 청크 데이터가 두 경로 모두를 구동합니다. 차이는 데이터 형식이 아니라 렌더링 기법입니다. WebGL 2를 실행하는 Chromebook도 WebGPU를 실행하는 RTX 4090과 같은 월드를 볼 수 있으며, 단지 디테일 수준과 가시거리만 낮습니다.
연구 논문
지형 표현 및 메시 생성
"마칭 큐브: 고해상도 3D 표면 구성 알고리즘" -- Lorensen과 Cline(SIGGRAPH 1987). DOI. 볼류메트릭 데이터에서 삼각형 메시를 추출하는 기초 알고리즘입니다. 38년이 지난 지금도 가장 널리 사용되는 등가면 추출 방식입니다. GPU 병렬 구현은 WebGPU 컴퓨트 셰이더에서 실시간으로 실행됩니다. "허마이트 데이터의 듀얼 컨투어링" -- Ju, Losasso, Schaefer, Warren (SIGGRAPH 2002). DOI. 마칭 큐브가 둥글게 만드는 날카로운 특징(절벽 모서리, 바위 모서리)을 보존하는 메시를 생성합니다. 거리 값 외에 표면 노멀이 필요합니다.
"신경망 듀얼 컨투어링" -- Chen et al. (2022). arXiv:2202.01999. 듀얼 컨투어링의 최소제곱 정점 배치를 학습된 예측기로 대체합니다. 복잡한 자연 지형에서 더 나은 표면 품질을 제공합니다.
"트랜스복셀 알고리즘" -- Lengyel (2009, 2024년 업데이트). transvoxel.org. 복셀 지형을 위한 매끄러운 LOD 전환 기법입니다. 73가지 전환 셀 유형을 사용해 해상도 경계의 균열을 제거합니다. 특허 제약이 없으며 실시간 애플리케이션용으로 설계되었습니다.
지형 LOD 및 렌더링
"지오메트리 클립맵: 중첩된 정규 그리드를 이용한 지형 렌더링" -- Losasso and Hoppe (SIGGRAPH 2004). 논문. 동심원 형태의 LOD 링으로 일정한 비용의 지형 렌더링을 구현합니다. 40GB 규모의 지형을 인터랙티브한 속도로 처리합니다. 대부분의 브라우저 지형 렌더러가 기반으로 삼는 기술입니다.
"CDLOD: 지형 렌더링을 위한 하이브리드 LOD" -- Strugar (2014). 논문. 지오메트리 클립맵을 쿼드트리 적응형으로 개선한 기법입니다. 거리만이 아니라 지형 복잡도에 따라 해상도를 할당합니다.
"GPU 주도 렌더링 파이프라인" -- Ubisoft (SIGGRAPH 2015), Wihlidal and Hoppe. 컴퓨트 셰이더가 컬링, LOD 선택, 드로 콜 생성을 처리하는 GPU 주도 방식을 정립했습니다. 이 WebGPU 지형 파이프라인의 아키텍처 패턴입니다.
물리 기반 지형 생성
"빠른 지형 생성을 위한 물리 기반 해석적 침식" -- Cordonnier et al. (2024). HAL. 반복 시뮬레이션을 피하는 해석적 유수력 법칙 침식 기법입니다. 물리적으로 그럴듯한 지형을 밀리초 단위로 생성합니다.
"GPU에서의 고속 수력 침식 시뮬레이션 및 시각화" -- Mei, Decaudin, Hu (2007). HAL. 천수 시뮬레이션을 사용하는 GPU 병렬 수력 침식 기법입니다. 대부분의 게임 엔진 침식 구현이 기반으로 삼는 기술입니다.
"Arenite: 물리 기반 사암 시뮬레이터" -- SIGGRAPH 2025. 프로젝트. 응력 및 침식 시뮬레이션을 통해 아치, 후두, 암벽 오목 지형을 생성하는 다중 물리 침식 기법입니다. 데스크톱 GPU에서 5분 이내에 실행됩니다.
"가파른 지형 침식을 위한 효율적인 토석류 시뮬레이션" -- Purdue CGVLAB (2024). 논문. 사실적인 산악 지형 특징을 생성하는 GPU 가속 토석류 및 급경사 침식 기법입니다.
"유연한 지형 침식" -- IRIT-STORM (2024). Springer. 통합 인터페이스를 통해 하이트필드, 복셀 그리드, 암시적 표면, 레이어형 재질 전반에서 작동하는 파티클 기반 침식 기법입니다. 하이브리드 지형 표현에 하나의 침식 시스템을 사용할 수 있습니다.
지형 디테일 및 텍스처링
"GPU 친화적 라플라시안 텍스처 블렌딩" -- Wronski (NVIDIA, 2025). JCGT. 사전 계산 없이 지형 재질에 적용할 수 있는 실시간 라플라시안 피라미드 블렌딩 기법입니다. 날카로운 특징을 보존하면서 이음새 아티팩트를 제거합니다. 프래그먼트당 몇 번의 텍스처 샘플링만 추가됩니다.
"제어 가능한 절차적 패턴을 이용한 실시간 지형 향상" -- Grenier et al. (2024). CGF. 하이트맵 해상도의 최대 32배로 미세 침식 디테일을 생성하는 페이저 노이즈 기반 기법입니다. 경사면에 정렬된 패턴이 전적으로 프래그먼트 셰이더에서 실행됩니다.
적응형 테셀레이션
"대규모 게임 구성 요소를 위한 동시성 이진 트리" -- Benyoub and Dupuy (Intel, HPG 2024). 논문. 적응형 지형 테셀레이션을 위한 GPU 친화적 이진 트리 자료 구조입니다. 행성 규모의 지오메트리를 0.2ms 미만으로 렌더링합니다. 정사각형 도메인에서 임의의 폴리곤 메시로 확장되었습니다.
동굴 및 지하 생성
"PLUME: 절차적 레이어 기반 지하 모델링 엔진" -- 2024. arXiv:2508.20926. 레이어형 절차 규칙을 사용해 사실적인 동굴 및 용암 동굴 환경을 생성하는 오픈 소스 프레임워크입니다. 원래 우주 탐사 로봇을 위해 개발되었습니다.
신경망 지형 합성
"InfiniteDiffusion: 오픈 월드 지형 생성을 위한 학습 기반 사실성과 절차적 활용성의 결합" -- Goslin (2025, SIGGRAPH 2026). arXiv:2512.08309. 라플라시안 인코딩을 적용한 계층형 확산 모델을 사용해 무한하고 시드 일관성이 있는 지형을 생성합니다. 소비자용 GPU에서 기준 모델보다 9배 빠릅니다.
"TerraFusion: 지형 지오메트리와 텍스처의 공동 생성" -- 2025. arXiv:2505.04050. 스케치 조건화를 사용해 하이트맵과 텍스처를 동시에 합성하는 잠재 확산 기법입니다.
"MESA: 텍스트 기반 지형 생성" -- CVPR 2025 Workshop. arXiv:2504.07210. Copernicus 원격 감지 학습 데이터를 사용하는 텍스트-지형 생성 기법입니다.
"Geodiffussr: 고도 충실도를 갖춘 생성형 지형 텍스처링" -- 2025. arXiv:2511.23029. 플로 매칭을 사용해 고도 데이터를 준수하는 텍스트 유도형 지형 텍스처 생성 기법입니다.
"Sketch2Terrain: AI 기반 실시간 지형 스케치 매핑" -- 2025. 프로젝트. 증강 현실에서 스케치를 지형으로 변환합니다. 수동 매핑보다 효율성이 38% 향상되었습니다.
식생 및 생태계 시뮬레이션
"대규모 가상 지형에서 GPU 기반 실시간 절차적 식생 분포" -- SBGames 2018. 논문. GPU에서 생물적·비생물적 요인을 활용하는 쿼드트리 기반 식생 배치 기법입니다.
"숲의 절차적 생성 및 렌더링" -- 2022. 논문. 사실적인 숲 분포를 위해 L-시스템 나무 생성과 생태계 경쟁 시뮬레이션을 결합합니다.
"GPU 워크 그래프를 이용한 실시간 절차적 생성" -- AMD GPUOpen 2024. 논문. GPU 워크 그래프로 79,000개 이상의 식생 인스턴스를 4ms 이내에 생성합니다.
브라우저 GPU 기술
"GSWT 렌더러" -- SIGGRAPH Asia 2025. GitHub. 가우시안 스플래팅 왕 타일을 사용해 동적 LOD와 스트리밍을 지원하는 무한 3D 지형을 구현한 WebGPU + Rust/Wasm 렌더러입니다.
"네이티브 속도로 실행되는 브라우저 GPU 컴퓨팅: WebGPU 마칭 큐브" -- Usher (2024). 블로그. 병렬 메시 생성 알고리즘에서 WebGPU 컴퓨트가 네이티브 수준의 성능을 달성함을 보여줍니다.
복셀 렌더링 및 대규모 장면
"Aokana: 오픈 월드 게임을 위한 GPU 주도 복셀 렌더링 프레임워크" -- 2025. arXiv:2505.02017. 수백억 개의 복셀로 이루어진 장면을 위해 LOD와 스트리밍을 지원하는 희소 복셀 DAG입니다. 기존 최첨단 기술보다 메모리 사용량을 9배 줄이고 렌더링 속도를 4.8배 높입니다. 게임 엔진과의 통합을 염두에 두고 설계되었습니다.
절차적 지오메트리 및 표면 재구성
"GPU 메시 셰이더를 이용한 실시간 절차적 표면 재구성" -- Raad et al. (Eurographics 2025). 논문. 메시 셰이더를 사용해 렌더링 시점에 저해상도 제어 메시로부터 상세한 지오메트리 표면을 생성합니다. 고해상도 지오메트리를 메모리에 저장하지 않고도 동적 LOD를 구현할 수 있습니다.
지형 그림자
"지형 그림자 최적화" -- AMD GPUOpen. 블로그. 대규모 지형을 위한 실용적인 CSM 최적화 기법입니다. 캐스케이드 분할, GPU 효율적인 섀도 맵 렌더링, 지형별 최적화를 다룹니다.
가상 지오메트리 및 메시 최적화
"Nanite WebGPU" -- Scthe (2024). GitHub, 데모. UE5 Nanite 아키텍처를 브라우저에서 완전하게 구현했습니다. 메시렛 LOD 계층 구조, WGSL 소프트웨어 래스터라이저, 메시렛별 컬링, 빌보드 임포스터를 포함합니다.
"몇 분 만에 수십억 개의 삼각형 처리하기" -- Kapoulkine (2025). 블로그. 계층형 클러스터 LOD 생성을 위한 Meshoptimizer v1.0입니다. 대규모 메시를 Nanite 스타일의 클러스터 DAG로 효율적으로 처리합니다.
"빌보드 스플래팅(BBSplat)" -- 2024. arXiv:2411.08508. 새로운 시점 합성을 위한 학습 가능한 텍스처 평면 프리미티브로, 3D 가우시안 스플래팅 대비 17배의 압축률을 달성합니다.
지형 조명 및 전역 조명
"Once Human의 전역 조명" -- GDC 2025. 세션. 16km 오픈 월드를 위한 하이브리드 GI 기술입니다. 신경망 압축 프로브(69:1 비율), ML 기반 실내외 빛샘 해결, 동적 프로브 반응을 포함합니다.
"AMD FidelityFX Brixelizer를 이용한 GI" -- GDC 2024. 논문. 스크린 공간 프로브를 사용하는 컴퓨트 기반 희소 거리 필드 캐스케이드입니다. 하드웨어 레이 트레이싱이 필요하지 않습니다.
"래디언스 캐스케이드" -- 2024. 블로그. 시간적 누적 없이 계단식 복사 구조를 사용해 노이즈 없는 실시간 전역 조명을 구현합니다.
레벨 디자인 및 탐험
"PlotMap: 게임 월드 구축을 위한 자동 레이아웃 설계" -- 2023. arXiv:2309.15242. 지형에서 내러티브의 공간적 제약 조건을 충족하는 AI 보조 POI 배치 기법입니다.
"공간 탐험 트리거" -- Purdue University (FDG 2022). 논문. 플레이어의 탐험을 유도하는 네 가지 디자인 패턴인 극점, 시야 방해물, 주변과 어울리지 않는 물체, 공간적 연결을 다룹니다.
데이터 압축 및 스트리밍
"엔트로피 기반 3D 포인트 클라우드 점진적 압축" -- SGP 2024. 논문. 적응형 양자화를 적용한 재귀적 공간 분할을 사용해 율-왜곡을 최적화하는 점진적 압축 기법입니다. 가변 대역폭 네트워크 스트리밍에 적합한 점진적 정밀화 스트림을 생성합니다.
인터랙티브 편집
"WebGPU SDF 편집기" -- Nijhoff (2026). 프로젝트. 실시간 마칭 큐브, 불리언 연산, 부드러운 블렌딩, 옥트리 공간 분할을 갖춘 브라우저용 완전한 SDF 모델링 도구입니다. 프리미티브당 112바이트를 사용합니다.
강 및 해안 생성
"절차적 하천 유역" -- Patel (Red Blob Games). 프로젝트. 보로노이/삼각형 메시의 에지 분류를 사용하는 배수 우선 하천 생성 기법입니다. 지형 고도를 할당하기 전에 하천 계층 구조를 구축합니다.
"NEWTS1.0: 파도와 전진하는 해안 절벽에 의한 해안 침식 수치 모델" -- MIT (2024). 논문. 균일 후퇴와 파도에 의한 침식을 사용하는 간소화된 해안 침식 모델입니다. 실제 지형학과 일치하는 곶, 만, 해식 기둥, 아치를 생성합니다.
더 읽어보기
- 브라우저 3D 오픈 월드 기술에서는 브라우저용 멀티플레이어 크리에이터 월드의 전체 아키텍처를 다룹니다
- 2026년 웹 게임 기술 스택에서는 WebGL, WebGPU, WebAssembly의 기초를 다룹니다
- Three.js + USDC 기술 보고서에서는 브라우저에서 3D 에셋을 불러오는 방법을 다룹니다
- 최전선 오픈 소스 생성형 AI 모델에서는 AI 생성 파이프라인을 다룹니다
- WebGPU 시작하기 — GPU 주도 지형을 위한 컴퓨트 셰이더
- 게임 로직을 위한 Web Worker — 지형 생성을 Worker로 오프로딩하기
- 게임 물리 라이브러리 — 지형 상호작용 및 하이트필드 콜라이더를 위한 물리
- 무료 게임 에셋을 찾을 수 있는 곳 — 지형 렌더링을 위한 텍스처 및 재질 소스




