๊ฒฌ๊ณ ํ AR ์คํด๋ฃจ์ ๋ฐ ์ํธ์์ฉ์ ์ํ WebXR ๊น์ด ๋ฒํผ ํด์๋ ๊ด๋ฆฌ, ์ํฐํฉํธ ํํฐ๋ง, ํ์ง ๊ด๋ฆฌ ๊ตฌํ์ ๋ํ ๊ฐ๋ฐ์ ์ฌ์ธต ๊ฐ์ด๋์ ๋๋ค.
WebXR ๊น์ด ๋ง์คํฐํ๊ธฐ: ๊น์ด ๋ฒํผ ํด์๋ ๋ฐ ํ์ง ๊ด๋ฆฌ์ ๋ํ ์ฌ์ธต ๋ถ์
์ฆ๊ฐ ํ์ค(AR)์ ๊ณต์ ๊ณผํ์ ๋ฌธํฑ์ ๋์ด ๋์งํธ ์ ๋ณด์์ ์ํธ์์ฉ ๋ฐฉ์์ ์ฌํธํ๋ ์ค์ง์ ์ด๊ณ ๊ฐ๋ ฅํ ๋๊ตฌ๊ฐ ๋์์ต๋๋ค. AR์ ๋ง๋ฒ์ ๊ฐ์๊ณผ ํ์ค์ ๋งค๋๋ฝ๊ฒ ์ตํฉํ๋ ๋ฅ๋ ฅ์ ์์ต๋๋ค. ๊ฐ์ ์บ๋ฆญํฐ๊ฐ ๊ฑฐ์ค ๊ฐ๊ตฌ๋ฅผ ๋์๋ค๋๊ณ , ๋์งํธ ์ธก์ ๋๊ตฌ๊ฐ ์ค์ ๋ฌผ์ฒด์ ํฌ๊ธฐ๋ฅผ ์ ํํ๊ฒ ์ธก์ ํ๋ฉฐ, ๊ฐ์์ ์์ ์ํ์ด ์ค์ ๊ธฐ๋ฅ ๋ค์ ์ ํํ ์จ๊ฒจ์ง๋ ๋ฑ์ ๊ฒฝํ์ ๋ชจ๋ ํ๋์ ํต์ฌ ๊ธฐ์ , ์ฆ ์ค์๊ฐ ํ๊ฒฝ ์ดํด์ ๋ฌ๋ ค์์ต๋๋ค. ์น ๊ธฐ๋ฐ AR์์ ์ด๋ฌํ ์ดํด์ ์ค์ฌ์๋ WebXR ๊น์ด API(WebXR Depth API)๊ฐ ์์ต๋๋ค.
๊น์ด API๋ ๊ฐ๋ฐ์์๊ฒ ๋๋ฐ์ด์ค ์นด๋ฉ๋ผ์ ๋ณด์ด๋ ์ค์ ์ธ๊ณ์ ์ง์ค๋ฉํธ๋ฆฌ์ ๋ํ ํ๋ ์๋ณ ์ถ์ ์น๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋์ค ๋งต(depth map)์ผ๋ก ์๋ ค์ง ์ด ๋ฐ์ดํฐ๋ ์คํด๋ฃจ์ , ์ฌ์ค์ ์ธ ๋ฌผ๋ฆฌ ํจ๊ณผ, ํ๊ฒฝ ๋ฉ์ฑ๊ณผ ๊ฐ์ ์ ๊ตํ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ์ด์ ์ ๋๋ค. ํ์ง๋ง ์ด ๊น์ด ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ ๊ฒ์ ์ฒซ ๋จ๊ณ์ ๋ถ๊ณผํฉ๋๋ค. ์์(raw) ๊น์ด ์ ๋ณด๋ ์ข ์ข ๋ ธ์ด์ฆ๊ฐ ๋ง๊ณ ์ผ๊ด์ฑ์ด ์์ผ๋ฉฐ, ๋ฉ์ธ ์นด๋ฉ๋ผ ํผ๋๋ณด๋ค ํด์๋๊ฐ ๋ฎ์ต๋๋ค. ์ ๋๋ก ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด ์คํด๋ฃจ์ ์ด ๊น๋ฐ๊ฑฐ๋ฆฌ๊ฑฐ๋, ๋ฌผ๋ฆฌ ํจ๊ณผ๊ฐ ๋ถ์์ ํด์ง๊ณ , ๋ชฐ์ ๊ฐ ์๋ ํ์์ด ์ ๋ฐ์ ์ผ๋ก ๊นจ์ง ์ ์์ต๋๋ค.
์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ ๊ธฐ๋ณธ์ ์ธ AR์ ๋์ด ์ง์ ์ผ๋ก ๊ฒฌ๊ณ ํ๊ณ ์ ๋ขฐ์ฑ ์๋ ๊ฒฝํ์ ์์ญ์ผ๋ก ๋์๊ฐ๊ณ ์ ํ๋ WebXR ๊ฐ๋ฐ์๋ค์ ์ํ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊น์ด ๋ฒํผ ํด์๋์ ๊ฐ๋ ์ ๋ถ์ํ๊ณ , ๊ทธ ํ์ง์ ์ ํ์ํค๋ ์์ธ๋ค์ ํ๊ตฌํ๋ฉฐ, ํ์ง ๊ด๋ฆฌ, ํํฐ๋ง, ๊ฒ์ฆ์ ์ํ ์ค์ฉ์ ์ธ ๊ธฐ์ ๋๊ตฌ ์์๋ฅผ ์ ๊ณตํ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ๊ฐ๋ ์ ๋ง์คํฐํจ์ผ๋ก์จ ์ฌ๋ฌ๋ถ์ ๋ ธ์ด์ฆ๊ฐ ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฐจ์ธ๋ AR ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ์์ ์ ์ด๊ณ ์ ๋ขฐํ ์ ์๋ ๊ธฐ๋ฐ์ผ๋ก ๋ณํํ ์ ์์ต๋๋ค.
์ 1์ฅ: WebXR ๊น์ด API์ ๊ธฐ์ด
๋์ค ๋งต ํ์ง์ ์ ์ดํ๊ธฐ ์ ์, ๋จผ์ ๊ทธ๊ฒ์ด ๋ฌด์์ด๋ฉฐ ์ด๋ป๊ฒ ์ ๊ทผํ๋์ง ์ดํดํด์ผ ํฉ๋๋ค. WebXR ๊น์ด ๊ฐ์ง API(WebXR Depth Sensing API)๋ ๋๋ฐ์ด์ค์ ์ผ์๊ฐ ์บก์ฒํ ๊น์ด ์ ๋ณด๋ฅผ ๋ ธ์ถํ๋ WebXR ๋๋ฐ์ด์ค API ๋ด์ ๋ชจ๋์ ๋๋ค.
๋์ค ๋งต์ด๋ ๋ฌด์์ธ๊ฐ?
์ฌ์ง์ ์ฐ๋๋ค๊ณ ์์ํด ๋ณด์ธ์. ํ์ง๋ง ๊ฐ ํฝ์ ์ ์์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๋์ , ์นด๋ฉ๋ผ์์ ํด๋น ํฝ์ ์ด ๋ํ๋ด๋ ๊ฐ์ฒด๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํฉ๋๋ค. ์ด๊ฒ์ด ๋ณธ์ง์ ์ผ๋ก ๋์ค ๋งต์ ๋๋ค. ์ด๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ๊ทธ๋ ์ด์ค์ผ์ผ์ 2D ์ด๋ฏธ์ง๋ก, ํฝ์ ์ ๊ฐ๋๊ฐ ๊ฑฐ๋ฆฌ์ ํด๋นํฉ๋๋ค. ๋ฐ์ ํฝ์ ์ ๋ ๊ฐ๊น์ด ๊ฐ์ฒด๋ฅผ, ์ด๋์ด ํฝ์ ์ ๋ ๋จผ ๊ฐ์ฒด๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค(๋๋ ์๊ฐํ ๋ฐฉ์์ ๋ฐ๋ผ ๊ทธ ๋ฐ๋์ผ ์๋ ์์ต๋๋ค).
์ด ๋ฐ์ดํฐ๋ `XRDepthInformation.texture`๋ผ๋ ํ ์ค์ฒ ํํ๋ก ์ฌ๋ฌ๋ถ์ WebGL ์ปจํ ์คํธ์ ์ ๊ณต๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์ ฐ์ด๋ ๋ด์์ GPU๋ฅผ ํตํด ์ง์ ๋งค์ฐ ํจ์จ์ ์ธ ํฝ์ ๋ณ ๊น์ด ๊ณ์ฐ์ ์ํํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ค์๊ฐ AR์ ์ค์ํ ์ฑ๋ฅ ๊ณ ๋ ค ์ฌํญ์ ๋๋ค.
WebXR์ด ๊น์ด ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ
API๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์ WebXR ์ธ์ ์ ์ด๊ธฐํํ ๋ `depth-sensing` ๊ธฐ๋ฅ์ ์์ฒญํด์ผ ํฉ๋๋ค:
const session = await navigator.xr.requestSession('immersive-ar', { requiredFeatures: ['depth-sensing'] });
๋ฐ์ดํฐ ํ์ ๋ฐ ์ฌ์ฉ์ ๋ํ ์ ํธ๋๋ฅผ ์ง์ ํ ์๋ ์์ผ๋ฉฐ, ์ด๋ ์ฑ๋ฅ ์น์ ์์ ๋์ค์ ์ดํด๋ณผ ๊ฒ์ ๋๋ค. ์ธ์ ์ด ํ์ฑํ๋๋ฉด, `requestAnimationFrame` ๋ฃจํ ๋ด์์ WebGL ๋ ์ด์ด๋ก๋ถํฐ ์ต์ ๊น์ด ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค:
const depthInfo = xrWebView.getDepthInformation(xrFrame.getViewerPose(xrReferenceSpace));
`depthInfo`๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ, ์ฌ๊ธฐ์๋ ๋ช ๊ฐ์ง ์ค์ํ ์ ๋ณด๊ฐ ํฌํจ๋ฉ๋๋ค:
- texture: ์์ ๊น์ด ๊ฐ์ ํฌํจํ๋ `WebGLTexture`์ ๋๋ค.
- normDepthFromViewMatrix: ๋ทฐ ๊ณต๊ฐ(view-space) ์ขํ๋ฅผ ์ ๊ทํ๋ ๊น์ด ํ ์ค์ฒ ์ขํ๋ก ๋ณํํ๋ ํ๋ ฌ์ ๋๋ค.
- rawValueToMeters: ํ ์ค์ฒ์ ๋จ์ ์๋ ์์ ๊ฐ์ ๋ฏธํฐ(meter) ๋จ์๋ก ๋ณํํ๋ ์ค์ผ์ผ๋ง ํฉํฐ์ ๋๋ค. ์ด๋ ์ ํํ ์ค์ ์ธ๊ณ ์ธก์ ์ ํ์์ ์ ๋๋ค.
์ด ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ ๊ธฐ๋ฐ ๊ธฐ์ ์ ๋๋ฐ์ด์ค๋ง๋ค ๋ค๋ฆ ๋๋ค. ์ผ๋ถ๋ ToF(Time-of-Flight)๋ ๊ตฌ์กฐ๊ด(Structured Light)๊ณผ ๊ฐ์ ์กํฐ๋ธ ์ผ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ธ์ ์ ํฌ์ฌํ๊ณ ๊ทธ ๋ฐ์ฌ๋ฅผ ์ธก์ ํฉ๋๋ค. ๋ค๋ฅธ ์ผ๋ถ๋ ๋ ์ด๋ฏธ์ง ๊ฐ์ ๋์์ ์ ์ฐพ์ ๊น์ด๋ฅผ ๊ณ์ฐํ๋ ์คํ ๋ ์ค์ค์ฝํฝ ์นด๋ฉ๋ผ์ ๊ฐ์ ํจ์๋ธ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค. ๊ฐ๋ฐ์๋ก์ ํ๋์จ์ด๋ฅผ ์ ์ดํ ์๋ ์์ง๋ง, ๊ทธ ํ๊ณ๋ฅผ ์ดํดํ๋ ๊ฒ์ ๊ทธ๊ฒ์ด ์์ฑํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ํต์ฌ์ ๋๋ค.
์ 2์ฅ: ๊น์ด ๋ฒํผ ํด์๋์ ๋ ๊ฐ์ง ์ธก๋ฉด
๊ฐ๋ฐ์๋ค์ด "ํด์๋"๋ผ๋ ๋ง์ ๋ค์ผ๋ฉด ์ข ์ข ์ด๋ฏธ์ง์ ๋๋น์ ๋์ด๋ฅผ ๋ ์ฌ๋ฆฝ๋๋ค. ๋์ค ๋งต์ ๊ฒฝ์ฐ, ์ด๊ฒ์ ์ด์ผ๊ธฐ์ ์ ๋ฐ์ ๋ถ๊ณผํฉ๋๋ค. ๊น์ด ํด์๋๋ ๋ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ ๊ฐ๋ ์ด๋ฉฐ, ๋ ๋ถ๋ถ ๋ชจ๋ ํ์ง์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
๊ณต๊ฐ ํด์๋: '๋ฌด์'๊ณผ '์ด๋'
๊ณต๊ฐ ํด์๋๋ 320x240 ๋๋ 640x480 ํฝ์ ๊ณผ ๊ฐ์ ๊น์ด ํ ์ค์ฒ์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ ๋๋ค. ์ด๋ ์ข ์ข ๋๋ฐ์ด์ค์ ์ปฌ๋ฌ ์นด๋ฉ๋ผ ํด์๋(1920x1080 ์ด์์ผ ์ ์์)๋ณด๋ค ํจ์ฌ ๋ฎ์ต๋๋ค. ์ด ๋ถ์ผ์น๋ AR ์ํฐํฉํธ์ ์ฃผ์ ์์ธ์ ๋๋ค.
- ๋ํ ์ผ์ ๋ฏธ์น๋ ์ํฅ: ๋ฎ์ ๊ณต๊ฐ ํด์๋๋ ๊ฐ ๊น์ด ํฝ์ ์ด ์ค์ ์ธ๊ณ์ ๋ ๋์ ์์ญ์ ์ปค๋ฒํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๋ก ์ธํด ๋ฏธ์ธํ ๋ํ ์ผ์ ์บก์ฒํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํด์ง๋๋ค. ํ ์ด๋ธ์ ๊ฐ์ฅ์๋ฆฌ๊ฐ ๊ฐ์ ธ ๋ณด์ผ ์ ์๊ณ , ์์ ๊ฐ๋ก๋ฑ ๊ธฐ๋ฅ์ด ์์ ํ ์ฌ๋ผ์ง ์ ์์ผ๋ฉฐ, ์๋ก ๊ฐ๊น์ด ์๋ ๊ฐ์ฒด ๊ฐ์ ๊ตฌ๋ถ์ด ๋ชจํธํด์ง๋๋ค.
- ์คํด๋ฃจ์ ์ ๋ฏธ์น๋ ์ํฅ: ์ด ๋ฌธ์ ๋ ์ฌ๊ธฐ์ ๊ฐ์ฅ ๋๋๋ฌ์ง๊ฒ ๋ํ๋ฉ๋๋ค. ๊ฐ์ ๊ฐ์ฒด๊ฐ ์ค์ ๊ฐ์ฒด ๋ค์ ๋ถ๋ถ์ ์ผ๋ก ์์ ๋, ์คํด๋ฃจ์ ๊ฒฝ๊ณ๋ฅผ ๋ฐ๋ผ ๋ํ๋๋ ์ ํด์๋์ "๊ณ๋จ ํ์" ์ํฐํฉํธ๋ ๋ช ๋ฐฑํ๋ฉฐ ๋ชฐ์ ์ ๋ฐฉํดํฉ๋๋ค.
์ ํด์๋ ์ฌ์ง๊ณผ ๊ฐ๋ค๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค. ์ ๋ฐ์ ์ธ ํํ๋ ์์๋ณผ ์ ์์ง๋ง, ๋ชจ๋ ๋ฏธ์ธํ ๋ํ ์ผ๊ณผ ์ ๋ช ํ ๊ฐ์ฅ์๋ฆฌ๋ ์ฌ๋ผ์ง๋๋ค. ๊ฐ๋ฐ์์ ๊ณผ์ ๋ ์ข ์ข ์ด ์ ํด์๋ ๋ฐ์ดํฐ๋ฅผ ์ง๋ฅ์ ์ผ๋ก "์ ์ํ๋ง"ํ๊ฑฐ๋ ๋ค๋ฃจ์ด ๊ณ ํด์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค.
๋นํธ ์ฌ๋(์ ๋ฐ๋): '์ผ๋ง๋ ๋ฉ๋ฆฌ'
๋นํธ ์ฌ๋, ์ฆ ์ ๋ฐ๋๋ ์ผ๋ง๋ ๋ง์ ๊ฐ๋ณ์ ์ธ ๊ฑฐ๋ฆฌ ๋จ๊ณ๋ฅผ ํํํ ์ ์๋์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์ด๊ฒ์ ๋์ค ๋งต์ ์๋ ๊ฐ ํฝ์ ๊ฐ์ ์์น์ ์ ๋ฐ๋์ ๋๋ค. WebXR API๋ 16๋นํธ ๋ถํธ ์๋ ์ ์(`ushort`)๋ 32๋นํธ ๋ถ๋ ์์์ ์(`float`)์ ๊ฐ์ ๋ค์ํ ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
- 8๋นํธ ๊น์ด (256 ๋จ๊ณ): 8๋นํธ ํ์์ 256๊ฐ์ ๊ฐ๋ณ์ ์ธ ๊ฑฐ๋ฆฌ๋ง ํํํ ์ ์์ต๋๋ค. 5๋ฏธํฐ ๋ฒ์์ ๊ฑธ์ณ ์ด๋ ๊ฐ ๋จ๊ณ๊ฐ ๊ฑฐ์ 2์ผํฐ๋ฏธํฐ ๋จ์ด์ ธ ์์์ ์๋ฏธํฉ๋๋ค. 1.00m์ 1.01m์ ์๋ ๊ฐ์ฒด๋ค์ด ๋์ผํ ๊น์ด ๊ฐ์ผ๋ก ํ ๋น๋ ์ ์์ผ๋ฉฐ, ์ด๋ "๊น์ด ์์ํ(depth quantization)" ๋๋ ๋ฐด๋ฉ(banding) ํ์์ ์ ๋ฐํฉ๋๋ค.
- 16๋นํธ ๊น์ด (65,536 ๋จ๊ณ): ์ด๊ฒ์ ์๋นํ ๊ฐ์ ์ด๋ฉฐ ์ผ๋ฐ์ ์ธ ํ์์ ๋๋ค. ํจ์ฌ ๋ ๋ถ๋๋ฝ๊ณ ์ ํํ ๊ฑฐ๋ฆฌ ํํ์ ์ ๊ณตํ์ฌ ์์ํ ์ํฐํฉํธ๋ฅผ ์ค์ด๊ณ ๋ ๋ฏธ๋ฌํ ๊น์ด ๋ณํ๋ฅผ ์บก์ฒํ ์ ์๊ฒ ํฉ๋๋ค.
- 32๋นํธ Float: ์ต๊ณ ์ ์ ๋ฐ๋๋ฅผ ์ ๊ณตํ๋ฉฐ ๊ณผํ์ ๋๋ ์ธก์ ์ฉ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด์์ ์ ๋๋ค. ์ ์ ํ์์ ๊ณ ์ ๋จ๊ณ ๋ฌธ์ ๋ฅผ ํผํ ์ ์์ง๋ง, ์ฑ๋ฅ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๋น์ฉ์ด ๋ ๋์ต๋๋ค.
๋ฎ์ ๋นํธ ์ฌ๋๋ "Z-ํ์ดํ (Z-fighting)"์ ์ ๋ฐํ ์ ์๋๋ฐ, ์ด๋ ์ฝ๊ฐ ๋ค๋ฅธ ๊น์ด์ ์๋ ๋ ํ๋ฉด์ด ์์ ๋ ๋๋ง๋๊ธฐ ์ํด ๊ฒฝ์ํ๋ฉด์ ๊น๋ฐ์ด๋ ํจ๊ณผ๋ฅผ ์ผ์ผํค๋ ํ์์ ๋๋ค. ๋ํ ๋งค๋๋ฌ์ด ํ๋ฉด์ด ๊ณ๋จ์์ด๋ ๋ ๋ชจ์์ผ๋ก ๋ณด์ด๊ฒ ๋ง๋ค๋ฉฐ, ์ด๋ ๊ฐ์ ๊ณต์ด ๋งค๋๋ฌ์ด ๊ฒฝ์ฌ๋ฉด ๋์ ์ผ๋ จ์ ๊ณ๋จ์ ๊ตด๋ฌ ๋ด๋ ค๊ฐ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์ ์์ ํนํ ๋๋๋ฌ์ง๋๋ค.
์ 3์ฅ: ํ์ค ์ธ๊ณ ๋ ์ด์์ ์ธ ๋์ค ๋งต: ํ์ง์ ์ํฅ์ ๋ฏธ์น๋ ์์ธ๋ค
์๋ฒฝํ ์ธ์์์๋ ๋ชจ๋ ๋์ค ๋งต์ด ์์ ์ฒ๋ผ ๋ง๊ณ , ๊ณ ํด์๋์ด๋ฉฐ, ํ์ค์ ์๋ฒฝํ๊ฒ ์ ํํ๊ฒ ํํํ ๊ฒ์ ๋๋ค. ์ค์ ๋ก๋ ๊น์ด ๋ฐ์ดํฐ๊ฐ ์ง์ ๋ถํ๊ณ ๊ด๋ฒ์ํ ํ๊ฒฝ ๋ฐ ํ๋์จ์ด ๊ธฐ๋ฐ ๋ฌธ์ ์ ์ทจ์ฝํฉ๋๋ค.
ํ๋์จ์ด ์์กด์ฑ
์์ ๋ฐ์ดํฐ์ ํ์ง์ ๊ทผ๋ณธ์ ์ผ๋ก ๋๋ฐ์ด์ค์ ํ๋์จ์ด์ ์ํด ์ ํ๋ฉ๋๋ค. ์ผ์๋ฅผ ๋ฐ๊ฟ ์๋ ์์ง๋ง, ์ผ๋ฐ์ ์ธ ์คํจ ์ง์ ์ ์ธ์งํ๋ ๊ฒ์ ๊ฒฌ๊ณ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
- ์ผ์ ์ ํ: ๋ง์ ๊ณ ๊ธ ๋ชจ๋ฐ์ผ ๋๋ฐ์ด์ค์์ ํํ ๋ณผ ์ ์๋ ToF(Time-of-Flight) ์ผ์๋ ์ผ๋ฐ์ ์ผ๋ก ์ฑ๋ฅ์ด ์ข์ง๋ง, ์ฃผ๋ณ ์ ์ธ์ (์: ๋ฐ์ ํ๋น)์ ์ํฅ์ ๋ฐ์ ์ ์์ต๋๋ค. ์คํ ๋ ์ค์ค์ฝํฝ ์์คํ ์ ํ๋ฒํ ํฐ ๋ฒฝ๊ณผ ๊ฐ์ด ์ง๊ฐ์ด ์๋ ํ๋ฉด์์ ์ด๋ ค์์ ๊ฒช์ ์ ์๋๋ฐ, ์ด๋ ๋ ์นด๋ฉ๋ผ ๋ทฐ ์ฌ์ด์์ ์ผ์น์ํฌ ๋๋ ทํ ํน์ง์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ๋๋ฐ์ด์ค ์ ์ ํ๋กํ: ๋ฐฐํฐ๋ฆฌ๋ฅผ ์ ์ฝํ๊ธฐ ์ํด ๋๋ฐ์ด์ค๋ ์๋์ ์ผ๋ก ๋ ๋ฎ์ ํด์๋๋ ๋ ธ์ด์ฆ๊ฐ ๋ ๋ง์ ๋์ค ๋งต์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ผ๋ถ ๋๋ฐ์ด์ค๋ ์ฌ์ง์ด ๋ค๋ฅธ ๊ฐ์ง ๋ชจ๋ ์ฌ์ด๋ฅผ ๋ฒ๊ฐ์ ๊ฐ๋ฉฐ ์ฌ์ฉํ์ฌ ํ์ง์ ๋์ ๋๋ ๋ณํ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค.
ํ์ง์ ์ ํดํ๋ ํ๊ฒฝ์ ์์ธ
์ฌ์ฉ์๊ฐ ์๋ ํ๊ฒฝ์ ๊น์ด ๋ฐ์ดํฐ ํ์ง์ ๋ง๋ํ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ฌ๋ฌ๋ถ์ AR ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ฌํ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ค์ ๋ํด ๋ณต์๋ ฅ์ ๊ฐ์ ธ์ผ ํฉ๋๋ค.
- ๊น๋ค๋ก์ด ํ๋ฉด ์์ฑ:
- ๋ฐ์ฌ ํ๋ฉด: ๊ฑฐ์ธ๊ณผ ๊ดํ์ด ๋๋ ๊ธ์์ ํฌํธ์ฒ๋ผ ์์ฉํ์ฌ ํ๋ฉด ์์ฒด๊ฐ ์๋ ๋ฐ์ฌ๋ ์ฅ๋ฉด์ ๊น์ด๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ด๋ ๋์ค ๋งต์ ๊ธฐ๊ดดํ๊ณ ๋ถ์ ํํ ์ง์ค๋ฉํธ๋ฆฌ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
- ํฌ๋ช ํ๋ฉด: ์ ๋ฆฌ์ ํฌ๋ช ํ๋ผ์คํฑ์ ์ข ์ข ๊น์ด ์ผ์์ ๋ณด์ด์ง ์์, ๊ทธ ๋ค์ ์๋ ๊ฒ์ ๋ํ ํฐ ๊ตฌ๋ฉ์ด๋ ๋ถ์ ํํ ๊น์ด ํ๋ ์ ์ด๋ํฉ๋๋ค.
- ์ด๋ก๊ฑฐ๋ ๋น์ ํก์ํ๋ ํ๋ฉด: ๋งค์ฐ ์ด๋ก๊ณ ๋ฌด๊ดํ์ธ ํ๋ฉด(๊ฒ์ ๋ฒจ๋ฒณ ๋ฑ)์ ์กํฐ๋ธ ์ผ์์ ์ ์ธ์ ์ ํก์ํ์ฌ ๋ฐ์ดํฐ๊ฐ ๋๋ฝ(๊ตฌ๋ฉ)๋ ์ ์์ต๋๋ค.
- ์กฐ๋ช ์กฐ๊ฑด: ๊ฐํ ํ๋น์ ToF ์ผ์๋ฅผ ์๋ํ์ฌ ์๋นํ ๋ ธ์ด์ฆ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋ฐ๋๋ก, ๋งค์ฐ ์ด๋์ด ์กฐ๋ช ์กฐ๊ฑด์ ๋ณด์ด๋ ํน์ง์ ์์กดํ๋ ํจ์๋ธ ์คํ ๋ ์ค ์์คํ ์ ์ด๋ ค์์ ์ค ์ ์์ต๋๋ค.
- ๊ฑฐ๋ฆฌ์ ๋ฒ์: ๋ชจ๋ ๊น์ด ์ผ์์๋ ์ต์ ์ ์๋ ๋ฒ์๊ฐ ์์ต๋๋ค. ๋๋ฌด ๊ฐ๊น์ด ๋ฌผ์ฒด๋ ์ด์ ์ด ๋ง์ง ์์ ์ ์์ผ๋ฉฐ, ๋ฉ๋ฆฌ ์๋ ๋ฌผ์ฒด์ ๋ํ ์ ํ๋๋ ํฌ๊ฒ ์ ํ๋ฉ๋๋ค. ๋๋ถ๋ถ์ ์๋น์์ฉ ์ผ์๋ ์ฝ 5-8๋ฏธํฐ๊น์ง๋ง ์ ๋ขฐํ ์ ์์ต๋๋ค.
- ๋ชจ์ ๋ธ๋ฌ: ๋๋ฐ์ด์ค๋ ์ฅ๋ฉด ์ ๊ฐ์ฒด์ ๋น ๋ฅธ ์์ง์์ ๋์ค ๋งต์ ๋ชจ์ ๋ธ๋ฌ๋ฅผ ์ผ์ผ์ผ ๊ฐ์ฅ์๋ฆฌ๊ฐ ๋ฒ์ง๊ณ ๋ถ์ ํํ ํ๋ ์ ์ด๋ํ ์ ์์ต๋๋ค.
์ 4์ฅ: ๊ฐ๋ฐ์์ ๋๊ตฌ ์์: ํ์ง ๊ด๋ฆฌ๋ฅผ ์ํ ์ค์ฉ์ ์ธ ๊ธฐ์
์ด์ ๋ฌธ์ ๋ค์ ์ดํดํ์ผ๋, ํด๊ฒฐ์ฑ ์ ์ง์คํด ๋ด ์๋ค. ๋ชฉํ๋ ์๋ฒฝํ ๋์ค ๋งต์ ์ป๋ ๊ฒ์ด ์๋๋๋ค. ๊ทธ๊ฒ์ ์ข ์ข ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๋ชฉํ๋ ์์์ ์ด๊ณ ๋ ธ์ด์ฆ๊ฐ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์๊ตฌ์ ๋ง๊ฒ ์ผ๊ด๋๊ณ , ์์ ์ ์ด๋ฉฐ, ์ถฉ๋ถํ ์ข์ ๊ฒ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋๋ค. ๋ค์์ ๋ชจ๋ ๊ธฐ์ ์ ์ค์๊ฐ ์ฑ๋ฅ์ ์ํด WebGL ์ ฐ์ด๋์์ ๊ตฌํ๋์ด์ผ ํฉ๋๋ค.
๊ธฐ์ 1: ์๊ฐ์ ํํฐ๋ง (์๊ฐ์ ๋ฐ๋ฅธ ์ค๋ฌด๋ฉ)
ํ๋ ์ ๊ฐ์ ๊น์ด ๋ฐ์ดํฐ๋ ๋งค์ฐ "์งํฐ๋ง(jittery)"ํ ์ ์์ผ๋ฉฐ, ๊ฐ๋ณ ํฝ์ ๊ฐ์ด ๋น ๋ฅด๊ฒ ๋ณํฉ๋๋ค. ์๊ฐ์ ํํฐ๋ง์ ํ์ฌ ํ๋ ์์ ๊น์ด ๋ฐ์ดํฐ๋ฅผ ์ด์ ํ๋ ์์ ๋ฐ์ดํฐ์ ํผํฉํ์ฌ ์ด๋ฅผ ๋ถ๋๋ฝ๊ฒ ๋ง๋ญ๋๋ค.
๊ฐ๋จํ๊ณ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ ์ง์ ์ด๋ ํ๊ท (Exponential Moving Average, EMA)์ ๋๋ค. ์ ฐ์ด๋์์ ์ด์ ํ๋ ์์ ๋ถ๋๋ฌ์์ง ๊น์ด๋ฅผ ์ ์ฅํ๋ "ํ์คํ ๋ฆฌ" ํ ์ค์ฒ๋ฅผ ์ ์งํฉ๋๋ค.
๊ฐ๋ ์ ์ ฐ์ด๋ ๋ก์ง:
float smoothing_factor = 0.6; // 0๊ณผ 1 ์ฌ์ด์ ๊ฐ. ๋์์๋ก ์ค๋ฌด๋ฉ์ด ๊ฐํด์ง.
vec2 tex_coord = ...; // ํ์ฌ ํฝ์
์ ํ
์ค์ฒ ์ขํ
float current_depth = texture2D(new_depth_map, tex_coord).r;
float previous_depth = texture2D(history_depth_map, tex_coord).r;
// ํ์ฌ ๊น์ด๊ฐ ์ ํจํ ๊ฒฝ์ฐ(0์ด ์๋ ๊ฒฝ์ฐ)์๋ง ์
๋ฐ์ดํธ
if (current_depth > 0.0) {
float smoothed_depth = mix(current_depth, previous_depth, smoothing_factor);
// ๋ค์ ํ๋ ์์ ์ํด ์ค๋ฌด๋ฉ๋ ๊น์ด๋ฅผ ์ ํ์คํ ๋ฆฌ ํ
์ค์ฒ์ ์
} else {
// ํ์ฌ ๋ฐ์ดํฐ๊ฐ ์ ํจํ์ง ์์ผ๋ฉด ์ด์ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉ
// ์ด์ ๊น์ด๋ฅผ ์ ํ์คํ ๋ฆฌ ํ
์ค์ฒ์ ์
}
์ฅ์ : ๊ณ ์ฃผํ ๋ ธ์ด์ฆ์ ๊น๋ฐ์์ ์ค์ด๋ ๋ฐ ํ์ํฉ๋๋ค. ์คํด๋ฃจ์ ๊ณผ ๋ฌผ๋ฆฌ ์ํธ์์ฉ์ ํจ์ฌ ๋ ์์ ์ ์ผ๋ก ๋๋ผ๊ฒ ๋ง๋ญ๋๋ค.
๋จ์ : ํนํ ๋น ๋ฅด๊ฒ ์์ง์ด๋ ๊ฐ์ฒด์์ ์ฝ๊ฐ์ ์ง์ฐ์ด๋ "๊ณ ์คํ " ํจ๊ณผ๋ฅผ ์ ๋ฐํฉ๋๋ค. `smoothing_factor`๋ ์์ ์ฑ๊ณผ ๋ฐ์์ฑ ์ฌ์ด์ ๊ท ํ์ ๋ง์ถ๋๋ก ์กฐ์ ํด์ผ ํฉ๋๋ค.
๊ธฐ์ 2: ๊ณต๊ฐ์ ํํฐ๋ง (์ด์ ํฝ์ ๊ณผ์ ์ค๋ฌด๋ฉ)
๊ณต๊ฐ์ ํํฐ๋ง์ ํฝ์ ์ ๊ฐ์ ์ฃผ๋ณ ์ด์ ํฝ์ ์ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์์ ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ๊ณ ๋ฆฝ๋ ์ค๋ฅ ํฝ์ ์ ์์ ํ๊ณ ์์ ์์ฒ ์ ๋ถ๋๋ฝ๊ฒ ๋ง๋๋ ๋ฐ ์ข์ต๋๋ค.
- ๊ฐ์ฐ์์ ๋ธ๋ฌ: ๊ฐ๋จํ ๋ธ๋ฌ๋ ๋ ธ์ด์ฆ๋ฅผ ์ค์ผ ์ ์์ง๋ง, ์ค์ํ ๋ ์นด๋ก์ด ๊ฐ์ฅ์๋ฆฌ๋ ๋ถ๋๋ฝ๊ฒ ๋ง๋ค์ด ํ ์ด๋ธ์ ๋ชจ์๋ฆฌ๊ฐ ๋ฅ๊ธ๊ฒ ๋๊ณ ์คํด๋ฃจ์ ๊ฒฝ๊ณ๊ฐ ํ๋ ค์ง๋๋ค. ์ด ์ฉ๋๋ก๋ ์ผ๋ฐ์ ์ผ๋ก ๋๋ฌด ๊ณผํฉ๋๋ค.
- ์๋ฐฉํฅ ํํฐ(Bilateral Filter): ์ด๊ฒ์ ๊ฐ์ฅ์๋ฆฌ๋ฅผ ๋ณด์กดํ๋ ์ค๋ฌด๋ฉ ํํฐ์ ๋๋ค. ์ด์ ํฝ์ ์ ํ๊ท ํํ์ฌ ์๋ํ์ง๋ง, ์ค์ฌ ํฝ์ ๊ณผ ๊น์ด ๊ฐ์ด ์ ์ฌํ ์ด์์ ๋ ๋ง์ ๊ฐ์ค์น๋ฅผ ๋ก๋๋ค. ์ฆ, ํํํ ๋ฒฝ์ ๋ถ๋๋ฝ๊ฒ ๋ง๋ค์ง๋ง ๊น์ด๊ฐ ๋ถ์ฐ์์ ์ธ ๋ถ๋ถ(์ฑ ์ ๊ฐ์ฅ์๋ฆฌ ๋ฑ)์ ๊ฐ๋ก์ง๋ฌ ํฝ์ ์ ํ๊ท ํํ์ง๋ ์์ต๋๋ค. ์ด๋ ๋์ค ๋งต์ ํจ์ฌ ๋ ์ ํฉํ์ง๋ง, ๊ฐ๋จํ ๋ธ๋ฌ๋ณด๋ค ๊ณ์ฐ ๋น์ฉ์ด ๋ ๋น์๋๋ค.
๊ธฐ์ 3: ๊ตฌ๋ฉ ์ฑ์ฐ๊ธฐ ๋ฐ ์ธํ์ธํ
์ข ์ข ๋์ค ๋งต์๋ ์ผ์๊ฐ ํ๋ ์ ์คํจํ "๊ตฌ๋ฉ"(๊ฐ์ด 0์ธ ํฝ์ )์ด ํฌํจ๋ฉ๋๋ค. ์ด ๊ตฌ๋ฉ๋ค์ ๊ฐ์ ๊ฐ์ฒด๊ฐ ์๊ธฐ์น ์๊ฒ ๋ํ๋๊ฑฐ๋ ์ฌ๋ผ์ง๊ฒ ํ ์ ์์ต๋๋ค. ๊ฐ๋จํ ๊ตฌ๋ฉ ์ฑ์ฐ๊ธฐ ๊ธฐ์ ๋ก ์ด๋ฅผ ์ํํ ์ ์์ต๋๋ค.
๊ฐ๋ ์ ์ ฐ์ด๋ ๋ก์ง:
vec2 tex_coord = ...;
float center_depth = texture2D(depth_map, tex_coord).r;
if (center_depth == 0.0) {
// ์ด๊ฒ์ด ๊ตฌ๋ฉ์ด๋ผ๋ฉด, ์ด์์ ์ํ๋งํ๊ณ ์ ํจํ ๊ฒ๋ค์ ํ๊ท ๋
float total_depth = 0.0;
float valid_samples = 0.0;
// ... 3x3 ๋๋ 5x5 ์ด์ ๊ทธ๋ฆฌ๋๋ฅผ ์ํํ๋ฉฐ ...
// if (neighbor_depth > 0.0) { total_depth += neighbor_depth; valid_samples++; }
if (valid_samples > 0.0) {
center_depth = total_depth / valid_samples;
}
}
// (์ฑ์์ก์ ์ ์๋) ์ค์ฌ ๊น์ด ๊ฐ์ ์ฌ์ฉ
๋ ๊ณ ๊ธ ๊ธฐ์ ์ ๊ตฌ๋ฉ์ ๊ฐ์ฅ์๋ฆฌ์์ ์์ชฝ์ผ๋ก ๊น์ด ๊ฐ์ ์ ํํ๋ ๊ฒ์ ํฌํจํ์ง๋ง, ๊ฐ๋จํ ์ด์ ํ๊ท ๋ง์ผ๋ก๋ ์์ ์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๊ธฐ์ 4: ํด์๋ ์ ์ํ๋ง
์์ ๋ ผ์ํ๋ฏ์ด, ๋์ค ๋งต์ ์ผ๋ฐ์ ์ผ๋ก ์ปฌ๋ฌ ์ด๋ฏธ์ง๋ณด๋ค ํจ์ฌ ๋ฎ์ ํด์๋์ ๋๋ค. ์ ํํ ํฝ์ ๋ณ ์คํด๋ฃจ์ ์ ์ํํ๋ ค๋ฉด ๊ณ ํด์๋ ๋์ค ๋งต์ ์์ฑํด์ผ ํฉ๋๋ค.
- ์์ ํ ๋ณด๊ฐ(Bilinear Interpolation): ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ๋๋ค. ์ ฐ์ด๋์์ ์ ํด์๋ ๊น์ด ํ ์ค์ฒ๋ฅผ ์ํ๋งํ ๋ GPU์ ํ๋์จ์ด ์ํ๋ฌ๊ฐ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ค ๊ฐ์ ๊น์ด ํฝ์ ์ ์๋์ผ๋ก ํผํฉํ ์ ์์ต๋๋ค. ์ด๋ ๋น ๋ฅด์ง๋ง ๋งค์ฐ ํ๋ฆฟํ ๊ฐ์ฅ์๋ฆฌ๋ฅผ ์ด๋ํฉ๋๋ค.
- ๊ฐ์ฅ์๋ฆฌ ์ธ์ ์ ์ํ๋ง(Edge-Aware Upsampling): ๋ ๊ณ ๊ธ ์ ๊ทผ ๋ฐฉ์์ ๊ณ ํด์๋ ์ปฌ๋ฌ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ด๋๋ก ์ฌ์ฉํฉ๋๋ค. ๋ ผ๋ฆฌ๋ ์ปฌ๋ฌ ์ด๋ฏธ์ง์ ๋ ์นด๋ก์ด ๊ฐ์ฅ์๋ฆฌ(์: ๋ฐ์ ๋ฒฝ์ ๋ํ ์ด๋์ด ์์์ ๊ฐ์ฅ์๋ฆฌ)๊ฐ ์๋ค๋ฉด, ๋์ค ๋งต์๋ ๋ ์นด๋ก์ด ๊ฐ์ฅ์๋ฆฌ๊ฐ ์์ด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ ๊ฐ์ฒด ๊ฒฝ๊ณ๋ฅผ ๊ฐ๋ก์ง๋ฅด๋ ๋ธ๋ฌ๋ง์ ๋ฐฉ์งํฉ๋๋ค. ์ฒ์๋ถํฐ ๊ตฌํํ๊ธฐ๋ ๋ณต์กํ์ง๋ง, ํต์ฌ ์์ด๋์ด๋ ์กฐ์ธํธ ์๋ฐฉํฅ ์ ์ํ๋ฌ(Joint Bilateral Upsampler)์ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ธ๋ฐ, ์ด๋ ๊ณต๊ฐ์ ๊ฑฐ๋ฆฌ์ ๊ณ ํด์๋ ์นด๋ฉ๋ผ ํ ์ค์ฒ์ ์์ ์ ์ฌ์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ํํฐ ๊ฐ์ค์น๋ฅผ ์์ ํฉ๋๋ค.
๊ธฐ์ 5: ๋๋ฒ๊น ๋ฐ ์๊ฐํ
๋ณผ ์ ์๋ ๊ฒ์ ๊ณ ์น ์ ์์ต๋๋ค. ํ์ง ๊ด๋ฆฌ ๋๊ตฌ ์์์์ ๊ฐ์ฅ ๊ฐ๋ ฅํ ๋๊ตฌ ์ค ํ๋๋ ๋์ค ๋งต์ ์ง์ ์๊ฐํํ๋ ๊ธฐ๋ฅ์ ๋๋ค. ๊น์ด ํ ์ค์ฒ๋ฅผ ํ๋ฉด์ ์ฌ๊ฐํ์ ๋ ๋๋งํ ์ ์์ต๋๋ค. ์์ ๊น์ด ๊ฐ์ ๊ฐ์ ๋ฒ์์ ์์ง ์์ผ๋ฏ๋ก ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋์์ ์ ๊ทํํด์ผ ํฉ๋๋ค.
๊ฐ๋ ์ ์ ๊ทํ ์ ฐ์ด๋ ๋ก์ง:
float raw_depth = texture2D(depth_map, tex_coord).r;
float depth_in_meters = raw_depth * rawValueToMeters;
// ์๊ฐํ๋ฅผ ์ํด 0-1 ๋ฒ์๋ก ์ ๊ทํ, ์: ์ต๋ 5๋ฏธํฐ ๋ฒ์
float max_viz_range = 5.0;
float normalized_color = clamp(depth_in_meters / max_viz_range, 0.0, 1.0);
gl_FragColor = vec4(normalized_color, normalized_color, normalized_color, 1.0);
์์, ํํฐ๋ง๋, ๊ทธ๋ฆฌ๊ณ ์ ์ํ๋ง๋ ๋์ค ๋งต์ ๋๋ํ ๋ด์ผ๋ก์จ, ํํฐ๋ง ๋งค๊ฐ๋ณ์๋ฅผ ์ง๊ด์ ์ผ๋ก ์กฐ์ ํ๊ณ ํ์ง ๊ด๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ์ํฅ์ ์ฆ์ ํ์ธํ ์ ์์ต๋๋ค.
์ 5์ฅ: ์ฌ๋ก ์ฐ๊ตฌ - ๊ฒฌ๊ณ ํ ์คํด๋ฃจ์ ๊ตฌํํ๊ธฐ
์ด ๊ฐ๋ ๋ค์ ๊น์ด API์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์ธ ์คํด๋ฃจ์ ๊ณผ ์ฐ๊ฒฐํด ๋ด ์๋ค. ๋ชฉํ๋ ๊ฐ์ ๊ฐ์ฒด๊ฐ ์ค์ ๊ฐ์ฒด ๋ค์ ์ ํํ๊ฒ ๋ํ๋๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
ํต์ฌ ๋ก์ง (ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋์์)
์ด ๊ณผ์ ์ ๊ฐ์ ๊ฐ์ฒด์ ๋ชจ๋ ๋จ์ผ ํฝ์ ์ ๋ํด ๋ฐ์ํฉ๋๋ค:
- ๊ฐ์ ํ๋๊ทธ๋จผํธ์ ๊น์ด ์ป๊ธฐ: ๋ฒํ ์ค ์ ฐ์ด๋์์ ๋ฒํ ์ค์ ํด๋ฆฝ ๊ณต๊ฐ ์์น๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์๊ทผ ๋๋์ ํ ์ด ์์น์ Z ๊ตฌ์ฑ ์์๋ ๊ฐ์ ๊ฐ์ฒด์ ๊น์ด๋ฅผ ๋ํ๋ ๋๋ค. ์ด ๊ฐ์ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ก ์ ๋ฌํฉ๋๋ค.
- ์ค์ ์ธ๊ณ์ ๊น์ด ์ป๊ธฐ: ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋์์ ํ์ฌ ๊ฐ์ ํ๋๊ทธ๋จผํธ์ ํด๋นํ๋ ๋์ค ๋งต์ ํฝ์ ์ ์ฐพ์์ผ ํฉ๋๋ค. API์์ ์ ๊ณตํ๋ `normDepthFromViewMatrix`๋ฅผ ์ฌ์ฉํ์ฌ ํ๋๊ทธ๋จผํธ์ ๋ทฐ ๊ณต๊ฐ ์์น๋ฅผ ๋์ค ๋งต์ ํ ์ค์ฒ ์ขํ๋ก ๋ณํํ ์ ์์ต๋๋ค.
- ์ค์ ๊น์ด ์ํ๋ง ๋ฐ ์ฒ๋ฆฌ: ํด๋น ํ ์ค์ฒ ์ขํ๋ฅผ ์ฌ์ฉํ์ฌ (์ด์์ ์ผ๋ก๋ ์ฌ์ ํํฐ๋ง ๋ฐ ์ ์ํ๋ง๋) ๋์ค ๋งต์ ์ํ๋งํฉ๋๋ค. `rawValueToMeters`๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๊ฐ์ ๋ฏธํฐ๋ก ๋ณํํ๋ ๊ฒ์ ์์ง ๋ง์ธ์.
- ๋น๊ต ๋ฐ ํ๊ธฐ(Discard): ๊ฐ์ ํ๋๊ทธ๋จผํธ์ ๊น์ด์ ์ค์ ์ธ๊ณ์ ๊น์ด๋ฅผ ๋น๊ตํฉ๋๋ค. ๊ฐ์ ๊ฐ์ฒด๊ฐ ํด๋น ํฝ์ ์ ์ค์ ๊ฐ์ฒด๋ณด๋ค ๋ ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์๋ค๋ฉด(๋ ํฐ ๊น์ด ๊ฐ์ ๊ฐ์ง), ๊ทธ๊ฒ์ ๊ฐ๋ ค์ง ๊ฒ์ ๋๋ค. GLSL์์๋ `discard` ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ํฝ์ ์ ๋ ๋๋ง์ ์์ ํ ์ค๋จํฉ๋๋ค.
ํ์ง ๊ด๋ฆฌ ์์ด: ์คํด๋ฃจ์ ์ ๊ฐ์ฅ์๋ฆฌ๊ฐ ๊ฐ์ ธ ๋ณด์ด๊ณ (๋ฎ์ ๊ณต๊ฐ ํด์๋ ๋๋ฌธ) ๋ฐ์ง์ด๊ฑฐ๋ ์ง์ง์ง๊ฑฐ๋ฆด ๊ฒ์ ๋๋ค(์๊ฐ์ ๋ ธ์ด์ฆ ๋๋ฌธ). ๋ง์น ๋ ธ์ด์ฆ๊ฐ ๋ง์ ๋ง์คํฌ๊ฐ ๊ฐ์ ๊ฐ์ฒด์ ์กฐ์กํ๊ฒ ์ ์ฉ๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ๊ฒ์ ๋๋ค.
ํ์ง ๊ด๋ฆฌ ์ ์ฉ ์: ์ 4์ฅ์ ๊ธฐ์ ๋คโ๋ฐ์ดํฐ๋ฅผ ์์ ํํ๊ธฐ ์ํ ์๊ฐ์ ํํฐ ์คํ, ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ์๋ฆฌ ์ธ์ ์ ์ํ๋ง ๋ฐฉ๋ฒ ์ฌ์ฉโ์ ์ ์ฉํจ์ผ๋ก์จ ์คํด๋ฃจ์ ๊ฒฝ๊ณ๊ฐ ๋ถ๋๋ฝ๊ณ ์์ ์ ์ด ๋ฉ๋๋ค. ๊ฐ์ ๊ฐ์ฒด๋ ์ค์ ์ฅ๋ฉด์ ๊ฒฌ๊ณ ํ๊ณ ๋ฏฟ์์งํ๊ฒ ์ํ ๊ฒ์ฒ๋ผ ๋ณด์ผ ๊ฒ์ ๋๋ค.
์ 6์ฅ: ์ฑ๋ฅ, ์ฑ๋ฅ, ์ฑ๋ฅ
๋งค ํ๋ ์ ๊น์ด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋ค ์ ์์ต๋๋ค. ์๋ชป๋ ๊ตฌํ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋ ์ ์๋๋ฅผ AR์ ํธ์ํ ์๊ณ๊ฐ ์๋๋ก ์ฝ๊ฒ ๋์ด๋ด๋ ค ๋ฉ์ค๊บผ์ด ๊ฒฝํ์ ์ ๋ฐํ ์ ์์ต๋๋ค. ๋ค์์ ํํํ ์ ์๋ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก์ ๋๋ค.
GPU์ ๋จธ๋ฌด๋ฅด๊ธฐ
๋ฉ์ธ ๋ ๋ ๋ฃจํ ๋ด์์ ๊น์ด ํ ์ค์ฒ ๋ฐ์ดํฐ๋ฅผ CPU๋ก ๋ค์ ์ฝ์ด์ค์ง ๋ง์ธ์(`readPixels` ์ฌ์ฉ ๋ฑ). ์ด ์์ ์ ์์ฒญ๋๊ฒ ๋๋ฆฌ๋ฉฐ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ์ ์ง์์ผ ํ๋ ์ ์๋๋ฅผ ํ๊ดดํ ๊ฒ์ ๋๋ค. ๋ชจ๋ ํํฐ๋ง, ์ ์ํ๋ง ๋ฐ ๋น๊ต ๋ก์ง์ GPU์ ์ ฐ์ด๋์์ ์คํ๋์ด์ผ ํฉ๋๋ค.
์ ฐ์ด๋ ์ต์ ํํ๊ธฐ
- ์ ์ ํ ์ ๋ฐ๋ ์ฌ์ฉ: ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๋ถ๋ ์์์ ๋ฐ ๋ฒกํฐ์ `highp` ๋์ `mediump`๋ฅผ ์ฌ์ฉํ์ธ์. ์ด๋ ๋ชจ๋ฐ์ผ GPU์์ ์๋นํ ์ฑ๋ฅ ํฅ์์ ์ ๊ณตํ ์ ์์ต๋๋ค.
- ํ ์ค์ฒ ์กฐํ ์ต์ํ: ๋ชจ๋ ํ ์ค์ฒ ์ํ์๋ ๋น์ฉ์ด ๋ญ๋๋ค. ํํฐ๋ฅผ ๊ตฌํํ ๋ ๊ฐ๋ฅํ ํ ์ํ์ ์ฌ์ฌ์ฉํ๋ ค๊ณ ๋ ธ๋ ฅํ์ธ์. ์๋ฅผ ๋ค์ด, 3x3 ๋ฐ์ค ๋ธ๋ฌ๋ ์ ์ฒด์ ์ผ๋ก ๋ ์ ์ ํ ์ค์ฒ ์ฝ๊ธฐ๋ฅผ ํ์๋ก ํ๋ ๋ ๊ฐ์ ํจ์ค(์ํ ํ๋, ์์ง ํ๋)๋ก ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
- ๋ถ๊ธฐ๋ฌธ์ ๋น์ธ๋ค: ์ ฐ์ด๋์ ๋ณต์กํ `if/else` ๋ฌธ์ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. ๋๋ก๋ ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ ๊ณ์ฐํ๊ณ `mix()` ๋๋ `step()`๊ณผ ๊ฐ์ ์ํ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ ํํ๋ ๊ฒ์ด ๋ ๋น ๋ฆ ๋๋ค.
WebXR ๊ธฐ๋ฅ ํ์์ ํ๋ช ํ๊ฒ ์ฌ์ฉํ๊ธฐ
`depth-sensing` ๊ธฐ๋ฅ์ ์์ฒญํ ๋ ์ ํธ๋๋ฅผ ๊ฐ์ง ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค:
{ requiredFeatures: ['depth-sensing'],
depthSensing: {
usagePreference: ['cpu-optimized', 'gpu-optimized'],
dataFormatPreference: ['luminance-alpha', 'float32']
}
}
- usagePreference: `gpu-optimized`๋ ์ค์๊ฐ ๋ ๋๋ง์ ์ํ๋ ๊ฒ์ผ๋ก, ์์คํ ์ ์ฃผ๋ก GPU์์ ๊น์ด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ๊ฒ์์ ์์ํฉ๋๋ค. `cpu-optimized`๋ ๋น๋๊ธฐ์ ๋ฉ์ฌ ์ฌ๊ตฌ์ฑ๊ณผ ๊ฐ์ ์์ ์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- dataFormatPreference: `float32`๋ฅผ ์์ฒญํ๋ฉด ์ต๊ณ ์ ์ ๋ฐ๋๋ฅผ ์ป์ ์ ์์ง๋ง ์ฑ๋ฅ ๋น์ฉ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. `luminance-alpha`๋ 16๋นํธ ๊น์ด ๊ฐ์ ๋ ๊ฐ์ 8๋นํธ ์ฑ๋์ ์ ์ฅํ๋๋ฐ, ์ด๋ฅผ ์ฌ๊ตฌ์ฑํ๋ ค๋ฉด ์ ฐ์ด๋์์ ์ฝ๊ฐ์ ๋นํธ ์ํํธ ๋ก์ง์ด ํ์ํ์ง๋ง ์ผ๋ถ ํ๋์จ์ด์์๋ ๋ ์ฑ๋ฅ์ด ์ข์ ์ ์์ต๋๋ค. ์์คํ ์ด ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒ์ ์ ๊ณตํ๋ฏ๋ก ํญ์ ์ค์ ๋ก ์ด๋ค ํ์์ ๋ฐ์๋์ง ํ์ธํ์ธ์.
์ ์ํ ํ์ง ๊ตฌํํ๊ธฐ
๋ชจ๋ ์ํฉ์ ๋ง๋ ๋จ์ผ ํ์ง ์ ๊ทผ ๋ฐฉ์์ ์ต์ ์ด ์๋๋๋ค. ๊ณ ๊ธ ๋๋ฐ์ด์ค๋ ๋ณต์กํ ๋ค์ค ํจ์ค ์๋ฐฉํฅ ํํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ง๋ง, ์ ์ฌ์ ๋๋ฐ์ด์ค๋ ์ด๋ ค์์ ๊ฒช์ ์ ์์ต๋๋ค. ์ ์ํ ํ์ง ์์คํ ์ ๊ตฌํํ์ธ์:
- ์์ ์ ๋๋ฐ์ด์ค์ ์ฑ๋ฅ์ ๋ฒค์น๋งํนํ๊ฑฐ๋ ๋ชจ๋ธ์ ํ์ธํฉ๋๋ค.
- ์ฑ๋ฅ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ ฐ์ด๋๋ ๋ค๋ฅธ ํํฐ๋ง ๊ธฐ์ ์ธํธ๋ฅผ ์ ํํฉ๋๋ค.
- ๊ณ ํ์ง: ์๊ฐ์ EMA + ์๋ฐฉํฅ ํํฐ + ๊ฐ์ฅ์๋ฆฌ ์ธ์ ์ ์ํ๋ง.
- ์ค๊ฐ ํ์ง: ์๊ฐ์ EMA + ๊ฐ๋จํ 3x3 ์ด์ ํ๊ท .
- ์ ํ์ง: ํํฐ๋ง ์์, ๊ธฐ๋ณธ์ ์ธ ์์ ํ ๋ณด๊ฐ๋ง ์ฌ์ฉ.
์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ฐ๋ฅํ ๊ฐ์ฅ ๋์ ๋ฒ์์ ๋๋ฐ์ด์ค์์ ์ํํ๊ฒ ์คํ๋๋๋ก ๋ณด์ฅํ๊ณ ๊ฐ ์ฌ์ฉ์์๊ฒ ์ต์์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก : ๋ฐ์ดํฐ์์ ๊ฒฝํ์ผ๋ก
WebXR ๊น์ด API๋ ์๋ก์ด ์ฐจ์์ ๋ชฐ์ ์ผ๋ก ๊ฐ๋ ๊ด๋ฌธ์ด์ง๋ง, ์๋ฒฝํ AR์ ์ํ ํ๋ฌ๊ทธ ์ค ํ๋ ์ด ์๋ฃจ์ ์ ์๋๋๋ค. ๊ทธ๊ฒ์ด ์ ๊ณตํ๋ ์์ ๋ฐ์ดํฐ๋ ๋จ์ง ์์์ ์ผ ๋ฟ์ ๋๋ค. ์ง์ ํ ์๋ฌ์ ๋ฐ์ดํฐ์ ๋ถ์์ ์ฑโํด์๋ ํ๊ณ, ๋ ธ์ด์ฆ, ํ๊ฒฝ์ ์ฝ์ โ์ ์ดํดํ๊ณ , ์ฌ๋ ค ๊น๊ณ ์ฑ๋ฅ์ ๊ณ ๋ คํ ํ์ง ๊ด๋ฆฌ ํ์ดํ๋ผ์ธ์ ์ ์ฉํ๋ ๋ฐ ์์ต๋๋ค.
์๊ฐ์ ๋ฐ ๊ณต๊ฐ์ ํํฐ๋ง์ ๊ตฌํํ๊ณ , ๊ตฌ๋ฉ๊ณผ ํด์๋ ์ฐจ์ด๋ฅผ ์ง๋ฅ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ์ง์์ ์ผ๋ก ์๊ฐํํจ์ผ๋ก์จ, ์ฌ๋ฌ๋ถ์ ๋ ธ์ด์ฆ๊ฐ ๋ง๊ณ ๋จ๋ฆฌ๋ ์ ํธ๋ฅผ ์ฐฝ์์ ์ธ ๋น์ ์ ์ํ ์์ ์ ์ธ ๊ธฐ๋ฐ์ผ๋ก ๋ณํํ ์ ์์ต๋๋ค. ๊ฑฐ์ฌ๋ฆฌ๋ AR ๋ฐ๋ชจ์ ์ง์ ์ผ๋ก ๋ฏฟ์ ์ ์๊ณ ๋ชฐ์ ๊ฐ ์๋ ๊ฒฝํ์ ์ฐจ์ด๋ ์ข ์ข ์ด ๊น์ด ์ ๋ณด์ ์ ์คํ ๊ด๋ฆฌ์ ์์ต๋๋ค.
์ค์๊ฐ ๊น์ด ๊ฐ์ง ๋ถ์ผ๋ ๋์์์ด ์งํํ๊ณ ์์ต๋๋ค. ๋ฏธ๋์ ๋ฐ์ ์ AI ๊ฐํ ๊น์ด ์ฌ๊ตฌ์ฑ, ์๋ฏธ๋ก ์ ์ดํด(ํฝ์ ์ด '๋ฐ๋ฅ'์ ์ํ๋์ง '์ฌ๋'์ ์ํ๋์ง ์๋ ๊ฒ), ๊ทธ๋ฆฌ๊ณ ๋ ๋ง์ ๋๋ฐ์ด์ค์ ๋ ๋์ ํด์๋์ ์ผ์๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ง ๊ด๋ฆฌ์ ๊ธฐ๋ณธ ์์นโ๋ฐ์ดํฐ๋ฅผ ๋ถ๋๋ฝ๊ฒ ํ๊ณ , ํํฐ๋งํ๊ณ , ๊ฒ์ฆํ๋ ๊ฒโ์ ์คํ ์น์์ ์ฆ๊ฐ ํ์ค์ ๊ฐ๋ฅ์ฑ์ ๊ฒฝ๊ณ๋ฅผ ๋ํ๊ณ ์ ํ๋ ๋ชจ๋ ๊ฐ๋ฐ์์๊ฒ ํ์์ ์ธ ๊ธฐ์ ๋ก ๋จ์ ๊ฒ์ ๋๋ค.