์ด ํ๋ก์ ํธ๋ Bounding Volume Hierarchy (BVH)๋ฅผ ์ฌ์ฉํ์ฌ ์ต์ ํ๋ ๋ ์ด ํธ๋ ์ด์ฑ ๋ ๋๋ฌ๋ฅผ ๊ตฌํํฉ๋๋ค. BabylonJS๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ, WebGL ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํ์ฌ GPU์์ ๋ ์ด ํธ๋ ์ด์ฑ์ ์ํํฉ๋๋ค.
- ํ์ํ ์ข
์์ฑ ์ค์น
npm install - ๊ฐ๋ฐ ์๋ฒ ์คํ
npm run start - ๋ธ๋ผ์ฐ์ ์์
http://localhost:9000(๋๋ ํฐ๋ฏธ๋์ ํ์๋ URL)์ ์ด์ด ํ๋ก์ ํธ๋ฅผ ํ์ธํฉ๋๋ค.
| BVH ๋ฏธ์ฌ์ฉ | BVH ์ฌ์ฉ |
|---|---|
![]() |
![]() |
| ์ธก์ ํญ๋ชฉ | BVH ๋ฏธ์ฌ์ฉ | BVH ์ฌ์ฉ |
|---|---|---|
| Frames | 124 | 46 |
| Average FPS | 12.39 | 4.57 |
| Average Frame Time | 0.39 ms | 0.60 ms |
| Average Render Time | 0.22 ms | 0.35 ms |
| Average Active Meshes Evaluation Time | 0.07 ms | 0.10 ms |
| Draw Calls | 1 | 1 |
ํ์ฌ ๊ตฌํ์์๋ BVH๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ๊ฐ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ๋ณด๋ค ์ฑ๋ฅ์ด ๋ฎ์์ ์ ์ ์์ต๋๋ค. ์ด๋ ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ์ค๋ช ๋ ์ ์์ต๋๋ค:
- ์ ์ ์์ ๊ฐ์ฒด: ํ์ฌ ์ฅ๋ฉด์๋ ๋น๊ต์ ์ ์ ์์ ๊ตฌ์ฒด๋ง ํฌํจ๋์ด ์์ต๋๋ค. BVH๋ ๋ง์ ์์ ๊ฐ์ฒด๊ฐ ์์ ๋ ๋ ํจ๊ณผ์ ์ด๋ฉฐ, ๊ฐ์ฒด ์๊ฐ ์ ์ ๋๋ ์คํ๋ ค ์ค๋ฒํค๋๊ฐ ๋ ์ ์์ต๋๋ค.
- ์ต์ ํ ์ฌ์ง: ํ์ฌ BVH ๊ตฌํ์ ๊ธฐ๋ณธ์ ์ธ ํํ๋ก, ์ถ๊ฐ์ ์ธ ์ต์ ํ๊ฐ ํ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํธ๋ฆฌ ๊ตฌ์กฐ์ ๊น์ด ์กฐ์ , ๋ฆฌํ ๋ ธ๋์ ํฌ๊ธฐ ์ต์ ํ ๋ฑ์ด ์ฑ๋ฅ ํฅ์์ ๋์๋ ์ ์์ต๋๋ค.
- ํ ์ค์ฒ ์ ๊ทผ ์ค๋ฒํค๋: BVH ๋ฐ์ดํฐ๋ฅผ ํ ์ค์ฒ๋ก ์ ๋ฌํ๊ณ GPU์์ ์ด๋ฅผ ์ฝ๋ ๊ณผ์ ์ด ์ถ๊ฐ๋์ด, ๊ฐ๋จํ ์ฅ๋ฉด์์๋ ์ด ์ค๋ฒํค๋๊ฐ ์ฑ๋ฅ ์ ํ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค.
AABB๋ AABB.ts์์ ๊ตฌํ๋์์ต๋๋ค:
- 3D ๊ณต๊ฐ์์ ์ถ์ ์ ๋ ฌ๋ ๊ฒฝ๊ณ ์์๋ฅผ ํํํฉ๋๋ค.
- ์ต์์ (min)๊ณผ ์ต๋์ (max)์ผ๋ก ์ ์๋ฉ๋๋ค.
- ์ถฉ๋ ๊ฒ์ฌ์ BVH ๊ตฌ์ถ์ ์ฌ์ฉ๋ฉ๋๋ค.
BVH๋ BVHBuilder.ts์ BVHNode.ts์์ ๊ตฌํ๋์์ต๋๋ค. ์ฃผ์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- SAH (Surface Area Heuristic)๋ฅผ ์ฌ์ฉํ์ฌ ์ต์ ์ ๋ถํ ์ง์ ์ ์ฐพ์ต๋๋ค.
- ์ฌ๊ท์ ์ผ๋ก BVH ํธ๋ฆฌ๋ฅผ ๊ตฌ์ถํฉ๋๋ค.
- ๊ฐ BVH ๋
ธ๋๋ ๋ค์ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค:
aabb: Axis-Aligned Bounding Boxleft: ์ผ์ชฝ ์์ ๋ ธ๋right: ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋primitiveIndices: ํ๋ฆฌ๋ฏธํฐ๋ธ(๊ตฌ์ฒด) ์ธ๋ฑ์ค ๋ฐฐ์ด
- ๋ ธ๋๋น ์ต๋ ํ๋ฆฌ๋ฏธํฐ๋ธ ์๋ฅผ ์ ํํ๊ณ ์ต๋ ๊น์ด๋ฅผ ์ค์ ํ์ฌ ํธ๋ฆฌ์ ๊น์ด๋ฅผ ์กฐ์ ํฉ๋๋ค.
BVHFlattener.ts์์ ๊ตฌํ๋ BVH ํํํ๋ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ ๊ฐ์ง๋๋ค:
- ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ 1์ฐจ์ ๋ฐฐ์ด๋ก ๋ณํํฉ๋๋ค.
- ๊ฐ ๋ ธ๋๋ 8๊ฐ์ float ๊ฐ์ผ๋ก ํํ๋ฉ๋๋ค. (AABB min/max, ์์ ๋ ธ๋ ์ ๋ณด ๋ฑ)
- ํํํ๋ ๊ตฌ์กฐ๋ GPU์์ ํจ์จ์ ์ผ๋ก ์ํํ ์ ์์ต๋๋ค.
๋ ์ด ํธ๋ ์ด์ฑ์ ์ฃผ๋ก raytracer.fragment.glsl์์ ๊ตฌํ๋์์ต๋๋ค:
- ์นด๋ฉ๋ผ ๋ ์ด ์์ฑ
- BVH ์ํ๋ฅผ ํตํ ๊ต์ฐจ ํ ์คํธ
- ๊ทธ๋ฆผ์ ๋ฐ ๋ฐ์ฌ ๊ณ์ฐ
- ๊ฐ๋จํ ์กฐ๋ช ๋ชจ๋ธ ์ ์ฉ
Raytracer.ts์์ ๊ด๋ฆฌ๋๋ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ์ฃผ์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- BabylonJS์ ShaderMaterial์ ์ฌ์ฉํ์ฌ ์ปค์คํ ์ ฐ์ด๋ ์ ์ฉ
- ํํํ๋ BVH ๋ฐ์ดํฐ๋ฅผ Texture๋ก GPU์ ์ ๋ฌ
- ์นด๋ฉ๋ผ ๋ฐ ์ฅ๋ฉด ์ ๋ณด๋ฅผ ์ ฐ์ด๋์ ์ ๋ฌ
- BVH๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์ด-์ค๋ธ์ ํธ ๊ต์ฐจ ํ ์คํธ ์ต์ ํ
- GPU์์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ ฐ์ด๋ ๊ตฌํ
- ํ ์ค์ฒ๋ฅผ ์ด์ฉํ ํจ์จ์ ์ธ BVH ๋ฐ์ดํฐ ์ ์ก
- ๊ตฌ์ฒด ๋ ๋๋ง์ ์ ํ๋ ํฅ์: ํ์ฌ ์ผ๋ถ ๊ตฌ์ฒด๊ฐ ์ ๋๋ก ํ์๋์ง ์๋ ๋ฌธ์ ํด๊ฒฐ
- ๋ ๋ณต์กํ ์ง์ค๋ฉํธ๋ฆฌ ์ง์ (์: ์ผ๊ฐํ ๋ฉ์)
- BVH ๊ตฌ์ถ ์๊ณ ๋ฆฌ์ฆ ๊ฐ์ ์ ํตํ ์ฑ๋ฅ ํฅ์

