Unity를 위한 절차적 기하학 엔진 (Procedural Geometry Engine) 구축하기
요약
Unity 환경에서 실시간 처리에 최적화된 절차적 기하학 엔진(Procedural Geometry Engine)의 설계와 구현 방식을 다룹니다. Burst 컴파일러와 병렬 잡을 활용하여 성능을 극대화하였으며, 노드 기반의 워크플로우와 데이터 무결성을 유지하는 Provenance 시스템을 구축했습니다.
핵심 포인트
- Burst 컴파일러와 병렬 잡을 사용하여 실시간 성능을 보장하는 네이티브 컨테이너 기반 설계
- 위상 변화 시에도 속성을 유지할 수 있는 Provenance 시스템 도입
- BVH, KD-tree, Octree 등 고성능 공간 트리 구조 지원
- Unity Graph Toolkit을 활용한 풀-쿡(Pull-cook) 방식의 노드 에디터 구현
- GPU 인스턴싱을 고려한 중첩된 프리팹 및 패킹된 프리미티브 지원
제 업무는 계속해서 런타임 (Runtime) 중에 메쉬 처리 (Mesh processing)가 필요한 작업들로 이어졌습니다. 예를 들어, 액체 속에 떠 있는 물체들을 위한 시뮬레이터의 경우, 평면 (Plane)으로 메쉬를 자르고, 하위 부피 (Sub-volumes)와 질량 중심 (Centers of mass)을 계산하며, 볼록 콜라이더 (Convex colliders)로 분해하여 물리 엔진 (Physics)에 전달하는 작업 등이 있었습니다.
또한 저는 개인 프로젝트와 이전 직장에서 전문 DCC (Digital Content Creation) 패키지를 사용해 절차적 (Procedural) 작업을 꽤 많이 수행해 왔습니다. Houdini, Blender Geometry Nodes, Substance, UE Blueprints가 나아가는 방향을 보면, 절차적이고 노드 기반 (Node-based)인 방식이 성장하고 있습니다. 저 또한 동일한 방향을 시도하되, Unity 내부에서 실시간 우선 (Realtime-first) 방식으로 구현해보고 싶었습니다.
데이터 모델은 네 가지 도메인 (Domain)으로 구성됩니다:
- Detail - 하나의 단위로서의 전체 기하학 (Geometry).
- Primitive - 삼각형 (Triangle)이 아닌 실제 폴리곤 (Polygon).
- Point - 공간상의 위치.
- Vertex - (Point, Primitive)의 결합.
속성 (Attributes)은 의미론적으로 적절한 위치에 존재합니다. 예를 들어, 위치 (Positions)는 Point에, 법선 (Normals)과 UV는 Vertex에, 재질 (Materials)은 Primitive에 위치합니다. 위상 (Topology)은 모든 연산 (Op)에서 일급 객체 (First-class)로 유지됩니다. 기본 레이어는 Burst 호환 코드이며, 핫 패스 (Hot paths)에는 병렬 잡 (Parallel Jobs)을 사용합니다.
현재 작동하는 것들:
- NativeDetail - 완전한 네이티브 컨테이너 (Native container)이며, 관리되는 코드 (Managed code)가 전혀 없습니다. 어떤 도메인(Domain)에서든 어트리뷰트 (Attribute)로서 모든 블리터블 타입 (Blittable type)을 사용할 수 있습니다.
- Provenance - 모든 출력 요소가 자신의 소스 입력값과 가중치 (Weights)를 알고 있으므로, 별도의 재매핑 (Remapping) 없이도 위상 변화 (Topology changes) 시 어트리뷰트가 유지됩니다. 새로운 포인트가 추가되어도 UV가 깨지지 않습니다.
- Generators and topology ops (생성기 및 위상 연산) - 모두 Burst 잡 (Burst-jobbed)으로 구현되었습니다 - Box, UV Sphere, Torus, Tube, Cylinder; Plane Cut, Weld, Triangulate, Extrude/Inset, Blast, Recompute Normals.
- Spatial trees (공간 트리) - BVH, KD-tree, Octree가 포함되며, 폴리곤 레이캐스트 (Polygon raycast) 및 반경 포인트 쿼리 (Radius point queries)가 이미 작동합니다.
- Packed primitives (패킹된 프리미티브) - 하나의 프리미티브가 자체 트랜스폼 (Transform)을 가진 다른 디테일의 인스턴스가 될 수 있습니다. 데이터 포맷 레벨에서 중첩된 프리팹 (Nested prefabs)을 지원하여 GPU 인스턴싱 (GPU instancing)을 위한 준비가 되어 있습니다.
- Node editor (노드 에디터) - Unity의 새로운 Graph Toolkit을 사용합니다. 실행 방식은 제가 직접 설계했습니다: 풀-쿡 (Pull-cook, 출력에 필요한 것만 계산) 방식과 푸시-더티 (Push-dirty, 편집 시 종속 항목을 만료 상태로 표시) 방식을 결합했습니다.
- Groups (그룹) - "1부터 16까지의 매 두 번째 폴리곤" 또는 "A와 B의 합집합 후 반전"과 같은 술어 표현식 (Predicate expressions)을 지원합니다.
- Custom Script node (커스텀 스크립트 노드) - 임의의 입력과 출력을 가진 사용자 C# 코드이며, 외부 기여자를 위한 확장 API입니다.
- Per-node preview pinning (노드별 프리뷰 고정) - 위상 오버레이 (Topology overlay) 및 포인트/폴리곤 인덱스 (Point/polygon indices)를 제공하는 디버그 뷰어가 포함됩니다.
- Two-way Unity Mesh/NativeDetail conversion (양방향 Unity Mesh/NativeDetail 변환) - 런타임 출력 (Runtime Output) 및 메쉬로 굽기 (Bake to Mesh) 기능이 노출되어 있습니다.
지난 한 달 반 동안 주로 핵심 API를 안정화하는 데 집중했습니다. 아키텍처를 다섯 번이나 다시 작성했습니다. 단기 목표는 작은 수학 표현식 파서 (Math expression parser)를 포함한 그룹 시스템을 완성한 후, 지형 위에 흩어진 나무 생성기나 임의의 메쉬를 위한 런타임 콜라이더 생성기 같은 보여줄 만한 데모를 출시하는 것입니다.
비슷한 작업을 하고 계신 분들의 의견이 궁금합니다. 그리고 Unity를 사용하신다면 - 런타임에 메쉬를 생성하거나 수정해야 했던 적이 있나요? 볼록 콜라이더 분해 (Convex collider decomposition), 런타임 아이템 커스터마이징, 파괴 (Destruction), 메쉬 불리언 (Mesh booleans), 지형 편집 (Terrain edits) 등 - 어떤 도구를 사용하셨고, 무엇이 부족했나요?
AI 자동 생성 콘텐츠
본 콘텐츠는 r/Unity3D (top/week)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기