Skip to content

youjuice/webgl-raytracer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

42 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

BVH ๊ธฐ๋ฐ˜ ๋ ˆ์ด ํŠธ๋ ˆ์ด์‹ฑ ํ”„๋กœ์ ํŠธ

์ด ํ”„๋กœ์ ํŠธ๋Š” Bounding Volume Hierarchy (BVH)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์ ํ™”๋œ ๋ ˆ์ด ํŠธ๋ ˆ์ด์‹ฑ ๋ Œ๋”๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. BabylonJS๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, WebGL ์…ฐ์ด๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GPU์—์„œ ๋ ˆ์ด ํŠธ๋ ˆ์ด์‹ฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.


ํ”„๋กœ์ ํŠธ ์„ค์ • ๋ฐ ์‹คํ–‰ ๋ฐฉ๋ฒ•

  1. ํ•„์š”ํ•œ ์ข…์†์„ฑ ์„ค์น˜
    npm install
    
  2. ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰
    npm run start
    
  3. ๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:9000 (๋˜๋Š” ํ„ฐ๋ฏธ๋„์— ํ‘œ์‹œ๋œ URL)์„ ์—ด์–ด ํ”„๋กœ์ ํŠธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๋ฏธ๋ฆฌ๋ณด๊ธฐ

BVH ๋ฏธ์‚ฌ์šฉ BVH ์‚ฌ์šฉ
BVH ๋ฏธ์‚ฌ์šฉ ๋ Œ๋”๋ง BVH ์‚ฌ์šฉ ๋ Œ๋”๋ง

์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ (10์ดˆ ๋™์•ˆ ์ธก์ •)

์ธก์ • ํ•ญ๋ชฉ 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๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ๊ฐ€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋‚ฎ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ์„ค๋ช…๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  1. ์ ์€ ์ˆ˜์˜ ๊ฐ์ฒด: ํ˜„์žฌ ์žฅ๋ฉด์—๋Š” ๋น„๊ต์  ์ ์€ ์ˆ˜์˜ ๊ตฌ์ฒด๋งŒ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. BVH๋Š” ๋งŽ์€ ์ˆ˜์˜ ๊ฐ์ฒด๊ฐ€ ์žˆ์„ ๋•Œ ๋” ํšจ๊ณผ์ ์ด๋ฉฐ, ๊ฐ์ฒด ์ˆ˜๊ฐ€ ์ ์„ ๋•Œ๋Š” ์˜คํžˆ๋ ค ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์ตœ์ ํ™” ์—ฌ์ง€: ํ˜„์žฌ BVH ๊ตฌํ˜„์€ ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ๋กœ, ์ถ”๊ฐ€์ ์ธ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ ๊นŠ์ด ์กฐ์ ˆ, ๋ฆฌํ”„ ๋…ธ๋“œ์˜ ํฌ๊ธฐ ์ตœ์ ํ™” ๋“ฑ์ด ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ๋„์›€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ํ…์Šค์ฒ˜ ์ ‘๊ทผ ์˜ค๋ฒ„ํ—ค๋“œ: BVH ๋ฐ์ดํ„ฐ๋ฅผ ํ…์Šค์ฒ˜๋กœ ์ „๋‹ฌํ•˜๊ณ  GPU์—์„œ ์ด๋ฅผ ์ฝ๋Š” ๊ณผ์ •์ด ์ถ”๊ฐ€๋˜์–ด, ๊ฐ„๋‹จํ•œ ์žฅ๋ฉด์—์„œ๋Š” ์ด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๊ตฌํ˜„ ๋‚ด์šฉ

AABB (Axis-Aligned Bounding Box)

AABB๋Š” AABB.ts์—์„œ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

  • 3D ๊ณต๊ฐ„์—์„œ ์ถ•์— ์ •๋ ฌ๋œ ๊ฒฝ๊ณ„ ์ƒ์ž๋ฅผ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • ์ตœ์†Œ์ (min)๊ณผ ์ตœ๋Œ€์ (max)์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค.
  • ์ถฉ๋Œ ๊ฒ€์‚ฌ์™€ BVH ๊ตฌ์ถ•์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

BVH (Bounding Volume Hierarchy)

