티스토리 뷰
[Graphics] 복셀 마칭큐브와 Mesh Terrain - 1
[Graphics] 복셀 마칭큐브와 Mesh Terrain - 2
[Graphics] 복셀 마칭큐브와 Mesh Terrain - 3
Ch4. 케이스 스터디 — UE 5.8 MeshTerrainMode / MeshPartition에서 마칭큐브가 호출되는 자리
지금까지 본 추상적 절차 — 8비트 인덱스 → 두 장의 테이블 → 보간 → 모호성 처리 — 가 실제 게임 엔진의 한 줄 코드로 응결되는 자리를 보면 알고리즘 이해가 마무리된다. UE 5.8에 새로 들어온 두 플러그인, MeshTerrainMode와 MeshPartition이 그 자리다. 이 챕터는 그 둘이 무엇이고, "두 절벽 붙이기" 인터랙션이 어떻게 복셀화 + 마칭큐브 + 협대역 SDF로 풀리는지를 따라간다. 검증 소스는 원본 블로그 글(https://develop-4-art.tistory.com/169)과 UE 5.8 릴리스 노트, Epic 공식 문서다(로컬 UE 소스가 5.6이므로 클래스 수준의 직접 확인은 외부 문서에 의존한다).
두 플러그인의 역할 분담
UE 5.8의 메시 기반 지형 시스템은 두 개의 분리된 플러그인이 짝을 이루는 구조다.
• `MeshTerrainMode` — 에디터 모드 플러그인. 지형 생성·편집·스컬프팅 같은 작업의 UI/도구 레이어를 담당한다. 6개의 서브모드(Create / Edit / Sculpt 등 — 디테일은 [지난 글](https://develop-4-art.tistory.com/169) 참조)가 이 안에 들어있고, 각 서브모드가 내부적으로 MeshPartition의 메시 데이터를 갱신한다.
• `MeshPartition` — 런타임 + 에디터 양쪽에서 살아 있는 데이터 레이어. 월드를 청크로 자르고, 각 청크의 메시(=FDynamicMesh3 삼각형 집합)와 (필요할 때) 협대역 SDF를 들고 있다. 런타임에는 그냥 정적 메시처럼 동작하고, 에디터에서만 편집 가능한 상태가 된다.
기존의 Landscape 시스템이 하이트맵 텍스처를 GPU에서 매 프레임 셰이더로 변위시키는 구조였다면, 새 메시 테레인은 데이터가 처음부터 진짜 삼각형이다. 하이트맵은 일회성 임포트 포맷으로만 쓰이고, 임포트가 끝나면 결과는 FDynamicMesh3 메시로 변환돼 MeshPartition에 박힌다. 그 이후 모든 편집 — 끌어올리기, 깎기, 절벽 두 개 합치기 — 은 모두 메시 위에서 직접 일어난다.
"두 절벽 붙이기" — MC가 호출되는 정확한 자리
이 글의 본 주제와 직결되는 자리가 바로 여기다. 사용자가 에디터에서 절벽 두 개를 가까이 가져가서 "합쳐라"라고 명령하는 순간, 다음 단계가 차례로 일어난다.

[IMAGE 15 — UE5.8 메시 테레인 "두 절벽 합치기" 파이프라인 (SVG): 박스 다이어그램 — Input(두 FDynamicMesh3) → ① Voxelization (좁은 영역만) → ② Narrow-band SDF → ③ **Marching Cubes** → ④ 결과 FDynamicMesh3 → MeshPartition 갱신. 화살표 + 단계 라벨.]
1. 선택 영역 추출. 두 절벽 메시 중 합쳐질 부근(예: 한 청크 또는 사용자가 지정한 박스)만 잘라낸다.
2. 복셀화(voxelization). 그 좁은 영역만 N³ 격자(보통 해상도가 청크 단위 한정으로 작게 잡힘)로 샘플링한다. 두 메시의 표면에서 부호 있는 거리를 평가해서 각 격자 점에 SDF 값을 채운다.
3. 협대역 SDF(narrow-band SDF) 구축. 표면 근처의 좁은 띠 안쪽만 정확한 SDF 값을 들고 있고, 그 바깥은 "충분히 멀다"로 잘라낸다. 메모리·계산 양쪽에서 보수적이고, 우리 목적엔 표면 근처 값만 있으면 충분하다.
4. 마칭큐브. 그 SDF 격자를 입력으로 iso = 0 등치면을 추출한다. Ch3에서 본 그 절차 — 큐브 인덱스 → 엣지 테이블 → 보간 → 삼각형 테이블 → 정점 등록 — 이 격자 한 칸씩 행진하며 도장 찍힌다. 출력은 새 FDynamicMesh3 삼각형들이다.
5. `MeshPartition` 갱신. 결과 메시가 두 원본 메시의 자리를 교체하고, BVH/충돌 메시가 재구축된다.
핵심은 MC 호출이 통째로 에디터 안에서 일어난다는 점이다. 한 번 베이크된 결과는 그 이후 런타임에서는 그냥 정적 메시로 보인다. 사용자가 다시 편집 모드에 들어가서 같은 영역을 또 만지지 않는 한 마칭큐브가 다시 돌 일은 없다.
왜 에디터 전용인가
런타임 동적 편집이 안 되는 이유는 마칭큐브 자체의 비용보다도 후속 비용에 있다.
• 새 메시를 만든 다음 충돌 메시(BVH/PhysX/Chaos 등)를 재구축해야 한다. 청크 단위라도 ms 단위로 떨어진다.
• LOD 메시(원본 외에 단순화된 메시 여러 단계)를 재계산해야 한다.
• GPU 리소스(정점 버퍼, 인덱스 버퍼)를 업로드해야 한다 — 메인 스레드를 잡으면 프레임 드랍.
• 정적 라이팅이 미리 베이크돼 있던 경우 그 라이팅이 무효화된다.
이 누적 비용 때문에 UE 5.8은 첫 출시 단계에서 MC 베이크를 에디터 전용으로 못 박았다. 알고리즘 자체는 청크 단위 GPU 컴퓨트로 런타임에서도 충분히 돌릴 수 있다 — 사실 Voxel Tools, Voxel Farm 같은 서드파티는 이미 그렇게 한다. UE 5.8의 결정은 "런타임이 안 된다"가 아니라 "런타임 동적 편집의 후속 비용을 첫 출시에서 책임지지 않는다"에 가깝다.
협대역 SDF가 등장한 이유 — Ch3의 모호성 케이스와 연결
Ch3에서 모호성 케이스(6/10/12/13)를 다룰 때 "위상이 약간 거짓말을 해도 시각적으로 큰 문제가 안 되는 자리에서는 그냥 15케이스 표를 쓰고 모호성을 무시한다"고 했는데, 사실 모호성을 거의 발생시키지 않는 입력을 미리 만드는 길도 있다. 그 길이 바로 협대역 SDF로 입력을 정규화하는 것이다.
협대역 SDF는 표면 근처에서 부드럽고 단조롭게 변하는 부호 있는 거리 함수다. 이런 입력에서는 한 큐브 안에서 안/밖 비트가 대각선으로 갈리는 패턴 — 즉 6/10/12/13 같은 모호성 케이스 — 자체가 거의 발생하지 않는다. SDF의 단조성이 큐브 안의 위상을 미리 정리해주는 셈이다.

[IMAGE 16 — 두 절벽 메시가 마칭큐브로 매끄럽게 융합되는 컷 (nanobanana 일러스트): 두 거친 절벽 사이의 좁은 협곡이 부드러운 곡면으로 이어지는 비유 컷. 정확 데이터 아님.]
즉 UE 5.8의 파이프라인은 마칭큐브를 모호성이 거의 없는 입력에서만 호출하도록 설계되어 있다. 입력을 협대역 SDF로 정규화하는 한 단계를 앞에 두는 것으로, MC 자체는 단순한 15케이스 표만으로도 충분히 안전하게 동작한다. 알고리즘과 입력의 책임을 깔끔하게 분리한 디자인이다.
좁은 영역만 베이크하는 이유
엔진 입장에서는 두 절벽 청크 전체를 다시 베이크할 수도 있지만, 그러면 사용자가 만진 적도 없는 자리까지 메시가 재구성되고 정점 ID가 바뀌어버린다. 머티리얼 페인팅, 식생 인스턴스 같은 attachment가 끊긴다. 그래서 메시 테레인은 편집이 영향을 미치는 좁은 박스만 잘라서 베이크하고, 결과 메시를 원본 메시의 해당 영역에만 patch-in 한다. 협대역 SDF가 "협대역"인 이유도 같다 — 표면 근처 좁은 띠만 정확히 들고 있으면 충분하기 때문에 메모리도, 베이크 시간도 박스 부피에 비례한다.
이 좁은 박스 베이크는 사실 GPU 컴퓨트로 옮기기 매우 좋은 워크로드다. 박스가 작으니 한 컴퓨트 디스패치로 충분히 들어가고, 격자 한 칸당 한 스레드 → atomic이 거의 필요 없는 두 패스 구조 → 결과는 작은 정점 버퍼 한 묶음. UE 5.8 첫 출시에서는 CPU 베이크로 깔린 듯하지만, 후속 릴리스에서 GPU 베이크로 내려갈 가능성이 가장 높은 자리다 — 알고리즘 자체가 그렇게 설계되어 있고, MC 가족 30년 노하우가 이미 GPU 구현을 충분히 다듬어 두었다.
실전 — 한 번 직접 만져보면 보이는 것
알고리즘 글이 가장 빨리 흡수되는 자리는 결국 자기 손으로 한 번 만져본 다음이다. UE 5.8을 설치할 수 있다면 다음 짧은 시나리오로 마칭큐브가 호출되는 순간을 직접 확인할 수 있다.
1. 새 레벨에 Mesh Terrain 추가. 에디터 모드 패널에서 MeshTerrainMode를 켠 다음 Create 서브모드로 작은 패치 두 개를 만든다. 절벽처럼 가파른 경사가 좋다.
2. 두 패치를 가까이. 두 절벽이 서로 마주 보도록 위치를 조정한다. 이 시점까지는 마칭큐브가 호출되지 않는다 — 그냥 두 개의 독립 FDynamicMesh3다.
3. Edit 또는 Sculpt 서브모드로 합치기. 두 절벽 사이에 브러시로 채우거나 "merge" 작업을 트리거한다. 이 순간 에디터가 "Baking…" 표시를 잠깐 띄울 텐데, 그 짧은 시간 안에 복셀화 + 협대역 SDF + 마칭큐브 + 메시 재구성이 차례로 일어난다.
4. 결과 메시 확인. 와이어프레임 모드로 보면 합쳐진 영역의 삼각형 토폴로지가 원본 절벽 두 개와 완전히 다른 — 마칭큐브 특유의 격자-aligned 삼각형 — 으로 바뀐 게 보인다. 격자 해상도(에디터 설정에서 조절 가능)를 올리면 더 부드러운 곡면이 나오고, 내리면 격자 흔적이 더 도드라진다.
5. 언두/리두. 합치기 결과는 한 번의 베이크 결과이므로 undo로 되돌릴 수 있다. 마칭큐브 호출은 비결정적이지 않으니(같은 입력 → 같은 출력) 같은 자리를 여러 번 만져도 결과가 떨리지 않는다.
이 한 시나리오를 한 번 돌려보고 와이어프레임을 한 번 확인하고 나면, Ch2-3의 모든 추상 절차가 "내가 방금 본 그 격자 위의 그 삼각형들"로 머릿속에 박힌다.
정리 — 이 글이 끝나는 자리
이 글은 마칭큐브의 핵심 — 8비트 인덱스, 두 장의 테이블, 보간, 모호성, 비교, 성능 — 을 한 번에 풀고, 그게 UE 5.8 메시 테레인의 한 자리에 어떻게 박혀 있는지까지 따라왔다. 처음 읽었을 때 한 줄로 지나친 "복셀화 + 마칭큐브 + 협대역 SDF" 표현이, 이제는 왜 그 세 단계의 순서로 묶여 있고, 왜 에디터 전용인지가 보일 것이다.
남은 자리는 두 군데다.
• 런타임 동적 편집. 후속 비용을 엔진이 흡수하기 시작하면 마칭큐브가 런타임으로 내려올 수 있다. UE 5.x의 향후 릴리스를 기다리거나, Voxel Tools / Voxel Farm 류의 서드파티로 우회하면 된다.
• 날카로운 모서리. MC는 항상 부드러운 메시를 뽑으니, 날카로운 모서리가 필요한 자리는 Dual Contouring 또는 그 변종(Manifold DC, Cubical MC)이 더 적합하다. 마찬가지로 서드파티 영역이거나, 직접 구현해야 하는 자리다.
마칭큐브는 1987년 논문 한 편으로 시작해서 30년 넘게 표준 자리를 지킨, 흔치 않은 사례의 알고리즘이다. 단순한 룩업 두 번이 정말로 메시를 토해낸다는 사실 — 그 단순함이 모든 후속 변종이 결국 돌아오는 기준점을 만들었다. 다음에 어디서든 등치면 추출이라는 단어를 만나면, 그 자리는 거의 항상 마칭큐브거나 그 가족이다. 그리고 이제 그 자리를 다시 만났을 때, 한 큐브 안에서 무엇이 일어나는지가 한 번에 떠오를 것이다.
- Total
- Today
- Yesterday
- 정리
- 법선
- 모션블러
- 소프트웨어공학
- 소공
- unity
- 블러효과
- HLSL
- Voxel
- 컴퓨터네트워크
- ImageEffect
- designer
- 인하대
- ue4
- 유니티 셰이더
- 컴네
- 이종식
- 노영태
- 컴퓨터구조론
- Substance Designer
- Substance
- #Shader #셰이더 #Tessellator #눈발자국 #발자국
- normal
- MotionBlur
- 유니티
- Graphics
- shader
- 이미지이펙트
- Unreal
- 네트워크
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |