티스토리 뷰
0. 핵심 요약
UE 5.8-Preview는 두 개의 신규 Experimental 플러그인을 통해 "Mesh Terrain" 시스템을 도입했다:
에디터 모드를 제공하는 `MeshTerrainMode`와 런타임 데이터/스트리밍을 담당하는 `MeshPartition`. 두 플러그인 모두 5.7.4에는 존재하지 않는다.
핵심 결론:
Mesh Terrain은 Landscape처럼 영구적인 2D 하이트맵을 저장하지 않는다.
하이트맵은 일회성 임포트 포맷일 뿐이며, 임포트 직후 `FDynamicMesh3` 삼각형 메시로 변환된다. 이 덕분에 오버행/동굴/분기 토폴로지가 가능하다.
두 절벽 메시를 하나로 합치는 작업은 가능하다 — 단, 에디터 타임 한정으로 복셀화(Voxelization) 기반 CSG 도구 `FVoxelBooleanMeshesOp` / `FVoxelMergeMeshesOp`를 통해 수행된다.
내부적으로 마칭 큐브(MarchingCubes)와 협대역(Narrowband) SDF가 사용된다.
패키지된 런타임에서는 복셀/SDF 저장소가 없으며, 베이크된 `FMeshData` 삼각형 메시만 유통된다.
1. 플러그인 구성
1.1 두 개의 신규 플러그인
| 플러그인 | 역할 | 모듈 수 | 런타임/에디터 |
| MeshTerrainMode | Mesh Partition 편집을 위한 인터랙티브 툴 모음 | 1 (Editor) | 에디터 전용 |
| MeshPartition | 런타임 데이터 + 스트리밍 + 에디터 워크플로 | 5 (Runtime 2 + Editor 3) | 혼합 |
MeshTerrainMode 매니페스트 요약
결론적으로 아직 Experimental이며, 기본적으로 활성화되지 않습니다.
- FriendlyName: "Mesh Terrain Mode"
- Category: "Mesh Partition"
- Description: "Mesh Partition을 생성/편집하기 위한 인터랙티브 툴 모음"
- DocsURL: https://dev.epicgames.com/community/learning/knowledge-base/nK7J/unreal-engine-introduction-to-mesh-terrain#meshterrainmode
- Plugins 의존성: MeshModelingToolset, MeshModelingToolsetExp, MeshLODToolset, ToolPresets, StylusInput, ModelingToolsEditorMode, MeshPartition
- EnabledByDefault: false / IsExperimentalVersion: true
MeshPartition 모듈
- MeshPartition (Runtime, Default)
- MeshPartitionCompute (Runtime, PostConfigInit)
- MeshPartitionEditor (Editor)
- MeshPartitionModelingToolset (Editor)
- MeshPartitionEditorUI (Editor)
2. 데이터 표현 — Landscape vs Mesh Terrain
2.1 Landscape 기준선
Landscape는 영구 2D 하이트맵 기반 시스템이다.
- 핵심 구조: `FHeightmapData`가 `UTexture2D` 래핑 (LandscapeComponent.h:321)
- 저장 포맷: uint16 raw 배열 + LOD별 mip — `TMap<int32, TArray<uint16>> HeightMipData` (LandscapeComponent.h:227)
- 그리드: `(SubsectionSizeQuads + 1) * ComponentNumSubsections` 정점 (예: 4×63+1 = 253 정점/컴포넌트)
- LOD: 컴포넌트별 결정론적 mip + GPU에서 정점 모핑
- 토폴로지: **2D 정규 그리드만**. X-Y 평면 + Z 높이. 오버행/동굴 불가능
- 스트리밍: `ALandscapeStreamingProxy`가 셀별 액터 분할
- 편집: 브러시 페인팅으로 높이만 수정
- 결정론: 높음 (고정 그리드, 재현 가능)
2.2 Mesh Terrain (MeshPartition) 표현
Mesh Terrain은 완전 3D 삼각형 메시 기반이다.
- 핵심 구조: `FMeshData` — 명시적 정점/삼각형 배열 (MeshPartitionMeshData.h:17)
- `FDynamicMesh3` 및 `FMeshDescription`과 양방향 변환
- `FTriMeshCollisionData`로 변환되어 복합 충돌 생성
- 토폴로지: 완전 3D. 오버행/동굴/분기 가능
- 스트리밍: `ACompiledSection` 액터가 World Partition 그리드(`GridCellCoord`)에 등록
- `bSplitSectionsToMatchWorldPartitionRuntimeGrid` 플래그로 자동 그리드 정렬
- 결정론: 낮음 (메시 편집 순서 의존)
TArray<FVector3d> Vertices; // 3D 위치
TArray<FIndex3i> Triangles; // 삼각형 인덱스
TArray<FVector3f> Normals; // 법선
TArray<FUVChannel> ChannelUVs; // UV 채널
TArray<FWeightLayer> WeightLayers; // 가중치 레이어
2.3 하이트맵의 역할 — 일회성 임포트
Mesh Terrain에서 하이트맵은 "시작점" 임포트 포맷일 뿐, 런타임 데이터 모델이 아니다.
- `FHeightmapImporter`가 PNG/RAW 하이트맵을 `TArray64<uint16>`로 로드 (MeshPartitionHeightmapImporter.h:22)
- 바이리니어 보간으로 UV → 정점 XY + Z(높이) 매핑 (MeshPartitionHeightmapImporter.cpp:418)
- 쿼드 분할 → 삼각형 그리드 생성 (MeshPartitionHeightmapImporter.cpp:432)
- 섹션별 메시를 병렬 스레드로 빌드 후 `AMeshPartition` 액터에 머지 (MeshPartitionHeightmapImporter.cpp:235)
- 임포트 직후 하이트맵 텍스처 폐기. 이후 모든 편집은 정점 단위로 진행
- 에디터 메인 진입점: `BeginHeightmapImport` 액션 (MeshTerrainMode.cpp:1023)
2.4 차이 매트릭스
| 항목 | Landscape | Mesh Terrain |
| 높이 저장 | 영구 `UTexture2D` + `uint16` mip 배열 | 임포트 시점만; 이후 삼각형 메시 |
| 메시 형태 | 암묵적 2D 그리드 | 명시적 `FDynamicMesh3` |
| 오버행/동굴 | 불가능 (2D 함수 제약) | 가능 (완전 3D) |
| 분기 토폴로지 | 불가능 | 가능 |
| LOD | 컴포넌트별 결정론 mip | Nanite fallback 의존 |
| 스트리밍 | 셀별 액터 (효율적 2D) | 섹션별 (그리드 인식 약함) |
| 편집 | 브러시 페인팅 (높이만) | 모디파이어 스택 (비파괴 + 지오메트리 변형) |
| 결정론성 | 높음 | 낮음 |
3. MeshTerrainMode 에디터 구조
3.1 메인 클래스
// MeshTerrainMode.h:38
class UMeshTerrainMode : public UBaseLegacyWidgetEdMode,
public ILegacyEdModeSelectInterface
`UBaseLegacyWidgetEdMode` 기반 에디터 모드. ModelingToolset 인터랙티브 툴 인프라(`UInteractiveToolBuilder`, `UInteractiveTool`)를 사용한다.
3.2 서브모드 6종
| 서브모드 | 목적 | 주요 툴 | 연산 모델 |
| Create | 절차적 메시 생성 | CreateMegaMeshRectangle, HeightmapImport, DrawSpline, Pattern | 메시 신규 생성 또는 하이트맵 임포트 |
| Edit | 메시 토폴로지/변환 | Convert/Expand/Split/Stitch/Merge MegaMesh, ResectionMesh, EditPivot, BakeTransform, AttributeEditor | 구조적 편집 (변위 없음) |
| Sculpt | 정점 + 하이트맵 스컬핑 | [Sculpt] Offset/Move/Smooth/Pinch/Flatten + [Height] HeightSculpt/HeightSmooth/HeightFlatten/ZeroHeight/SlopeErode | 정점 푸시-풀(3D) + Z잠금 브러시(혼합) |
| Shapes | CSG 부울 모디파이어 | Add Box/Sphere/Cylinder/Capsule/Cone/Torus/Rectangle/Disc | 모디파이어로 적용되는 CSG |
| Paint | 어트리뷰트 페인팅 | MeshAttributePaint, MeshVertexPaint, AttributeEditor | 정점 색상/어트리뷰트 (비기하) |
| Modifiers | 절차적 변형 스택 | MeshProject, TexturePatch, Spline, ProjectMeshLayers, Lattice, Noise, Patch / Boolean / Remesh / SplineRemesh | 변위 + 리메시 + CSG |
3.3 Sculpt 서브모드의 듀얼 팔레트
Sculpt는 두 가지 모드를 함께 제공한다.
- [Sculpt 팔레트] 정점을 노멀 방향으로 푸시/풀 — **완전 3D** 변형, 오버행 생성 가능
- [Height 팔레트] Z축에만 작용하는 변위 — Landscape 스타일의 하이트필드 편집, 하이트맵 임포트 후에 사용
이 분리는 "기본 하이트맵 기반 지형"과 "3D 스컬프트 영역"을 동시에 한 자산 안에서 다루기 위함이다.
3.4 모디파이어 스택
| 모디파이어 | 범주 | 효과 | 토폴로지 변경 |
| URemeshModifier | 리토폴로지 | Uniform/Adaptive 링, Red-Green 테셀레이션 | O |
| UBooleanModifier | CSG | Union / Subtract / Trim | O (구멍/오버행) |
| UMeshProjectModifier | 변위 | 참조 메시에 Z 투영 (Raise/Lower/Set) | X |
| USplineModifier | 변위 | 스플라인 경로 따라 변형 | X |
| UPatchModifier | 로컬 패치 | 국지 메시 부분 교체 | O (국소) |
| UTexturePatchModifier | 변위 | 텍스처 기반 변위 | X |
| UNoiseModifier | 변위 | 절차적 정점 오프셋 | X |
| ULatticeModifier | 변위 | FFD(자유 형식 변형) 격자 | X |
실행 모델: `FTransformerPipeline`이 모디파이어 체인을 비동기 태스크로 실행. 결과는 `FMeshData`에 베이크.
4. 두 절벽 합치기 — 복셀/SDF 알고리즘
4.1 결론
두 개의 분리된 절벽 메시를 토폴로지 일관성 있게 (오버행 포함) 하나로 합치는 작업은 **에디터에서 가능**하다. 내부적으로 복셀화 + 마칭큐브 + 협대역 SDF가 사용된다. **런타임에서는 불가능** — 결과는 베이크된 삼각형 메시로만 유통된다.
4.2 사용 가능 도구
| 툴 | 클래스/Op | 위치 | 역할 |
| Voxel Boolean | FVoxelBooleanMeshesOp | VoxelBooleanMeshesOp.h:21 | 복셀 그리드 union/diff/intersect |
| Voxel Merge | FVoxelMergeMeshesOp | VoxelMergeMeshesOp.h:21 | 복셀 기반 메시 통합 |
| Iso-Surface Offset | IsoSurfaceD | MergeMeshesTool.cpp:74 | 암시적 표면 오프셋 제어 |
| Narrowband SDF | TSweepingMeshSDF<> | MeshSimpleShapeApproximation.cpp:551 | NarrowBand_SpatialFloodFill 모드 |
| Marching Cubes | MarchingCubesGridScale 설정 | MeshSimpleShapeApproximation.cpp:398 | SDF → 메시 추출 |
| ProxyLOD CSG | IVoxelBasedCSG::CreateCSGTool() | VoxelMergeMeshesOp.cpp:48 | ProxyLOD 통합 |
4.3 MeshTerrainMode에서 등록된 액션
// MeshTerrainMode.cpp:918
ToolManager->RegisterToolType("BeginVoxelMergeTool", ...);
// MeshTerrainMode.cpp:921
ToolManager->RegisterToolType("BeginVoxelBooleanTool", ...);
MeshTerrainModeManagerActions.cpp:184-185 에서 "Voxel Boolean" 및 "Voxel Merge" 명령어가 UI에 노출된다.
4.4 알고리즘 동작 흐름 (두 절벽 → 단일 메시)
- 입력: `FDynamicMesh3` × 2 (절벽 A, 절벽 B)
- 복셀화: 각 메시를 협대역 SDF로 변환 (`TSweepingMeshSDF<>` + NarrowBand_SpatialFloodFill)
- CSG 연산: 복셀 도메인에서 union / subtract / intersect / merge
- 마칭 큐브: 결과 SDF의 iso-surface (`IsoSurfaceD` 오프셋) 추출 → 새 `FDynamicMesh3`
- 옵션: 리메시 모디파이어로 정점 분포 정리
- 결과 베이크: `FMeshData`로 압축되어 `ACompiledSection` 액터에 저장
4.5 런타임 제약
- `ModelingOperatorsEditorOnly` 모듈은 **에디터 전용** — 패키지에 포함되지 않음
- `FMeshBoolean` (GeometryCore 런타임 모듈)은 존재하지만 `MeshPartitionEditor/Modifiers/MeshPartitionBooleanModifier.cpp:6`에서만 사용 — 에디터 모디파이어로 한정
- `MeshPartition.Build.cs` (런타임)에는 Boolean 모디파이어 모듈 없음
- 런타임 데이터는 베이크된 `FMeshData` 삼각형 메시뿐. SDF/복셀 그리드는 저장되지 않음
- 결론: "두 절벽 합치기"는 **에디터 워크플로 한정**. 게임 플레이 중 동적 합성은 불가
5. 채널 / 충돌 / 렌더링
5.1 채널 시스템 (메타데이터)
- `FChannelMap` / `FChannelName` — 명명된 어트리뷰트 (가중치 레이어 등)
- 커스텀 프리미티브 데이터(Custom Primitive Data)로 머티리얼 룩업 — 5비트 슬롯 패킹, 최대 24채널
- 채널 텍스처는 UV 공간에 래스터화 (월드 공간 복셀 아님)
- Virtual Texture fallback 컴포넌트
- 타일 기반 머티리얼 캐시
5.2 충돌
- `UMeshPartitionCollisionComponent`가 `FTriMeshCollisionData` 보유
- `IInterface_CollisionDataProvider` 구현 — 복합 충돌(Complex Collision)을 삼각형 메시에서 직접 추출
- `bCanEverAffectNavigation` 플래그로 NavMesh 영향 제어
- 채널별 물리 머티리얼 매핑 (가중치 폴백)
5.3 컴포넌트 계층
| 클래스 | 역할 | 파일 |
| AMeshPartition | 루트 액터, 정의 + 컴포넌트 보유 | MeshPartition.h:24 |
| UMeshPartitionDefinition | 공유 설정 에셋 | MeshPartitionDefinition.h:149 |
| UMeshPartitionComponent | PrimitiveComponent 기반 | (Runtime) |
| UMeshPartitionStaticMeshComponent | StaticMeshComponent 래퍼 | (Runtime) |
| UMeshPartitionCollisionComponent | 충돌 전용 | MeshPartitionCollisionComponent.h:35 |
| ACompiledSection | 런타임 결과 액터 (World Partition) | MeshPartitionCompiledSection.h:163 |
6. 제약사항 및 결론
6.1 사용 시 제약
- Experimental 단계 — API 변경 가능성 큼
- 기본 비활성화 (`EnabledByDefault: false`)
- StylusInput 의존 — 스타일러스 디바이스 지원 권장
- World Partition 활성 환경 필요 — `bSplitSectionsToMatchWorldPartitionRuntimeGrid`
- 자체 LOD 없음 — Nanite 의존
- 런타임 동적 토폴로지 변경 불가 — 모든 CSG/복셀은 에디터에서 베이크
6.2 Mesh Terrain이 적합한 시나리오
- 오버행/동굴/아치 등 비-함수형 지형이 필요한 환경 (절벽, 협곡, 동굴 입구)
- 아티스트가 스컬프팅 워크플로로 직접 모델링하는 핸드크래프트 지형
- CSG로 절차적 절벽 결합/구멍 뚫기가 필요한 레벨
- Nanite 활용 가능한 PC/콘솔 타깃
6.3 Landscape를 유지해야 하는 시나리오
- 거대한 2D 함수형 지형 (km 단위 평원, 언덕)
- 결정론적 LOD 모핑이 중요한 게임 (모바일/멀티플레이)
- Layer 기반 텍스처 블렌딩 워크플로
- 스플랫맵 + 풀/디칼 시스템에 강하게 의존하는 프로젝트
6.4 두 시스템 병행 권장
UE 5.8 단계에서는 "기본 지형 = Landscape, 특수 오버행 영역 = Mesh Terrain" 하이브리드 접근이 현실적이다. Mesh Terrain은 절벽/동굴/아치 등 함수형으로 표현할 수 없는 국지 지형에 한정 사용하고, 평원/언덕은 Landscape의 효율적 2D 스트리밍과 결정론적 LOD를 활용한다.
부록 A. 핵심 파일 경로
Plugins/Experimental/MeshTerrainMode/MeshTerrainMode.uplugin
Plugins/Experimental/MeshTerrainMode/Source/MeshTerrainMode/Private/MeshTerrainMode.h
Plugins/Experimental/MeshTerrainMode/Source/MeshTerrainMode/Private/Submodes/*
Plugins/Experimental/MeshPartition/MeshPartition.uplugin
Plugins/Experimental/MeshPartition/Source/MeshPartition/Public/MeshPartitionMeshData.h
Plugins/Experimental/MeshPartition/Source/MeshPartitionEditor/Public/MeshPartitionHeightmapImporter.h
Plugins/Runtime/MeshModelingToolset/Source/ModelingOperatorsEditorOnly/Public/CompositionOps/VoxelBooleanMeshesOp.h
Plugins/Runtime/MeshModelingToolset/Source/ModelingOperatorsEditorOnly/Public/CompositionOps/VoxelMergeMeshesOp.h
Plugins/Runtime/GeometryProcessing/Source/DynamicMesh/Private/ShapeApproximation/MeshSimpleShapeApproximation.cpp
Source/Runtime/Landscape/Classes/LandscapeComponent.h
부록 B. 공식 문서
- Epic Dev Community: "Introduction to Mesh Terrain"
- URL: https://dev.epicgames.com/community/learning/knowledge-base/nK7J/unreal-engine-introduction-to-mesh-terrain#meshterrainmode
부록 C. 향후 조사 권장
- Nanite 적용 시 LOD 비용 측정 — Landscape mip 시스템과 비교 벤치마크
- Voxel Boolean의 입력 메시 해상도별 베이크 시간/메모리 프로파일
- World Partition 셀 경계에서의 메시 이음새(seam) 처리 방식 검증
- 멀티 유저 에디터에서의 모디파이어 스택 동시 편집 충돌 정책
- Total
- Today
- Yesterday
- 이미지이펙트
- 모션블러
- 네트워크
- 컴네
- 법선
- shader
- #Shader #셰이더 #Tessellator #눈발자국 #발자국
- 소프트웨어공학
- ImageEffect
- Unreal
- Substance
- Graphics
- ue4
- 노영태
- 유니티
- 인하대
- designer
- MotionBlur
- unity
- 정리
- 컴퓨터구조론
- Voxel
- Substance Designer
- 블러효과
- 이종식
- HLSL
- 소공
- 유니티 셰이더
- 컴퓨터네트워크
- normal
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |