Unity Virtual Mesh 패키지
요약
Unity Virtual Mesh 패키지는 CPU 부하를 줄이기 위해 렌더링 로직을 GPU로 이동시키는 가상 지오메트리 시스템의 샘플 코드입니다. 이 시스템은 LOD, 컬링, 배치 등을 자동화하여 모바일 환경에서도 높은 성능상의 이점을 제공하는 것을 목표로 합니다.
핵심 포인트
- CPU 부하를 줄이는 가상 지오메트리 시스템 구현 예시.
- GPU instancing, compute shaders 등 고급 렌더링 개념 활용.
- 모바일 및 다양한 플랫폼(DX12, iOS) 지원을 위해 지속적으로 개선 중.
Unity Virtual Mesh Package
이 패키지는 CEDEC 2024에서 발표된 "모바일 사용에 적합한 경량 가상화 지오메트리 시스템의 설계 및 구현(Design and Implementation of a Lightweight Virtualized Geometry System Suitable for Mobile Use)" 자료를 참조한 샘플 코드입니다 (일본어 발표). 해당 발표 영상은 Unity Learning Materials에서 확인할 수 있습니다.
[!CAUTION]
이 패키지에 포함된 코드는 운영 환경(production)에 바로 사용할 수 없습니다. 유사한 가상 지오메트리 파이프라인을 구현하기 위한 참고 자료로만 사용되어야 합니다. 해당 코드를 Unity 생태계와 연결하여 자유롭게 사용할 수 있습니다 (더 자세한 내용은 Unity Companion License 참조).
배경 지식 (Background)
많은 게임들이 직면하는 일반적인 성능 문제는 CPU 자원 과다 사용입니다. 가상 지오메트리 시스템(virtual geometry system)은 이 문제를 해결하기 위해, 어떤 지오메트리를 렌더링할지 결정하는 로직을 실제 렌더링 자체, 즉 GPU 쪽으로 이동시키려고 시도합니다. 특정 장면의 경우, 모든 메시가 GPU로 업로드(스트리밍)되며, LOD(Level of Detail) 선택과 불필요한 삼각형의 컬링(culling)이 렌더링 직전에 그곳에서 수행됩니다. 이 과정은 거의 완벽에 가까운 재질별 배치(per-material batching), LOD, 그리고 컬링을 모두 자동화하며, 에셋 조정(tweaking assets)이 필요 없습니다.
이러한 시스템은 지난 10년 이상 하이엔드 플랫폼 게임에서 사용되어 왔으며, 이제 모바일 기기에 탑재된 기술과 하드웨어는 충분히 발전하여 다른 플랫폼에서도 프로토타입을 만들 수 있게 되었습니다. 이 패키지의 목표는 모바일 환경에서도 성능상의 이점을 보여줄 수 있는, 완전히 사용자 정의 가능한 C# 레벨의 가상 지오메트리 시스템을 제공하는 것입니다.
이것을 달성하기 위해 가상 메시 시스템은 GPU instancing, compute shaders, indirect draws 및 dispatches, GPU-driven rendering, two-pass occlusion culling, 계층적 level-of-details 등 몇 가지 개념에 의존하므로, 패키지 코드를 살펴보기 전에 이러한 개념들을 이해하는 것을 권장합니다.
프로젝트 현황
현재 이 패키지는 유지보수되고 있으며 개발이 계속 진행 중입니다. 하지만 이것은 공식 Unity 제품이라기보다는 실험적인 성격이므로, 어떠한 종류의 지원이나 업데이트 시기에 대해서도 보장할 수 없습니다. 현재 초점 및 할 일 목록은 다음과 같습니다:
- 다중 씬 베이킹 (Multiple-scene baking): 현재 시스템은 데모 목적으로 단일 씬에서만 작동하며, 다중 씬을 지원하도록 베이킹 시스템 확장을 검토하고 있습니다.
- 베이킹 UX 개선 (Baking UX improvements): 베이킹 시스템은 에디터 도구에 의존하는데, 성능과 사용성을 높이기 위해 이 부분을 개선하는 방안을 모색하고 있습니다.
- DX12 지원 (DX12 support): DX12를 지원하려면 API 간의 indirect draw 인자 동작 방식에서 발생하는 플랫폼 차이점을 해결하기 위한 몇 가지 수정 작업이 필요하며, 현재 진행 중입니다.
- iOS 지원 (iOS support): iOS 지원 작업이 현재 진행 중입니다.
- 성능 최적화 (Performance optimizations): 시스템의 런타임 성능을 개선할 수 있는 방법들이 여전히 여러 가지 남아 있으며, 성능 향상 방법을 조사하는 데 지속적으로 시간이 투입되고 있습니다.
설정
<img src="https://img.shields.io/badge/unity-6000.3.0f1-green.svg?style=flat-square" alt="unity 6000.3.0f1"> <img src="https://img.shields.io/badge/Vulkan-AC162C.svg?style=flat-square&logo=vulkan&logoColor=white" alt="Vulkan">
이 패키지는 URP, Vulkan 및 Render Graph 시스템에 의존합니다. Unity 6.3 LTS 버전 이상을 대상으로 지원할 예정입니다. HDRP 호환성은 테스트되지 않았습니다.
패키지를 설치하고 수정하려면, 해당 저장소를 Packages 폴더로 복제한 후 폴더 이름이 com.unity.virtualmesh인지 확인하는 것을 권장합니다. 또한 package manager를 통해 에디터에서 패키지를 가져올 수도 있습니다.
가상 메시(Virtual Mesh) 시스템을 사용하려면 다음 단계를 따라야 합니다:
1. 가상 메시 베이킹 (Bake virtual meshes) (베이킹 섹션 참조)
2. Universal Renderer Data 에셋에 VirtualMeshRenderFeature 추가

