# [[Three.js|Three.js]] ## πŸ“Œ Brief Summary Three.jsλŠ” WebGL 및 WebGPUλ₯Ό μ‚¬μš©ν•˜μ—¬ μ›Ή λΈŒλΌμš°μ €μ—μ„œ μ• λ‹ˆλ©”μ΄μ…˜ 3D 컴퓨터 κ·Έλž˜ν”½μŠ€λ₯Ό μƒμ„±ν•˜κ³  ν‘œμ‹œν•  수 μžˆλ„λ‘ μ§€μ›ν•˜λŠ” 크둜슀 λΈŒλΌμš°μ € μžλ°”μŠ€ν¬λ¦½νŠΈ 라이브러리이자 API이닀 [1, 2]. λΈŒλΌμš°μ €, GPU, μžλ°”μŠ€ν¬λ¦½νŠΈ κ°„μ˜ λ³΅μž‘ν•œ μƒν˜Έμž‘μš©μ„ μΆ”μƒν™”ν•˜μ—¬ κ°œλ°œμžκ°€ κ³ μ„±λŠ₯의 3D ν™˜κ²½μ„ μ‰½κ²Œ ꡬ좕할 수 μžˆλ„λ‘ λ•λŠ”λ‹€ [3]. 2026년을 기점으둜 ν”„λ‘œλ•μ…˜ μˆ˜μ€€μ˜ WebGPU λ Œλ”λŸ¬μ™€ TSL(Three Shader Language)이 λ„μž…λ˜λ©΄μ„œ, λ‹¨μˆœν•œ μ‹œκ°ν™”λ₯Ό λ„˜μ–΄ 수백만 개의 νŒŒν‹°ν΄ μ—°μ‚°μ΄λ‚˜ λŒ€κ·œλͺ¨ CAD λͺ¨λΈ μ²˜λ¦¬κΉŒμ§€ κ°€λŠ₯ν•œ κ³ μ„±λŠ₯ ν”Œλž«νΌμœΌλ‘œ μ§„ν™”ν–ˆλ‹€ [4-7]. ## πŸ“– Core Content * **λ Œλ”λ§ νŒŒμ΄ν”„λΌμΈ 및 λ“œλ‘œμš° 콜(Draw Call) μ΅œμ ν™”:** μ‹€μ‹œκ°„ 3D λ Œλ”λ§μ—μ„œ CPUκ°€ GPU에 λ Œλ”λ§μ„ λͺ…λ Ήν•˜λŠ” 'λ“œλ‘œμš° 콜'은 μ‹œμŠ€ν…œ μ˜€λ²„ν—€λ“œμ˜ 주된 μ›μΈμœΌλ‘œ κΌ½νžŒλ‹€ [8-10]. Three.jsλŠ” 이λ₯Ό μ΅œμ†Œν™”ν•˜κΈ° μœ„ν•΄ 단일 κΈ°ν•˜ν•™(Geometry)κ³Ό 재질(Material)을 κ³΅μœ ν•˜λŠ” 객체듀을 ν•œ λ²ˆμ— λ Œλ”λ§ν•˜λŠ” `InstancedMesh`, λ‹€μ–‘ν•œ κΈ°ν•˜ν•™μ  ꡬ쑰λ₯Ό λ™μΌν•œ 재질 ν•˜μ— ν•˜λ‚˜λ‘œ λ¬Άμ–΄ μ²˜λ¦¬ν•˜λŠ” `BatchedMesh`, 그리고 정적 객체듀을 λ‘œλ“œ μ‹œμ μ— λ³‘ν•©ν•΄λ²„λ¦¬λŠ” `BufferGeometryUtils.mergeBufferGeometries` 기법을 μ§€μ›ν•œλ‹€ [11-15]. * **WebGPU와 TSL(Three Shader Language)의 λ„μž…:** 릴리즈 r171λΆ€ν„° λ„μž…λœ WebGPURendererλŠ” `forceWebGL`이 ν•„μš”ν•œ 상황을 μ œμ™Έν•˜λ©΄ WebGL 2 μžλ™ 폴백 κΈ°λŠ₯을 μ§€μ›ν•˜λŠ” "제둜 μ„€μ •(zero-config)" λ°©μ‹μœΌλ‘œ μ‰½κ²Œ μ μš©ν•  수 μžˆλ‹€ [4, 5, 16]. μƒˆλ‘­κ²Œ λ„μž…λœ TSL은 단일 μ½”λ“œλ‘œ WGSLκ³Ό GLSL μ–‘μͺ½ λͺ¨λ‘μ— μ»΄νŒŒμΌλ˜λŠ” λ…Έλ“œ 기반의 재질 μ‹œμŠ€ν…œμ΄λ©°, μ»΄ν“¨νŠΈ 셰이더(Compute Shaders)λ₯Ό 톡해 물리 μ—°μ‚°, 좩돌 감지, 수백만 λ‹¨μœ„μ˜ λŒ€κ·œλͺ¨ νŒŒν‹°ν΄ μ‹œμŠ€ν…œ λ Œλ”λ§ λ“± 병렬 처리λ₯Ό GPU둜 μ˜€ν”„λ‘œλ”©ν•  수 있게 ν•΄μ€€λ‹€ [5, 17-20]. * **λ©”λͺ¨λ¦¬ 및 μ• μ…‹ κ΄€λ¦¬μ˜ μ€‘μš”μ„±:** Three.jsλŠ” GPU λ¦¬μ†ŒμŠ€λ₯Ό μžλ™μœΌλ‘œ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜(Garbage Collection)ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ, μ‚¬μš©μ΄ λλ‚œ μ§€μ˜€λ©”νŠΈλ¦¬, 재질, ν…μŠ€μ²˜λŠ” λ°˜λ“œμ‹œ `.dispose()` λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄ λͺ…μ‹œμ μœΌλ‘œ ν•΄μ œν•΄μ•Όλ§Œ VRAM λˆ„μˆ˜λ₯Ό 막을 수 μžˆλ‹€ [21, 22]. λͺ¨λΈ λ‘œλ“œ μ‹œ λŒ€μ—­ν­κ³Ό λ©”λͺ¨λ¦¬λ₯Ό 아끼기 μœ„ν•΄ Draco μ§€μ˜€λ©”νŠΈλ¦¬ μ••μΆ•, KTX2 및 Basis Universalκ³Ό 같은 GPU λ„€μ΄ν‹°λΈŒ ν…μŠ€μ²˜ μ••μΆ• 기술이 ν•„μˆ˜μ μ΄λ©° [23-25], 카메라 거리에 따라 λ‹€κ°ν˜• 수λ₯Ό μ‘°μ ˆν•˜λŠ” LOD(Level of Detail) κΈ°λŠ₯으둜 λ Œλ”λ§ λΆ€ν•˜λ₯Ό λ™μ μœΌλ‘œ 쀄일 수 μžˆλ‹€ [26-28]. * **μΈμŠ€ν„΄μ‹±(Instancing)의 ꡬ쑰적 ν•œκ³„:** `InstancedMesh`λŠ” μ„±λŠ₯ ν–₯상에 ν•„μˆ˜μ μΈ λ„κ΅¬μ§€λ§Œ λͺ‡ κ°€μ§€ ν•œκ³„κ°€ μžˆλ‹€. μ—”μ§„ μˆ˜μ€€μ—μ„œ 전체 μΈμŠ€ν„΄μŠ€λ₯Ό μ•„μš°λ₯΄λŠ” ν•˜λ‚˜μ˜ 경계 λ³Όλ₯¨(Bounding Volume)을 κΈ°μ€€μœΌλ‘œ μ‹œμ•Ό μ ˆλ‘μ²΄ 컬링(Frustum Culling)을 μ²˜λ¦¬ν•˜κΈ° λ•Œλ¬Έμ—, μ‹œμ•Ό 밖에 μžˆλŠ” μΈμŠ€ν„΄μŠ€μ— λŒ€ν•΄μ„œλ„ GPU 정점 연산을 μˆ˜ν–‰ν•˜λŠ” λΉ„νš¨μœ¨μ΄ λ°œμƒν•œλ‹€ [29, 30]. λ˜ν•œ, κ°μ²΄λ“€μ˜ 심도에 λ”°λ₯Έ μžλ™ μ •λ ¬(Depth Sorting)을 μ œκ³΅ν•˜μ§€ μ•Šμ•„, 투λͺ…ν•œ 객체가 겹쳐 μžˆκ±°λ‚˜ λ³΅μž‘ν•œ 셰이더λ₯Ό μ‚¬μš©ν•  경우 μ‹¬κ°ν•œ μ˜€λ²„λ“œλ‘œμš°(Overdraw)λ₯Ό μœ λ°œν•˜μ—¬ GPU ν”„λž˜κ·Έλ¨ΌνŠΈ 처리 병λͺ©μ„ μ΄ˆλž˜ν•  수 μžˆλ‹€ [31-34]. * **μ‚¬μš©μž μž…λ ₯κ³Ό λ ˆμ΄μΊμŠ€νŒ…(Raycasting):** μ‚¬μš©μžμ˜ λ§ˆμš°μŠ€λ‚˜ ν„°μΉ˜ μž…λ ₯을 ν†΅ν•œ ν™”λ©΄ μƒμ˜ 3D 객체 선택(ν”Όν‚Ή)은 `Raycaster` 객체λ₯Ό 톡해 μˆ˜ν–‰λœλ‹€ [35, 36]. ν•˜μ§€λ§Œ `InstancedMesh`μ—μ„œ κ°œλ³„ μΈμŠ€ν„΄μŠ€μ˜ ν–‰λ ¬(μœ„μΉ˜/νšŒμ „/μΆ•μ²™)을 λ™μ μœΌλ‘œ λ³€κ²½ν•  경우, λ ˆμ΄μΊμŠ€νŒ…μ΄ 정상 μž‘λ™ν•˜λ €λ©΄ λ³€κ²½ 직후 λ°˜λ“œμ‹œ `.computeBoundingSphere()` 및 `.computeBoundingBox()`λ₯Ό ν˜ΈμΆœν•˜μ—¬ λ°”μš΄λ”© λ³Όλ₯¨μ„ κ°±μ‹ ν•΄μ•Ό ν•œλ‹€ [37, 38]. λ‹€λŸ‰μ˜ μΈμŠ€ν„΄μŠ€κ°€ μ‘΄μž¬ν•˜λŠ” ν™˜κ²½μ—μ„œ 좩돌 및 μ„ νƒμ˜ 속도λ₯Ό 높이렀면 `three-mesh-bvh` 같은 곡간 λΆ„ν• (Spatial Indexing) 라이브러리λ₯Ό ν™œμš©ν•˜λŠ” 것이 ꢌμž₯λœλ‹€ [39, 40]. ## πŸ”— Knowledge Connections - **Related Topics:** [[WebGPU|WebGPU]], [[InstancedMesh|InstancedMesh]], [[BatchedMesh|BatchedMesh]], [[TSL (Three Shader Language)|TSL (Three Shader Language)]], [[Raycaster|Raycaster]], [[α„€α…‘α„‡α…§α†«α„Œα…₯ᆨ LOD(Level of Detail) 사스템|LOD (Level of Detail)]] - **Projects/Contexts:** [[React Three Fiber (R3F)|React Three Fiber (R3F)]], [[IFC.js|IFC.js]], [[InstancedMesh2|InstancedMesh2]] - **Contradictions/Notes:** 일반적으둜 `InstancedMesh`λŠ” λ“œλ‘œμš° μ½œμ„ 1회둜 쀄여 λ Œλ”λ§ μ„±λŠ₯을 획기적으둜 높인닀고 μ•Œλ €μ Έ μžˆμœΌλ‚˜, μΈμŠ€ν„΄μŠ€μ˜ μžλ™ μ •λ ¬ κΈ°λŠ₯이 μ—†μ–΄ μ˜€λ²„λ“œλ‘œμš°(Overdraw)κ°€ λΉˆλ²ˆν•˜κ²Œ λ°œμƒν•  경우 단일 메쉬λ₯Ό λΆ„ν• ν•˜μ—¬ 그릴 λ•Œλ³΄λ‹€ 였히렀 ν”„λ ˆμž„ 속도(FPS)κ°€ 급락할 수 μžˆμŠ΅λ‹ˆλ‹€ [4, 31-33]. λ˜ν•œ μ—¬λŸ¬ λ‹€λ₯Έ μ§€μ˜€λ©”νŠΈλ¦¬λ₯Ό ν•˜λ‚˜μ˜ λ Œλ” 호좜둜 λ¬Άμ–΄μ£ΌλŠ” `BatchedMesh` μ—­μ‹œ, μ§€λ‚˜μΉ˜κ²Œ λ§Žμ€ 수의 정점과 데이터λ₯Ό λ Œλ”λ§ν•  경우 νŒ¨ν‚Ή 및 컬링 μ—°μ‚° λ•Œλ¬Έμ— κ·Ήμ‹¬ν•œ CPU κ³ΌλΆ€ν•˜μ™€ μ„±λŠ₯ μ €ν•˜λ₯Ό μ•ΌκΈ°ν•  수 μžˆλ‹€λŠ” ν•œκ³„κ°€ 보고되고 μžˆμŠ΅λ‹ˆλ‹€ [41, 42]. --- *Last updated: 2026-04-19*