BVH๋Š” BVHBuilder.ts์™€ BVHNode.ts์—์„œ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • SAH (Surface Area Heuristic)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์ ์˜ ๋ถ„ํ•  ์ง€์ ์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
  • ์žฌ๊ท€์ ์œผ๋กœ BVH ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ BVH ๋…ธ๋“œ๋Š” ๋‹ค์Œ ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค:
    • aabb: Axis-Aligned Bounding Box
    • left: ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ
    • right: ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ
    • primitiveIndices: ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ(๊ตฌ์ฒด) ์ธ๋ฑ์Šค ๋ฐฐ์—ด
  • ๋…ธ๋“œ๋‹น ์ตœ๋Œ€ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ ์ˆ˜๋ฅผ ์ œํ•œํ•˜๊ณ  ์ตœ๋Œ€ ๊นŠ์ด๋ฅผ ์„ค์ •ํ•˜์—ฌ ํŠธ๋ฆฌ์˜ ๊นŠ์ด๋ฅผ ์กฐ์ ˆํ•ฉ๋‹ˆ๋‹ค.

BVH ํ‰ํƒ„ํ™”

BVHFlattener.ts์—์„œ ๊ตฌํ˜„๋œ BVH ํ‰ํƒ„ํ™”๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค:

  • ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ 1์ฐจ์› ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ๋…ธ๋“œ๋Š” 8๊ฐœ์˜ float ๊ฐ’์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. (AABB min/max, ์ž์‹ ๋…ธ๋“œ ์ •๋ณด ๋“ฑ)
  • ํ‰ํƒ„ํ™”๋œ ๊ตฌ์กฐ๋Š” GPU์—์„œ ํšจ์œจ์ ์œผ๋กœ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Ray Tracing

๋ ˆ์ด ํŠธ๋ ˆ์ด์‹ฑ์€ ์ฃผ๋กœ raytracer.fragment.glsl์—์„œ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

  • ์นด๋ฉ”๋ผ ๋ ˆ์ด ์ƒ์„ฑ
  • BVH ์ˆœํšŒ๋ฅผ ํ†ตํ•œ ๊ต์ฐจ ํ…Œ์ŠคํŠธ
  • ๊ทธ๋ฆผ์ž ๋ฐ ๋ฐ˜์‚ฌ ๊ณ„์‚ฐ
  • ๊ฐ„๋‹จํ•œ ์กฐ๋ช… ๋ชจ๋ธ ์ ์šฉ

๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ

Raytracer.ts์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ฃผ์š” ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • BabylonJS์˜ ShaderMaterial์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปค์Šคํ…€ ์…ฐ์ด๋” ์ ์šฉ
  • ํ‰ํƒ„ํ™”๋œ BVH ๋ฐ์ดํ„ฐ๋ฅผ Texture๋กœ GPU์— ์ „๋‹ฌ
  • ์นด๋ฉ”๋ผ ๋ฐ ์žฅ๋ฉด ์ •๋ณด๋ฅผ ์…ฐ์ด๋”์— ์ „๋‹ฌ

์„ฑ๋Šฅ ์ตœ์ ํ™”

  • BVH๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ ˆ์ด-์˜ค๋ธŒ์ ํŠธ ๊ต์ฐจ ํ…Œ์ŠคํŠธ ์ตœ์ ํ™”
  • GPU์—์„œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์…ฐ์ด๋” ๊ตฌํ˜„
  • ํ…์Šค์ฒ˜๋ฅผ ์ด์šฉํ•œ ํšจ์œจ์ ์ธ BVH ๋ฐ์ดํ„ฐ ์ „์†ก

ํ–ฅํ›„ ๊ฐœ์„  ์‚ฌํ•ญ

  • ๊ตฌ์ฒด ๋ Œ๋”๋ง์˜ ์ •ํ™•๋„ ํ–ฅ์ƒ: ํ˜„์žฌ ์ผ๋ถ€ ๊ตฌ์ฒด๊ฐ€ ์ œ๋Œ€๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ
  • ๋” ๋ณต์žกํ•œ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ ์ง€์› (์˜ˆ: ์‚ผ๊ฐํ˜• ๋ฉ”์‹œ)
  • BVH ๊ตฌ์ถ• ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐœ์„ ์„ ํ†ตํ•œ ์„ฑ๋Šฅ ํ–ฅ์ƒ

About

๐ŸงŠ WebGL-based Ray Tracer

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published