--- id: wiki-2026-0508-geometry-merging title: Geometry Merging category: 10_Wiki/Topics status: needs_review canonical_id: self aliases: [P-Reinforce-AUTO-4349BD] duplicate_of: none source_trust_level: A confidence_score: 0.9 tags: [auto-reinforced] raw_sources: [] last_reinforced: 2026-04-20 github_commit: "[P-Reinforce] Continuous Worker - Geometry Merging" inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08) tech_stack: language: unspecified framework: unspecified --- # [[Geometry Merging|Geometry Merging]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > **Geometry Merging(μ§€μ˜€λ©”νŠΈλ¦¬ 병합)**은 Three.js λ“±μ˜ 3D λ Œλ”λ§ ν™˜κ²½μ—μ„œ 정적(static)인 μ—¬λŸ¬ 개의 κΈ°ν•˜ν•™μ  데이터λ₯Ό 단일 `[[BufferGeometry|BufferGeometry]]`둜 ν•©μΉ˜λŠ” μ΅œμ ν™” κΈ°λ²•μž…λ‹ˆλ‹€. μ΄λŠ” μ—¬λŸ¬ 개의 메쉬λ₯Ό κ°œλ³„μ μœΌλ‘œ 그릴 λ•Œ λ°œμƒν•˜λŠ” **λ“œλ‘œμš° 콜([[Draw Call|Draw Call]])을 단 1회둜 쀄여주어** CPU μ˜€λ²„ν—€λ“œλ₯Ό 크게 κ°μ†Œμ‹œν‚΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ κ°œλ³„ 객체의 독립적인 μ΄λ™μ΄λ‚˜ μ‹€μ‹œκ°„ μƒν˜Έμž‘μš©μ΄ μ œν•œλ˜λ©°, 객체가 반볡될 경우 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ κ·Ήμ‹¬ν•˜κ²Œ μ¦κ°€ν•œλ‹€λŠ” λšœλ ·ν•œ ν•œκ³„λ₯Ό κ°€μ§‘λ‹ˆλ‹€. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) * **원리 및 λ Œλ”λ§ μ΅œμ ν™” 효과:** `BufferGeometryUtils.mergeGeometries`와 같은 μœ ν‹Έλ¦¬ν‹°λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‘œλ“œ νƒ€μž„μ— μ—¬λŸ¬ 메쉬λ₯Ό ν•˜λ‚˜λ‘œ λ³‘ν•©ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€ [1, 2]. 이 방식은 독립적인 μˆ˜λ§Žμ€ λ“œλ‘œμš° μ½œμ„ 단 ν•˜λ‚˜μ˜ λ“œλ‘œμš° 콜둜 κ²°ν•©ν•˜λ―€λ‘œ, **λ“œλ‘œμš° 콜 병λͺ© ν˜„μƒμ„ μ™„ν™”ν•˜λŠ” ꢁ극적인 ν•΄κ²°μ±…**을 μ œκ³΅ν•©λ‹ˆλ‹€ [3, 4]. μ›€μ§μž„μ΄ ν•„μš” μ—†λŠ” 정적 μ”¬μ΄λ‚˜ λ‹€μˆ˜μ˜ λΆ€ν’ˆμ΄ 쑰립된 CAD λ Œλ”λ§ λͺ¨λΈ λ“±μ—μ„œ 높은 ν”„λ ˆμž„ 레이트λ₯Ό μœ μ§€ν•˜λŠ” 데 νƒμ›”ν•œ 효과λ₯Ό λ°œνœ˜ν•©λ‹ˆλ‹€ [4]. * **λ©”λͺ¨λ¦¬ μ†Œλͺ¨ 및 μƒν˜Έμž‘μš©μ˜ ν•œκ³„:** λ³‘ν•©λœ μ§€μ˜€λ©”νŠΈλ¦¬λŠ” 병합 μ „ κ°œλ³„ 객체의 κΈ°ν•˜ν•™μ  데이터λ₯Ό λͺ¨λ‘ κ³ μŠ€λž€νžˆ λ³΅μ œν•˜μ—¬ λ©”λͺ¨λ¦¬μ— μ €μž₯ν•©λ‹ˆλ‹€. λ”°λΌμ„œ 수천 개의 λ™μΌν•œ 객체(예: 의자)λ₯Ό λ Œλ”λ§ν•  λ•Œ 단일 κΈ°ν•˜ λ°μ΄ν„°λ§Œ μ°Έμ‘°ν•˜λŠ” μΈμŠ€ν„΄μ‹±([[Instancing|Instancing]])κ³Ό 달리, **λ©”λͺ¨λ¦¬(RAM 및 VRAM) μ†Œλͺ¨κ°€ κΈ°ν•˜κΈ‰μˆ˜μ μœΌλ‘œ 증가**ν•˜λŠ” 치λͺ…적인 단점이 μžˆμŠ΅λ‹ˆλ‹€ [3, 5, 6]. λ˜ν•œ λͺ¨λ“  데이터가 ν•˜λ‚˜λ‘œ 합쳐져 μžˆμœΌλ―€λ‘œ, **κ°œλ³„ 객체의 μœ„μΉ˜, νšŒμ „, 색상을 μ‹€μ‹œκ°„μœΌλ‘œ λ³€κ²½ν•˜κ±°λ‚˜ κ°œλ³„μ μΈ ν”Όν‚Ή(Picking) λ“± μƒν˜Έμž‘μš©μ„ κ΅¬ν˜„ν•˜κΈ°κ°€ 맀우 κΉŒλ‹€λ‘­μŠ΅λ‹ˆλ‹€** [6-8]. * **μ‹œμ•Ό μ ˆλ‘μ²΄ 컬링([[Frustum Culling|Frustum Culling]]) λΉ„νš¨μœ¨μ„±:** λͺ¨λ“  객체가 ν•˜λ‚˜μ˜ κ±°λŒ€ν•œ λ©”μ‰¬λ‘œ λ³‘ν•©λ˜λ©΄ 전체가 **단일 λ°”μš΄λ”© λ³Όλ₯¨(Bounding volume)으둜 μ·¨κΈ‰**λ©λ‹ˆλ‹€. 이둜 인해 합쳐진 λ©μ–΄λ¦¬μ˜ 극히 μΌλΆ€λ§Œ 카메라 μ‹œμ•Ό(Frustum)에 λ“€μ–΄μ˜€λ”λΌλ„ 화면에 보이지 μ•ŠλŠ” λ‚˜λ¨Έμ§€ 전체 μ˜μ—­κΉŒμ§€ λͺ¨λ‘ λ Œλ”λ§ 연산을 μˆ˜ν–‰ν•˜κ²Œ λ˜μ–΄, 결과적으둜 GPU μ„±λŠ₯의 λΉ„νš¨μœ¨μ„ μ΄ˆλž˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [4]. * **싀무적 λŒ€μ•ˆ 및 ν•˜μ΄λΈŒλ¦¬λ“œ μ „λž΅:** μ ˆλ‘μ²΄ 컬링의 문제λ₯Ό μ™„ν™”ν•˜κΈ° μœ„ν•΄ 곡간적 인접성에 따라 메쉬λ₯Ό λ‚˜λˆ„μ–΄ λ³‘ν•©ν•˜λŠ” **'νƒ€μΌν˜• 병합(Tiled merging)'** μ „λž΅μ΄ ꢌμž₯λ©λ‹ˆλ‹€ [4]. λ˜ν•œ, λ©”λͺ¨λ¦¬μ™€ μœ μ—°μ„± 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 동적인 μž₯면이 μ•„λ‹ˆκ³  λͺ¨λΈ 크기가 μž‘μ„ λ•Œ(< 1GB)μ—λ§Œ 병합을 μ μš©ν•˜κ±°λ‚˜ [9], 정적인 저폴리곀 κ°μ²΄λŠ” 병합(Merging)ν•˜κ³  λ™μ μ΄κ±°λ‚˜ 고폴리곀인 κ°μ²΄λŠ” `[[InstancedMesh|InstancedMesh]]` ν˜Ήμ€ `BatchedMesh`λ₯Ό μ‚¬μš©ν•˜λŠ” **ν•˜μ΄λΈŒλ¦¬λ“œ μ‹œμŠ€ν…œ**이 λŒ€μ•ˆμœΌλ‘œ ν™œμš©λ˜κΈ°λ„ ν•©λ‹ˆλ‹€ [10, 11]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & Updates) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Graphics & Performance λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** [[Draw Call|Draw Call]], InstancedMesh, BatchedMesh, Frustum Culling, [[BufferGeometry|BufferGeometry]] - **Projects/Contexts:** IFC.js Fragment, CAD Rendering [[Optimization|Optimization]] - **Contradictions/Notes:** μ§€μ˜€λ©”νŠΈλ¦¬ 병합은 λ“œλ‘œμš° μ½œμ„ 크게 쀄여 λ Œλ”λ§ 속도λ₯Ό λ†’μ΄λŠ” μž₯점이 μžˆμ§€λ§Œ, 단일 λ°”μš΄λ”© λ°•μŠ€λ‘œ 묢이게 λ˜μ–΄ μ‹œμ•Ό μ ˆλ‘μ²΄ 컬링 νš¨μœ¨μ„±μ΄ λ–¨μ–΄μ§€κ³  λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ κ·Ήλ„λ‘œ λ†’μ•„μ Έ ν•˜λ“œμ›¨μ–΄ μžμ›μ„ μ‰½κ²Œ κ³ κ°ˆμ‹œν‚¬ 수 μžˆλ‹€λŠ” νŠΈλ ˆμ΄λ“œμ˜€ν”„(Trade-off)κ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€ [3, 4]. --- *Last updated: 2026-04-19* --- ## πŸ€– LLM ν™œμš© 힌트 (How to Use This Knowledge) **μ–Έμ œ 이 지식을 μ“°λŠ”κ°€:** - *(TODO)* **μ–Έμ œ μ“°λ©΄ μ•ˆ λ˜λŠ”κ°€:** - *(TODO)* ## πŸ§ͺ 검증 μƒνƒœ (Validation) - **정보 μƒνƒœ:** needs_review - **좜처 신뒰도:** A - **κ²€ν†  이유:** *(P-Reinforce Phase 1 μžλ™ μ •κ·œν™”. λ³Έλ¬Έ 검증 ν•„μš”.)* ## 🧬 쀑볡 검사 (Duplicate Check) - **κΈ°μ‘΄ μœ μ‚¬ λ¬Έμ„œ:** *(TODO: μΈλ±μ„œ ν΄λŸ¬μŠ€ν„° 리포트 μ°Έμ‘°)* - **처리 방식:** UPDATE (μžλ™ μ •κ·œν™”) - **처리 이유:** Phase 1 μ •κ·œν™” β€” μ˜› ν…œν”Œλ¦Ώ/λˆ„λ½ ν•„λ“œ 보강. ## πŸ•“ λ³€κ²½ 이λ ₯ (Changelog) | λ‚ μ§œ | λ³€κ²½ λ‚΄μš© | 처리 방식 | 신뒰도 | |------|-----------|-----------|--------| | 2026-05-08 | P-Reinforce Phase 1 μ •κ·œν™” (frontmatter + 헀더 ν‘œμ€€ν™”) | UPDATE | A | ## πŸ’» μ½”λ“œ νŒ¨ν„΄ (Code Patterns) **νŒ¨ν„΄ 1:** *(TODO: 이 ν”„λ‘œμ νŠΈ μ»¨λ²€μ…˜ λ°˜μ˜ν•œ ꡬ쑰 μŠ€μΌˆλ ˆν†€)* ```text # TODO ``` ## πŸ€” μ˜μ‚¬κ²°μ • κΈ°μ€€ (Decision Criteria) **선택 Aλ₯Ό 써야 ν•  λ•Œ:** - *(TODO)* **선택 Bλ₯Ό 써야 ν•  λ•Œ:** - *(TODO)* **κΈ°λ³Έκ°’:** > *(TODO)* ## ❌ μ•ˆν‹°νŒ¨ν„΄ (Anti-Patterns) - **[μ•ˆν‹°νŒ¨ν„΄]:** *(TODO: 무엇을 ν•˜λ©΄ μ•ˆ λ˜λŠ”κ°€ + 이유 + λŒ€μ‹  무엇을)*