새로운 렌더 기능(render feature)을 추가할 때, 여러 개의 셰이더 및 머티리얼 에셋이 자동으로 설정되어야 합니다. 만약 그렇지 않다면, 아래 각 필드를 참조하십시오:
Render Mode는 Universal Renderer Data의Rendering Path설정으로 정의된 값과 동일하게 설정해야 합니다.Depth Pyramid는 Packages/com.unity.virtualmesh/Runtime/RenderTextures/DepthPyramid.renderTexture로 설정해야 합니다.Compute Passes Shader는 Packages/com.unity.virtualmesh/Runtime/Shaders/DXCVisibilityPasses.compute로 설정해야 합니다.Pyramid Generation Passes Shader는 Packages/com.unity.virtualmesh/Runtime/Shaders/DepthPyramidPass.compute로 설정해야 합니다.Custom Pass Material은 Packages/com.unity.virtualmesh/Runtime/Materials/CustomPassMaterial.mat로 설정해야 합니다.Debug Pass Material은 Packages/com.unity.virtualmesh/Runtime/Materials/DebugPassMaterial.mat로 설정해야 합니다.
3. 메인 카메라에 VirtualMeshManager 스크립트 추가

VirtualMeshManager 스크립트는 여러 필드를 가지고 있습니다:
Copy Passes Shader는 Packages/com.unity.virtualmesh/Runtime/Shaders/CopyPasses.compute로 설정해야 합니다.Placeholder Material은 Packages/com.unity.virtualmesh/Runtime/Materials/PlaceholderLit.mat으로 설정해야 합니다.Is Enabled를 사용하면Virtual Mesh Manager컴포넌트 자체를 활성화하거나 비활성화하는 무거운 비용을 발생시키지 않으면서 가상 메시(virtual meshes)를 활성화하거나 비활성화할 수 있습니다.Is Internal Draw Pass Enabled는 URP 기본 불투명 패스 대신 차폐되지 않은 지오메트리(disoccluded geometry)를 그리기 위해 전용 렌더 패스를 사용하도록 시스템에 알려줍니다.Is Bounding Mesh Enabled는 장면에 가상 메시만 존재하는 경우 URP가 그림자 맵(shadow maps)을 생성하도록 강제하는 빈 경계 메시(empty bounding mesh)를 그리도록 시스템에 알려줍니다.Is Placeholder Enabled는 사용 준비가 되지 않은 메모리 페이지 대신 그려져야 하는 플레이스홀더 메시(placeholder meshes)를 활성화할 수 있게 합니다.Is Debug View Enabled는 디버그 셰이더로 가상 메시를 렌더링할 수 있게 합니다 ( Troubleshooting 섹션 참조).
베이킹 (Baking)
가상 메시 시스템을 통해 렌더링될 메시는 사전 처리되어 별도의 사용자 지정 파일 세트로 저장되어야 합니다. 이 과정을 베이킹(baking)이라고 부르며, 에디터 내에서 완전히 수행할 수 있습니다. 한 번 베이크되면 원래의 메시 애셋은 더 이상 사용되지 않으며, 씬에서 제거할 수 있습니다.
[!NOTE]
현재는 정적 불투명 메시에만 지원됩니다. 투명한 오브젝트도 베이킹할 수 있지만, 해당 오브젝트들의 렌더링 순서는 보장되지 않습니다.
베이크되어야 할 메시는 게임 오브젝트(GameObjects)로 씬에 존재해야 하며, 하나 이상의 부모 아래 그룹화되어야 합니다 (해당 부모의 계층 구조 깊이나 구조는 중요하지 않습니다). 베이킹을 위해 오브젝트들을 그룹화한 후 다음 단계를 따르십시오:
- 에디터 탭에서
Virtual Mesh>Open Baker를 선택하여 Virtual Mesh Baker 창을 엽니다. - 부모 오브젝트를
Root Game Object필드로 드래그 앤 드롭합니다. - 비활성 게임 오브젝트도 베이킹 과정에서 고려되어야 한다면
Bake Inactive Objects체크박스를 확인합니다. - 투명도가 아닌(opaque) 다른 렌더 큐 설정을 가진 오브젝트도 베이크하려면
Bake Opaque Objects Only체크박스를 해제합니다. Full Bake버튼을 클릭하고 프로세스가 완료될 때까지 기다립니다.
베이킹이 완료되면, 콘솔에 처리된 오브젝트 수와 관련된 통계 메시지가 표시되어야 합니다. 또한 프로젝트에 두 개의 새 폴더가 생성됩니다:
- Assets/StreamingAssets/VirtualMeshData: 새로 변환된 메쉬 데이터와 해당 머티리얼이 AssetBundle로 저장되어 포함됩니다.
- Assets/VirtualMeshCache: 베이킹 프로세스에 의해 생성되는 중간 에셋이 담겨 디버깅용으로 여기에 저장됩니다.
[!CAUTION]
베이킹 시스템은 현재 선택된 빌드 플랫폼을 위해 에셋 번들을 구축하도록 구성되어 있습니다. 에디터에서 가상 메쉬를 시각화하려면, Graphics API로 Vulkan을 사용하고 활성 빌드 프로필로 Windows를 선택하여 전체 베이크(full bake)를 수행했는지 확인하십시오.
기술 상세 정보 (Technical Details)
패키지에서 자주 사용되는 어휘 및 개념 목록은 Glossary 섹션을 참조하십시오.
패키지의 아키텍처 및 구현 세부 정보는 Implementation 섹션에서 확인하십시오.
기능 지원 (Feature Support)
다음은 기본적으로 이 패키지와 호환되지 않을 수 있어 특별한 주의가 필요한 Unity 기능 목록입니다.
| 기능 | 지원 상태 |
|---|---|
| Directional Light | 조명과 그림자 모두 최대 4개의 캐스케이드까지 지원됩니다. |
| ... |
문제 해결 (Troubleshooting)
가상 시스템이 객체를 올바르게 렌더링하는지 확인하려면 Unity Frame Debugger를 활성화하고, VirtualMeshRenderFeature Draw Shadow Pass 또는 VirtualMeshRenderFeature Refresh Depth Pyramid Pass와 같은 패스가 각각 그림자 및 불투명 지오메트리에 대해 실제로 콘텐츠를 그리는지 확인할 수 있습니다:

VirtualMeshManager 컴포넌트에는 Is Debug View Enabled라는 디버그 셰이더를 활성화하는 체크박스가 포함되어 있습니다. 이것은 두 패스 오클루전 컬링 알고리즘의 첫 번째 패스를 Runtime/Shaders/DebugPasses.shader에 의존하는 디버그 셰이더 렌더로 대체하며, 이 셰이더는 기본적으로 카메라 깊이에 기반한 투명 블렌드를 사용하여 가상 메쉬를 렌더링함으로써 오버드로우(overdraw)를 시각화하고 컬링이 작동하는지 확인할 수 있습니다:

또한 이 셰이더에는 LOD 전환이 올바르게 작동하는지 확인하기 위해 삼각형 보기로 전환할 수 있는 주석 처리된 코드도 포함되어 있습니다:

라이선스
LICENSE.md를 참조하세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub GameDev의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기