Three.js: ๋น„์ฐจ๋‹จ ์ž์‚ฐ ๋กœ๋”

์— ๋งŒ๋“  2017๋…„ 07์›” 11์ผ  ยท  53์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mrdoob/three.js

https://github.com/mrdoob/three.js/issues/11301 ์—์„œ ๋…ผ์˜๋œ ๋ฐ”์™€ ๊ฐ™์ด WebVR์˜ ์ฃผ์š” ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๋Š” VR์ด ์•„๋‹Œ ๊ฒฝํ—˜์—์„œ๋„ ์„ฑ๊ฐ€์‹œ์ง€๋งŒ ์ž์‚ฐ์„ ๋กœ๋“œํ•˜๋Š” ๋™์•ˆ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €์—์„œ ๋งํฌ ์ˆœํšŒ ์— ๋Œ€ํ•œ ์ตœ๊ทผ ๊ตฌํ˜„๊ณผ ํ•จ๊ป˜ ๋น„์ฐจ๋‹จ ๋กœ๋”ฉ์€ ๋งŒ์กฑ์Šค๋Ÿฌ์šด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ํ•œ ํŽ˜์ด์ง€์—์„œ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ณ  ๋Œ€์ƒ ํŽ˜์ด์ง€๊ฐ€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ์ž์‚ฐ์„ ๋กœ๋“œํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๋ Œ๋”๋ง ๊ธฐ๋Šฅ์ด ์ฐจ๋‹จ๋˜์–ด ํ”„๋ ˆ์ž„์ด ํ—ค๋“œ์…‹์— ์ œ์ถœ๋˜์ง€ ์•Š๊ณ  ์ž ์‹œ ํ›„์— ๋ธŒ๋ผ์šฐ์ €๊ฐ€ VR์—์„œ ์šฐ๋ฆฌ๋ฅผ ์ถ”๋ฐฉํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํ—ค๋“œ์…‹์„ ๊บผ๋‚ด๊ณ  VR ์ž…๋ ฅ์„ ๋‹ค์‹œ ํด๋ฆญํ•˜๊ณ (์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž ์ œ์Šค์ฒ˜๊ฐ€ ํ•„์š”ํ•จ) ๊ฒฝํ—˜์œผ๋กœ ๋Œ์•„๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ OBJ ํŒŒ์ผ์˜ ๋น„์ฐจ๋‹จ ๋กœ๋“œ์˜ ๋‘ ๊ฐ€์ง€ ๊ตฌํ˜„์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • (1) webworkers๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ obj ํŒŒ์ผ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•œ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ WWOBJLoader ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    ์—ฌ๊ธฐ์—์„œ ๊ตฌ๋ฌธ ๋ถ„์„์ด ๋™์‹œ์— ์ˆ˜ํ–‰๋˜๋ฉฐ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—…์ž๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ๋‹จ์ ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•œ ํ›„ 3๊ฐœ์˜ ๊ฐœ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋‹ค์‹œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋กœ ๋ณด๋‚ด์•ผ ํ•˜๋ฉฐ ํ•ด๋‹น ๋ถ€๋ถ„์ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    https://github.com/kaisalmen/WWOBJLoader/blob/master/src/loaders/WWOBJLoader2.js#L312 -L423
  • (2) setTimeOut์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์—ฐ๋œ ๊ตฌ๋ฌธ ๋ถ„์„์ด ์žˆ๋Š” Mainthread ์•ฝ์†: Oculus ReactVR : ์ด ๋กœ๋”๋Š” setTimeout์„ ํ˜ธ์ถœํ•˜์—ฌ ๊ธฐ๋ณธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์€ ์‹œ๊ฐ„ ์Šฌ๋กฏ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ค„์„ ๊ณ„์† ์ฝ์Šต๋‹ˆ๋‹ค. https://github.com/facebook/react-vr/blob/master /ReactVR/js/Loaders/WavefrontOBJ/OBJParser.js#L281 -L298
    ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ์‹œ๊ฐ„ ์Šฌ๋กฏ์—์„œ ์ผ๋ถ€ ๋ผ์ธ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋กœ๋”ฉ์ด ๋Š๋ ค์ง€์ง€๋งŒ ์ผ๋‹จ ๊ตฌ๋ฌธ ๋ถ„์„์ด ์™„๋ฃŒ๋˜๋ฉด ์ถ”๊ฐ€ ์˜ค๋ฒ„ํ—ค๋“œ ์—†์ด ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋œ 3๊ฐœ์˜ ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘˜ ๋‹ค ์žฅ๋‹จ์ ์ด ์žˆ์œผ๋ฉฐ ์ €๋Š” ์†”์งํžˆ ๊ทธ ๊ตฌํ˜„์„ ํ‰๊ฐ€ํ•˜๋Š” ์›น ์ž‘์—…์ž์˜ ์ „๋ฌธ๊ฐ€๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ด์ƒ์ ์œผ๋กœ๋Š” ๋กœ๋”๋ฅผ ๋น„์ฐจ๋‹จ ๋ฒ„์ „์œผ๋กœ ์ด์‹ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜ ๋ชจ๋“ˆ๋กœ ์ด์–ด์งˆ ๊ฒƒ์ด๋ผ๋Š” ํฅ๋ฏธ๋กœ์šด ๋…ผ์˜์ž…๋‹ˆ๋‹ค.

์–ด๋–ค ์ œ์•ˆ?

/cc @mikearmstrong001 @kaisalmen @delapuente @spite

Suggestion

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

THREE.UpdatableTexture์˜ ์ฒซ ๋ฒˆ์งธ ์ œ์•ˆ ๋ฆด๋ฆฌ์Šค

์ด์ƒ์ ์œผ๋กœ๋Š” THREE.Texture์˜ ์ผ๋ถ€์—ฌ์•ผ ํ•˜์ง€๋งŒ ๋จผ์ € ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  53 ๋Œ“๊ธ€

Promise+worker+incremental ๊ธฐ๋ฐ˜ ๋กœ๋”๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋‘ ํฌ์ธํŠธ์˜ ํ˜ผํ•ฉ๊ณผ ์•ฝ๊ฐ„ ๋น„์Šทํ•จ)

์†Œ์Šค URL์„ ์ž‘์—…์ž ์Šคํฌ๋ฆฝํŠธ์— ์ „๋‹ฌ ํ•˜๊ณ  ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ํ•„์š”ํ•œ ๋ฒ„ํผ, ๊ตฌ์กฐ์ฒด, ImageBitmaps์™€ ํ•จ๊ป˜

GPU์— ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋กœ๋“œํ•˜๋Š” ๊ฒƒ์€ ์ƒ๊ด€์—†์ด ์ฐจ๋‹จ๋˜์ง€๋งŒ display.rAF๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์— ๋ช…๋ น์„ ๋ฐฐํฌํ•˜๋Š” ๋Œ€๊ธฐ์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น์€ ํ”„๋ ˆ์ž„๋‹น ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ์ž‘์—…์˜ ํ‰๊ท  ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•˜๊ณ  ํ˜„์žฌ ํ”„๋ ˆ์ž„ ์˜ˆ์‚ฐ์—์„œ ์‹คํ–‰ํ•˜๊ธฐ์— "์•ˆ์ „ํ•œ" ๋งŒํผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(requestIdleCallback๊ณผ ์œ ์‚ฌํ•œ ๊ฒƒ์ด ์ข‹์ง€๋งŒ ๋„๋ฆฌ ์ง€์›๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. , WebVR ์„ธ์…˜์—์„œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ). ๋˜ํ•œ bufferSubData, texSubImage2D ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘์—…์ž ๋ฐ ์ „์†ก ๊ฐ€๋Šฅํ•œ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์ง€์›์€ ํ˜„์žฌ ํŠนํžˆ WebVR ๊ฐ€๋Šฅ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋งค์šฐ ๊ฒฌ๊ณ ํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”. ์ด ๋งฅ๋ฝ์—์„œ ์—ฌ๋Ÿฌ๋ถ„์ด ๊ด€์‹ฌ์„ ๊ฐ€์งˆ ๋งŒํ•œ ํ”„๋กœํ† ํƒ€์ž…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ถ„๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
https://github.com/kaisalmen/WWOBJLoader/tree/Commons
์—ฌ๊ธฐ์—์„œ ์˜ ๋ฉ”์‹œ ํ”„๋กœ๋น„์ €๋‹ ๋ถ€๋ถ„์ด WWOBJLoader2 ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/kaisalmen/WWOBJLoader/blob/Commons/src/loaders/WWLoaderCommons.js

WWLoaderCommons ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ๋ฉ”์‹œ ๊ณต๊ธ‰์ž(ํŒŒ์ผ ํ˜•์‹ ๋กœ๋”)๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์›น ์ž‘์—…์ž ๊ตฌํ˜„์ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์— ๋ฉ”์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์ œ๊ณตํ•˜๊ณ  ์ด๋ฅผ ์žฅ๋ฉด์— ์ฒ˜๋ฆฌ/ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์ˆ  ๋ฐ๋ชจ ์—ญํ• ์„ ํ•˜๋Š” ์ž„์˜์˜ ์‚ผ๊ฐํ˜• ์ •ํฌ ๊ณต๊ธ‰์ž ๐Ÿ˜‰๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
https://github.com/kaisalmen/WWOBJLoader/tree/Commons/test/meshspray
https://kaisalmen.de/proto/test/meshspray/main.src.html

ํ˜„์žฌ ๊ตฌํ˜„์—์„œ๋„ WWOBJLoader2 ๋Š” ์ „๋‹ฌ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด(ArrayBuffers/ByteBuffers)์— ์˜์กดํ•˜์—ฌ ์ž‘์—…์ž์—์„œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋กœ Mesh ๋Œ€ํ•œ ์›์‹œ BufferedGeometry ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ณต๋œ ByteBuffers์—์„œ ์‹œ๊ฐ„์ ์œผ๋กœ Mesh ์ƒ์„ฑ์€ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋” ํฐ ๋ฉ”์‰ฌ๊ฐ€ ์žฅ๋ฉด์— ํ†ตํ•ฉ๋  ๋•Œ๋งˆ๋‹ค ๋ Œ๋”๋ง์ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค(๋ฐ์ดํ„ฐ ๋ณต์‚ฌ, ์žฅ๋ฉด ๊ทธ๋ž˜ํ”„ ์กฐ์ • ... !?). ์ด๊ฒƒ์€ ํ•ญ์ƒ ์ถœ์ฒ˜์™€ ๋ฌด๊ด€ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค(์ œ๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ •์ •ํ•ด ์ฃผ์‹ญ์‹œ์˜ค).
WWOBJLoader2์˜ "์ŠคํŠธ๋ฆผ" ๋ชจ๋“œ๋Š” ์ด๋Ÿฌํ•œ ์ง€์—ฐ์„ ์™„ํ™”ํ•˜์ง€๋งŒ OBJ ๋ชจ๋ธ์˜ ๋‹จ์ผ ๋ฉ”์‰ฌ ์กฐ๊ฐ์˜ ๋ฌด๊ฒŒ๊ฐ€ 50๋งŒ ์ •์ ์ด๋ฉด ๋ Œ๋”๋ง์ด ๋” ์˜ค๋žœ ์‹œ๊ฐ„ ๋™์•ˆ ์ผ์‹œ ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งž์ถค์‹ ์ง€์ ์—์„œ ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ํ–ˆ๋Š”์ง€ ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ด์œ ๋ฅผ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/kaisalmen/WWOBJLoader/issues/11
์ด ๋ฌธ์ œ๋Š” ์•„์ง ์Šคํ…์ด๋ฉฐ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ณง ๋‚˜์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ์ˆ˜์น˜๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด 2048x2048 ํ…์Šค์ฒ˜๊ฐ€ ์žˆ๋Š” 13MB ๋ชจ๋ธ์„ ๋กœ๋“œํ•˜๋Š” https://threejs.org/examples/webgl_loader_gltf2.html ์˜ ์„ฑ๋Šฅ ํ”„๋กœํ•„์ด

screen shot 2017-07-11 at 10 11 42 pm

์ด ๊ฒฝ์šฐ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ์ฃผ์š” ์ž‘์—…์€ ํ…์Šค์ฒ˜๋ฅผ GPU์— ์—…๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ, ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ WW์—์„œ๋Š” ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋กœ๋”๊ฐ€ ํ…์Šค์ฒ˜๋ฅผ ์ ์ง„์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ three.js๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ˜ธ๊ธฐ์‹ฌ์„ ์œ„ํ•ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ๋งˆ์ง€๋ง‰ ์ฒญํฌ๋Š” ํ™˜๊ฒฝ ํ๋ธŒ ๋งต์˜ ์ถ”๊ฐ€์ž…๋‹ˆ๋‹ค.

react-vr์˜ ์ฃผ์š” ๋ชฉํ‘œ๋Š” ๋ฒฝ์‹œ๊ณ„ ์‹œ๊ฐ„ ์ธก๋ฉด์—์„œ ๊ฐ€์žฅ ์ตœ์ ์˜ ๋กœ๋”๋ฅผ ๊ฐ€์งˆ ํ•„์š”๋Š” ์—†์ง€๋งŒ ์ƒˆ๋กœ์šด ์ฝ˜ํ…์ธ ๋ฅผ ๋กœ๋“œํ•  ๋•Œ ๊ฐ‘์ž‘์Šค๋Ÿฝ๊ณ  ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ํ”„๋ ˆ์ž„ ์•„์›ƒ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์€ ํŠนํžˆ VR์„ ์ œ์™ธํ•œ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ์œ ์ตํ•ฉ๋‹ˆ๋‹ค.

ํ…์Šค์ฒ˜๋Š” ํ™•์‹คํžˆ ๋ฌธ์ œ์ด๋ฉฐ ๋ถ„๋ช…ํ•œ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ์„ ํƒ์ ์œผ๋กœ ์ฆ๋ถ„์ ์œผ๋กœ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(ํฐ ํ…์Šค์ฒ˜์˜ ๊ฒฝ์šฐ ํ•œ ๋ฒˆ์— ์ผ๋ จ์˜ ๋ผ์ธ). ์—…๋กœ๋“œ๊ฐ€ ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด ์ˆจ๊ฒจ์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šธ ๊ฒƒ์ด์ง€๋งŒ three.js์˜ ๋ถ€๋‹ด์„ ๋œ๊ธฐ ์œ„ํ•ด webgl ๋ Œ๋”๋Ÿฌ์— ๋” ๊ณต๊ฐœ์ ์œผ๋กœ ๋…ธ์ถœ๋˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

gltf ๊ตฌ๋ฌธ ๋ถ„์„์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ ํ…Œ์ŠคํŠธ์—์„œ 500ms์˜ ์ฐจ๋‹จ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ค‘์š”ํ•˜๋ฉฐ ๋ชจ๋“  ๋กœ๋”(๋ณต์ œ ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ)์— ๋Œ€ํ•œ ์ ์ง„์  ์ ‘๊ทผ ๋ฐฉ์‹์„ ํ›จ์”ฌ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

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

@kaisalmen ๋งํฌ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

Elation Engine/JanusWeb์—์„œ ์šฐ๋ฆฌ๋Š” ์‹ค์ œ๋กœ ์ž‘์—…์ž ์Šค๋ ˆ๋“œ ํ’€์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ๋ชจ๋ธ ๊ตฌ๋ฌธ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฝค ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋™์ž๊ฐ€ ๊ฐ ๋ชจ๋ธ ์™„์„ฑ ๋กœ๋”ฉ์ด๋˜๋ฉด, ์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉํ•˜์—ฌ ์ง๋ ฌํ™” object.toJSON() ์œผ๋กœ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋กœ ๋ณด๋‚ด postMessage() , ๋‹ค์Œ ์‚ฌ์šฉํ•˜์—ฌ๋กœ๋“œ ObjectLoader.parse() . ์ด๊ฒƒ์€ ๋กœ๋” ์ฝ”๋“œ์˜ ๋Œ€๋ถ€๋ถ„์˜ ์ฐจ๋‹จ ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ObjectLoader.parse() ์— ์—ฌ์ „ํžˆ ์•ฝ๊ฐ„์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜์–ด ์•„๋งˆ๋„ ์ตœ์ ํ™”๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ „๋ฐ˜์ ์ธ ์ƒํ˜ธ ์ž‘์šฉ ๋ฐ ๋กœ๋“œ ์†๋„๊ฐ€ ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ์ž‘์—…์ž ํ’€์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ๋ชจ๋ธ์„ ๋ณ‘๋ ฌ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ณต์žกํ•œ ์žฅ๋ฉด์—์„œ ํฐ ์ด์ ์ž…๋‹ˆ๋‹ค.

ํ…์Šค์ฒ˜ ์ธก๋ฉด์—์„œ, ๋„ค, three.js์˜ ํ…์Šค์ฒ˜ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ์— ์•ฝ๊ฐ„์˜ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. texSubImage2D ์‚ฌ์šฉํ•˜๋Š” ์ฒญํฌ ์—…๋กœ๋”๊ฐ€ ์ด์ƒ์ ์ด๋ฉฐ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ํ”„๋ ˆ์ž„์— ๊ฑธ์ณ ํฐ ํ…์Šค์ฒ˜๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Three.js๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋งŽ์€ ํ”„๋กœ์ ํŠธ์— ๋„์›€์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ํ˜‘๋ ฅํ•˜๊ฒŒ ๋˜์–ด ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค.

texSubImage2D ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ WebGL์ด ํ…์Šค์ฒ˜๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์—…๋กœ๋“œํ•˜์ง€ ์•Š๋Š” ์ด์œ ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
OpenGL ๋ฐ ๊ธฐํƒ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ๋™์ผํ•œ ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๊ฒƒ์€ GLSL ์ปดํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
ํ”„๋ ˆ์ž„์ด ๋–จ์–ด์งˆ๊นŒ์š”? ์•„๋‹ˆ๋ฉด ์ถฉ๋ถ„ํžˆ ๋นจ๋ผ์„œ ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๊นŒ?

์˜ˆ, ์ด๊ฒƒ์€ ๋„ค์ดํ‹ฐ๋ธŒ OpenGL์—์„œ๋„ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์…ฐ์ด๋” ์ปดํŒŒ์ผ ๋ฐ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ ์—…๋กœ๋“œ๋Š” ๋™๊ธฐ/์ฐจ๋‹จ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„์˜ ๊ฒŒ์ž„ ์—”์ง„์ด ๋ ˆ๋ฒจ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋ชจ๋“  ์ฝ˜ํ…์ธ ๋ฅผ ๋ฏธ๋ฆฌ ๋กœ๋“œํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๊ฑฐ๋‚˜ ์‹ฌ์ง€์–ด ๊ฐ•์ œํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜๋“œ ๋“œ๋ผ์ด๋ธŒ์—์„œ ์ƒˆ ๋ฆฌ์†Œ์Šค๋ฅผ ๋กœ๋“œํ•˜๊ธฐ์—๋Š” ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋„ˆ๋ฌด ํฐ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋ฉฐ ์—ฌ๊ธฐ์„œ๋Š” ๋น„๋™๊ธฐ์‹์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท์„ ํ†ตํ•ด...์šฐ๋ฆฌ๋Š” ์‹ค์ œ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์ž๋ณด๋‹ค ๋” ์–ด๋ ค์šด ๋ฌธ์ œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ƒˆ๋กœ์šด ์ฝ˜ํ…์ธ ๋ฅผ ์ฆ‰์„์—์„œ ์ŠคํŠธ๋ฆฌ๋ฐํ•  ์ˆ˜ ์žˆ์œผ๋ ค๋ฉด ๋” ๊ณ ๊ธ‰ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•ž์œผ๋กœ ์ƒˆ๋กœ์šด ImageBitmap API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ…์Šค์ฒ˜ ์—…๋กœ๋“œ๊ฐ€ ๋œ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. https://youtu.be/wkDd-x0EkFU?t=82 ๋ฅผ ์ฐธ์กฐ

BTW: @spite ๋•๋ถ„์— ์ด๋ฏธ ํ”„๋กœ์ ํŠธ์— ์‹คํ—˜์ ์ธ ImageBitmapLoader ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@Mugen87 ์‹ค์ œ๋กœ Elation Engine/JanusWeb์—์„œ ImageBitmap์œผ๋กœ ๋ชจ๋“  ํ…์Šค์ฒ˜ ๋กœ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ๋„์›€์ด ๋˜๊ณ  Three.js ์ฝ”์–ด์— ํ†ตํ•ฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์ง€๋งŒ WebGL์—์„œ ํ…์Šค์ฒ˜ ์‚ฌ์šฉ๊ณผ ๊ด€๋ จ๋œ ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๋น„์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค - ์ด๋ฏธ์ง€ ๋””์ฝ”๋”ฉ ์‹œ๊ฐ„ , ๋ฐ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์‹œ๊ฐ„ - ImageBitmap์€ ์ฒซ ๋ฒˆ์งธ์—๋งŒ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚ด ํ…Œ์ŠคํŠธ์—์„œ CPU๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ์‹œ๊ฐ„์„ ์•ฝ 50% ๋‹จ์ถ•ํ•˜์ง€๋งŒ GPU, ํŠนํžˆ 2048x2048 ์ด์ƒ์— ํฐ ํ…์Šค์ฒ˜๋ฅผ ์—…๋กœ๋“œํ•˜๋Š” ๋ฐ 1์ดˆ ๋˜๋Š” ๊ทธ ์ด์ƒ์ด ์‰ฝ๊ฒŒ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@jbaicoianu ๊ฐ€ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์„ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ฃผ ์Šค๋ ˆ๋“œ ๋Œ€์•ˆ์„ ์„ ํƒํ•˜๋ฉด setTimeout ๋Œ€์‹  requestIdleCallback ๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ๋Ÿฌ๋ถ„ ๋ชจ๋‘์—๊ฒŒ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์ž์˜ ๋ชจ๋“  ๊ฒƒ์„ ๋กœ๋“œ ๋ฐ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ , ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋‹ค์‹œ ์ƒ์„ฑํ•˜๊ณ (๋งค์šฐ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ) ๋ Œ๋”๋Ÿฌ์— ์ฆ๋ถ„ ๋กœ๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋ฏฟ์Šต๋‹ˆ๋‹ค.
MVP์˜ ๊ฒฝ์šฐ maxTexturesUploadPerFrame(๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌดํ•œ)์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ Œ๋”๋Š” ํ•ด๋‹น ์ˆซ์ž์— ๋”ฐ๋ผ ํ’€์—์„œ ๋กœ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
๋‹ค์Œ ๋ฐ˜๋ณต์—์„œ๋Š” @spite๊ฐ€ ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ ๋…ผ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ‰๊ท ์„ ์ธก์ •ํ•˜๊ณ  ์ฐจ๋‹จํ•˜๊ธฐ ์ „์— ์•ˆ์ „ํ•œ ๋ฒ”์œ„ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ฒ˜์Œ์— ๊ฐ ํ…์Šค์ฒ˜์— ๋Œ€ํ•ด ๋‹จ์œ„๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋” ํฐ ํ…์Šค์ฒ˜์— ๋Œ€ํ•œ ์ฒญํฌ๋ฅผ ์ ์ง„์ ์œผ๋กœ ์—…๋กœ๋“œํ•˜๋„๋ก ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

requestIdleCallback์€ ์ข‹๊ฒ ์ง€๋งŒ ๋„๋ฆฌ ์ง€์›๋˜์ง€ ์•Š๊ณ  WebVR ์„ธ์…˜์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

@spite ๋‚˜๋Š” ๋‹น์‹ ์˜ ๋ฌธ์žฅ์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

texSubImage2D๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…์Šค์ฒ˜๋ฅผ ์ ์ง„์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” THREE.UpdatableTexture๊ฐ€ ์žˆ์ง€๋งŒ three.js๋ฅผ ์•ฝ๊ฐ„ ์กฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„์ด๋””์–ด๋Š” ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด PR์„ ์ค€๋น„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

requestIdleCallback(rIC) ๊ด€๋ จ:

  • ์ฒซ์งธ, ํฌ๋กฌ๊ณผ ํŒŒ์ด์–ดํญ์Šค์—์„œ ์ง€์›๋˜๋ฉฐ, ํด๋ฆฌํ•„์ด ์‰ฝ๊ฒŒ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ํด๋ฆฌํ•„ ๋ฒ„์ „์€ ๋ชฉ์ ์„ ์•ฝ๊ฐ„ ๋ฌด๋„ˆ๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‘ ๋ฒˆ์งธ: ํ”„๋ ˆ์  ํ…Œ์ด์…˜ํ•  ๋•Œ window.rAF ๋Œ€์‹  vrDisplay.requestAnimationFrame(rAF)์„ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ, ์ด crbug ์—์„œ ๋…ผ์˜๋œ ๋ฐ”์™€ ๊ฐ™์ด rIC์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋กœ๋”๋Š” ํ•ญ์ƒ ํ˜„์žฌ ํ™œ์„ฑ ๋””์Šคํ”Œ๋ ˆ์ด๋ฅผ ์ธ์‹ํ•ด์•ผ ํ•˜๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ‘œ์‹œ๋˜๋Š” ๋‚ด์šฉ์— ๋”ฐ๋ผ ์‹คํ–‰์ด ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๋ณต์žกํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋กœ๋”์˜ ๋ฐฐ์„ ์— ๋” ๋งŽ์€ ๋ณต์žก์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(์ด์ƒ์ ์œผ๋กœ๋Š” ํ”„๋ฆฌ์  ํ…Œ์ด์…˜ ์ƒํƒœ์™€ ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•จ). ๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ ํ˜„์žฌ ๋””์Šคํ”Œ๋ ˆ์ด๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ฆ๋ถ„ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ๋ถ€๋ถ„์„ threejs์— ๋‘๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. threejs์˜ VR์— ๋Œ€ํ•œ ์ตœ์‹  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด์ œ ํ›จ์”ฌ ๋” ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๊ณ ๋ ค ์‚ฌํ•ญ: texSubImage2D(256x256 ๋˜๋Š” 512x512)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ํ•˜๋‚˜์˜ ํฐ ํ…์Šค์ฒ˜๋ฅผ ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ์œผ๋ ค๋ฉด ์˜คํ”„์…‹ ๋ฐ ํด๋ฆฌํ•‘ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” WebGL2 ์ปจํ…์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๊ธฐ ์ „์— ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ์ธก์— ํƒ€์ผ๋ง๋œ ์บ”๋ฒ„์Šค๋ฅผ ํ†ตํ•ด ๋ฏธ๋ฆฌ ์ž˜๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@spite ์ข‹์€ ์ , ํ”„๋ ˆ์  ํ…Œ์ด์…˜ํ•  ๋•Œ rIC๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” display.rIC๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ .rIC๋Š” ์ฐฝ์— ์—ฐ๊ฒฐ๋˜๊ณ  ์ฐฝ์ด๋‚˜ ๋””์Šคํ”Œ๋ ˆ์ด๊ฐ€ ํ‘œ์‹œ๋  ๋•Œ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์œ ํœด.
๋‚˜๋Š” ๋‚ด๊ฐ€ webvr ์‚ฌ์–‘ ํ† ๋ก ์ด ๊ด€๋ จ ๊ฒƒ๋„ ์–ด์ฉŒ๋ฉด ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ํ™•์‹คํžˆ ์šฐ๋ฆฌ๊ฐ€ ํ•ด๊ฒฐํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค @kearwood์„ ๋“ฃ์ง€ ์•Š์•˜๋‹ค ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

UpdatableTexture PR์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค! :) ๊ทธ๊ฒƒ์ด ๋‹จ์ง€ WIP์ผ์ง€๋ผ๋„ ์šฐ๋ฆฌ๋Š” ํ† ๋ก ์˜ ์ผ๋ถ€๋ฅผ ๊ทธ๊ณณ์œผ๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๋กœ๋”๊ฐ€ ์ด๋ ‡๊ฒŒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ...

THREE.MyLoader = ( function () {

    // parse file and output js object
    function parser( text ) {
        return { 'vertices': new Float32Array() }
    }

    // convert js object to THREE objects.
    function builder( data ) {
        var geometry = new THREE.BufferGeometry();
        geometry.addAttribute( new THREE.BufferAttribute( data.vertices, 3 );
        return geometry;
    }

    function MyLoader( manager ) {}
    MyLoader.prototype = {
        constructor: MyLoader,
        load: function ( url, onLoad, onProgress, onError  ) {},
        parse: function ( text ) {
            return builder( parser( text ) );
        },
        parseAsync: function ( text, onParse ) {
            var code = parser.toString() + '\nonmessage = function ( e ) { postMessage( parser( e.data ) ); }';
            var blob = new Blob( [ code ], { type: 'text/plain' } );
            var worker = new Worker( window.URL.createObjectURL( blob ) );
            worker.addEventListener( 'message', function ( e ) {
                onParse( builder( e.data ) );
            } );
            worker.postMessage( text );
        }
    }
} )();

THREE.UpdatableTexture์˜ ์ฒซ ๋ฒˆ์งธ ์ œ์•ˆ ๋ฆด๋ฆฌ์Šค

์ด์ƒ์ ์œผ๋กœ๋Š” THREE.Texture์˜ ์ผ๋ถ€์—ฌ์•ผ ํ•˜์ง€๋งŒ ๋จผ์ € ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

@mrdoob ์ž‘์—…์ž์—๊ฒŒ ์ •ํ™•ํžˆ ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ํŒŒ์ดํ”„๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์˜ ์žฅ์ ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •๋ง ์ž˜๋ชป๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ๐Ÿ˜„. ๋‚˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง๋ ฌํ™”ํ•˜๊ณ , ์–ผ๋ฃฉ์ง€๊ณ , ์žฌํ‰๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋”์ฐํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋Ÿฌํ•œ ๋‹จ์ ์— ์ตœ์ ํ™”๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ๐Ÿ™ƒ

๋˜ํ•œ ์ด์ƒ์ ์œผ๋กœ๋Š” ๋ฆฌ์†Œ์Šค ์ž์ฒด์˜ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์ž‘์—…์ž์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ธŒ๋ผ์šฐ์ €์˜ parser() ๋ฉ”์„œ๋“œ๋Š” three.js ์ž์ฒด์˜ importScripts๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋™๊ธฐํ™”/๋น„๋™๊ธฐ ๋กœ๋”๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ ๋‹จ์ผ ํฌ์ธํŠธ๋Š” ํ‚ฅ์• ์Šค์ž…๋‹ˆ๋‹ค!

@mrdoob builder ํ•จ์ˆ˜๋Š” ๋ชจ๋“  ๋กœ๋”์— ์™„์ „ํžˆ ์ผ๋ฐ˜์ ์ด๊ณ  ๊ณตํ†ต์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(WIP: https://github.com/kaisalmen/WWOBJLoader/blob/Commons/src/loaders/support/WWMeshProvider.js#LL215- LL367, ์—…๋ฐ์ดํŠธ: ์•„์ง ํ•จ์ˆ˜์—์„œ ๊ฒฉ๋ฆฌ๋˜์ง€ ์•Š์Œ). ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ THREE ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ ์—†์ด ์ˆœ์ˆ˜ํ•œ js ๊ฐ์ฒด๋กœ ์ œํ•œ๋˜๋Š” ๊ฒฝ์šฐ(์ด๊ฒƒ์ด ๋ฐ”๋กœ ์—ฌ๋Ÿฌ๋ถ„์ด ์—ผ๋‘์— ๋‘๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งž์ฃ ?) ์ž‘์—…์ž์—์„œ ๊ฐ€์ ธ์˜ฌ ํ•„์š” ์—†์ด ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•œ ์ž‘์—…์ž ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค( WWOBJLoader ). ์ด๊ฒƒ์€ Geometry์—์„œ๋Š” ์‰ฝ์ง€๋งŒ Material/Shaders(ํŒŒ์ผ์— ์ •์˜๋œ ๊ฒฝ์šฐ)๋Š” ๋นŒ๋”์—์„œ๋งŒ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด์ „์—๋Š” parser ์˜ํ•ด JSON์œผ๋กœ๋งŒ ์„ค๋ช…๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ž‘์—…์ž๋Š” ๋ชจ๋“  ์ƒˆ๋กœ์šด ๋ฉ”์‹œ์™€ ์™„๋ฃŒ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// parse file and output js object
function parser( text, onMeshLoaded, onComplete ) {
    ....
}
parse: function ( text ) {
    var node = new THREE.Object3d();
    var onMeshLoaded = function ( data ) {
        node.add( builder( data ) );
    };

    // onComplete as second callbackonly provided in async case
    parser( text, onMeshLoaded ) );
    return node;
},

์ž‘์—…์ž ๋นŒ๋” ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ํŒŒ์„œ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ์•„์ด๋””์–ด์™€ ๋ชจ์ˆœ๋˜์ง€ ์•Š๋Š” ์ผ๋ถ€ ์ผ๋ฐ˜ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ์ด ๋„์›€์ด ๋˜์ง€๋งŒ ์ผ๋ถ€ ๋ž˜ํ•‘์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. WWOBJLoader ์ง„ํ™”์˜ ํ˜„์žฌ ์ƒํƒœ: https://github.com/kaisalmen/WWOBJLoader/blob/Commons/src/loaders/support/WWMeshProvider.js#LL40 -LL133 ๋ฐ˜๋ฉด ํ”„๋ŸฐํŠธ ์—”๋“œ ํ˜ธ์ถœ์€ report_progress, meshData ๋ฐ ์™„๋ฃŒ์ž…๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ2:

  • Parser๊ฐ€ statelessํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? builder ์—๋Š” ๊ดœ์ฐฎ์ง€๋งŒ parser ์˜ ๋™์ž‘์„ ์กฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ๊ตฌ์„ฑ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๊ตฌ๋ฌธ ๋ถ„์„๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘์—…์ž์—๊ฒŒ ์ „์†ก ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ๊ตฌ์„ฑ ๊ฐœ์ฒด๋ฅผ ๋จน๋Š” ์‹คํ–‰ ๊ธฐ๋Šฅ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์žˆ์œผ๋ฉด ๋ฉ‹์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ผ๋ฐ˜ ๋””๋ ‰ํ„ฐ๋Š” ๋ชจ๋“  ๋กœ๋”์— ์ง€์นจ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด๋Š” ํ˜„์žฌ WWOBJLoader , btw์˜ ๋งž์ถคํ˜• Commons ๋ถ„๊ธฐ์—์„œ ์ž‘๋™ ์ค‘์ž…๋‹ˆ๋‹ค).
  • ์ง„ํ–‰ ์ค‘์ธ ๊ฐœ๋ฐœ: WWOBJLoader2 ์ด์ œ OBJLoader ํ™•์žฅํ•˜๊ณ  ๊ตฌ๋ฌธ ๋ถ„์„์„ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๋‘ ๊ฐœ์˜ ๊ตฌ๋ฌธ ๋ถ„์„ ์บก์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ํด๋ž˜์Šค๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ œ์•ˆ์— ๊ฐ€๊นŒ์›Œ์กŒ์ง€๋งŒ ์•„์ง๊นŒ์ง€๋Š” ์ด๋ฅด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ํŒŒ์„œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ฉํ•ด์•ผ ํ•˜๋ฉฐ ๊ฒฐ๊ตญ ๋‘ ํด๋ž˜์Šค๋ฅผ ์œตํ•ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ๊ทธ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ํ”ผ๋“œ๋ฐฑ ํ™˜์˜ ๐Ÿ˜„

@mrdoob ๋กœ๋”์˜ ์ฝ”๋“œ์—์„œ ์ž‘์—…์ž๋ฅผ ์ฆ‰์„์—์„œ ๊ตฌ์„ฑํ•˜๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์—

๊ธฐ๋ณธ ์Šค๋ ˆ๋“œ๋กœ ๋‹ค์‹œ ์ „๋‹ฌํ•  ๋•Œ TypedArray๋ฅผ ์ „์†ก ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ด ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์—…์ž ๊ฐ„์— ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์ถ•์†Œ๋œ ์ „์†ก ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ ‘๊ทผ ๋ฐฉ์‹์—์„œ๋Š” ์ž‘์—…์ž์—์„œ .toJSON() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ •์ , UV ๋“ฑ์— ๋Œ€ํ•œ JS ๋ฐฐ์—ด์„ ์‚ดํŽด๋ณด๊ณ  ์ ์ ˆํ•œ TypedArray ์œ ํ˜•์œผ๋กœ ๊ต์ฒดํ•˜๊ณ  ํ˜ธ์ถœํ•  ๋•Œ ์ „์†ก ๊ฐ€๋Šฅ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ํฌ์ŠคํŠธ ๋ฉ”์‹œ์ง€. ์ด๊ฒƒ์€ ์ž‘์—…์ž์˜ ์ฒ˜๋ฆฌ/๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์กฐ๊ธˆ ๋” ํฌ์ƒ์‹œํ‚ค๋ฉด์„œ ๊ธฐ๋ณธ ์Šค๋ ˆ๋“œ์—์„œ ๊ตฌ๋ฌธ ๋ถ„์„/๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์กฐ๊ธˆ ๋” ๊ฐ€๋ณ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ „์†ก ํ˜•์‹์„ ์ œ์•ˆํ•˜๊ฑฐ๋‚˜ .toJSON() ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ JS ๋ฐฐ์—ด ๋Œ€์‹  TypedArray๋ฅผ ์„ ํƒ์ ์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ด ๋‹จ์ˆœํ™”๋œ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋‘ ๊ฐ€์ง€ ๋‹จ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ์กด ๋ชจ๋ธ ๋กœ๋”๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ๋กœ๋”๊ฐ€ ๋‚ด์žฅ๋œ 3๊ฐœ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ํด๋ž˜์Šค์™€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ์•„๋งˆ๋„ ์ตœ์†Œํ•œ์˜ three.js ์ฝ”๋“œ ์„ธํŠธ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž‘์—…์ž์˜ ๊ฒฝ์šฐ ์ด๊ฒƒ์ด ๊นŒ๋‹ค๋กœ์›Œ์ง‘๋‹ˆ๋‹ค.
  • ์ „์†ก ํ˜•์‹์€ ๋‹ค๋ฅธ ๊ฐœ์ฒด ์œ ํ˜•(Mesh, SkinnedMesh, Light, Camera, Object3D, Line ๋“ฑ)๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐœ์ฒด ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์บก์ฒ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@spite "๋˜ํ•œ ์ด์ƒ์ ์œผ๋กœ๋Š” ๋ฆฌ์†Œ์Šค ์ž์ฒด๋ฅผ ์ž‘์—…์ž์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค." - ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ Elation Engine์„ ์œ„ํ•œ ์ž‘์—…์ž ๊ธฐ๋ฐ˜ ์ž์‚ฐ ๋กœ๋”๋ฅผ ์ฒ˜์Œ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ์˜ ์ƒ๊ฐ์ด์—ˆ์Šต๋‹ˆ๋‹ค. - ์ €๋Š” 4๋ช… ๋˜๋Š” 8๋ช…์˜ ์ž‘์—…์ž ํ’€์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๊ณ  ๊ทธ๋“ค์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์ง€๋ฉด ์ž‘์—…์„ ์ „๋‹ฌํ•œ ๋‹ค์Œ ์ž‘์—…์ž๊ฐ€ ํŒŒ์ผ์„ ๊ฐ€์ ธ์™€ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์„ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋กœ ๋Œ๋ ค๋ณด๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ ์ด๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” ๋‹ค์šด๋กœ๋“œ๊ฐ€ ๊ตฌ๋ฌธ ๋ถ„์„์„ ์ฐจ๋‹จํ•˜๊ณ  ํ•œ ๋ฒˆ์— ๋ชจ๋‘ ์š”์ฒญํ•˜๋ฉด ํŒŒ์ดํ”„๋ผ์ด๋‹ ๋“ฑ์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ด์ ์„ ์žƒ๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ๊นจ๋‹ซ๊ณ  ๋ชจ๋“  ์ž์‚ฐ ๋‹ค์šด๋กœ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๊ณ„์ธต์„ ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ ์ž์‚ฐ ๋‹ค์šด๋กœ๋”๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ์ž์‚ฐ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด์ง„ ํŒŒ์ผ ๋ฐ์ดํ„ฐ์˜ transferrable์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์ž ํ’€๋กœ ์ „๋‹ฌํ•˜์—ฌ ์ž‘์—…์ž์—๊ฒŒ ํšจ์œจ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๋‹ค์šด๋กœ๋“œ๋Š” ๋ชจ๋‘ ๊ธฐ๋ณธ ์Šค๋ ˆ๋“œ์— ์žˆ๋”๋ผ๋„ ๋” ๋น ๋ฅด๊ฒŒ ๋ฐœ์ƒํ•˜๊ณ  ํŒŒ์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ์—„์ง€์†๊ฐ€๋ฝ์„ ๋งŒ์ง€์ž‘๊ฑฐ๋ฆฌ์ง€ ์•Š๊ณ  ์ฒ˜๋ฆฌ ์‹œ ์ „์ฒด ๋ณด์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ „๋ฐ˜์ ์œผ๋กœ ์ด๊ฒƒ์€ ์ž์‚ฐ ๋กœ๋“œ ์†๋„ ์ธก๋ฉด์—์„œ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์ตœ๊ณ ์˜ ์ตœ์ ํ™” ์ค‘ ํ•˜๋‚˜๋กœ ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค.

ํ…์Šค์ฒ˜ ๋กœ๋”ฉ ์ฃผ์ œ์— ๋Œ€ํ•ด FramebufferTextureLoader ์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ์ƒˆ๋กœ์šด FramebufferTexture ํด๋ž˜์Šค์˜ ๊ฐœ๋… ์ฆ๋ช…์„ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ํ…์Šค์ฒ˜ ์œ ํ˜•์€ WebGLRenderTarget ํ™•์žฅํ•˜๋ฉฐ ํ•ด๋‹น ๋กœ๋”๋Š” ์ฃผ์–ด์ง„ ํฌ๊ธฐ์˜ ์ฒญํฌ ํƒ€์ผ์— ํ…์Šค์ฒ˜๋ฅผ ๋กœ๋“œํ•˜๊ณ  requestIdleCallback() ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ ˆ์ž„ ๋ฒ„ํผ๋กœ ๊ตฌ์„ฑํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://baicoianu.com/~bai/three.js/examples/webgl_texture_framebuffer.html

์ด ์˜ˆ์—์„œ๋Š” ์ด๋ฏธ์ง€ ํฌ๊ธฐ์™€ ํƒ€์ผ ํฌ๊ธฐ๋ฅผ ์„ ํƒํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋กœ๋“œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ๋จผ์ € ํ…์Šค์ฒ˜๋ฅผ ์ˆœ์ˆ˜ํ•œ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ (์•ฝ 10MB์ด๋ฏ€๋กœ ์•ฝ๊ฐ„๋งŒ ์ œ๊ณต) ์ด๋ฏธ์ง€๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋ฐฐ๊ฒฝ์„ ํŒŒ๋ž€์ƒ‰์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ ํŒŒ์ผ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด createImageBitmap() ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๊ณ , ์™„๋ฃŒ๋˜๋ฉด ์ด๋ฏธ์ง€๋ฅผ ํƒ€์ผ๋กœ ํšจ์œจ์ ์œผ๋กœ ๋ถ„ํ• ํ•˜๋Š” createImageBitmap() ๋Œ€ํ•œ ์ถ”๊ฐ€ ํ˜ธ์ถœ์„ ํฌํ•จํ•˜๋Š” ์—ฌ๋Ÿฌ ์œ ํœด ์ฝœ๋ฐฑ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. . ์ด๋Ÿฌํ•œ ํƒ€์ผ์€ ์—ฌ๋Ÿฌ ํ”„๋ ˆ์ž„์— ๊ฑธ์ณ ํ”„๋ ˆ์ž„ ๋ฒ„ํผ์— ๋ Œ๋”๋ง๋˜๋ฉฐ ํ•œ ๋ฒˆ์— ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ”„๋ ˆ์ž„ ์‹œ๊ฐ„์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์ด ํ›จ์”ฌ ์ ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  - FireFox๋Š” ํ˜„์žฌ createImageBitmap ์˜ ๋ชจ๋“  ๋ฒ„์ „์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ํ˜„์žฌ ํƒ€์ผ๋กœ ๋ถ„ํ• ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด ๋ฐ๋ชจ๋Š” ํ˜„์žฌ Chrome์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. FireFox์˜ createImageBitmap ์ง€์› ๋กœ๋“œ๋งต์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ช‡ ๊ฐ€์ง€ ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœํ† ํƒ€์ž…์€ ์•ฝ๊ฐ„ ์ง€์ €๋ถ„ํ•˜์ง€๋งŒ ๊ฒฐ๊ณผ์— ๋งค์šฐ ๋งŒ์กฑํ•˜๋ฉฐ ๋ธŒ๋ผ์šฐ์ € ๊ฐ„ ๋ฌธ์ œ(์บ”๋ฒ„์Šค ๋Œ€์ฒด ๋“ฑ)๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ฒŒ ๋˜๋ฉด ์ด๊ฒƒ์„ JanusWeb์˜ ๋ชจ๋“  ํ…์Šค์ฒ˜์— ๋Œ€ํ•œ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. ํŽ˜์ด๋“œ ์ธ ํšจ๊ณผ๋„ ์•ฝ๊ฐ„ ๊น”๋”ํ•˜๋ฉฐ, ์ถ•์†Œ๋œ ๋ฒ„์ „์„ ๋จผ์ € ํ™”๋ คํ•˜๊ฒŒ ๋งŒ๋“  ๋‹ค์Œ ๋” ๋†’์€ ๋””ํ…Œ์ผ์˜ ํƒ€์ผ์„ ์ ์ง„์ ์œผ๋กœ ๋กœ๋“œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‘œ์ค€ ํ…์Šค์ฒ˜ ์ฐธ์กฐ๊ฐ€ ์•„๋‹Œ ์žฅ๋ฉด์˜ ๋ชจ๋“  ํ…์Šค์ฒ˜์— ๋Œ€ํ•ด ํ”„๋ ˆ์ž„ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์™œ ๋‚˜์œ ์ƒ๊ฐ์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ˆ„๊ตฌ๋‚˜ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ์„ฑ๋Šฅ ๋˜๋Š” ๊ธฐ๋Šฅ ๊ด€๋ จ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” max์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์žฅ๋ฉด๋‹น ํ”„๋ ˆ์ž„ ๋ฒ„ํผ, ์ผ๋‹จ ํ”„๋ ˆ์ž„ ๋ฒ„ํผ๊ฐ€ ์„ค์ •๋˜๋ฉด ์•Œ ์ˆ˜ ์žˆ๋Š” ํ•œ, ๋ Œ๋”๋งํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค๋ฅธ ํ…์Šค์ฒ˜ ์ฐธ์กฐ์™€ ๋™์ผํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ถ„๋ช…ํ•œ ๊ฒƒ์„ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค. ์™œ ์ด๊ฒƒ์ด ์ •๋ง ๋‚˜์œ ์ƒ๊ฐ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๊นŒ? :)

@jbaicoianu re: firefox์˜ createImageBitmap, ๊ทธ ์ด์œ ๋Š” ์‚ฌ์ „ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด๋ฏธ์ง€ ๋ฐฉํ–ฅ์ด๋‚˜ ์ƒ‰ ๊ณต๊ฐ„ ๋ณ€ํ™˜์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ API์˜ ๋Œ€๋ถ€๋ถ„์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฝค ์“ธ๋ชจ ์—†๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ฌธ์ œ์™€ ๊ด€๋ จ๋œ ๋‘ ๊ฐ€์ง€ ๋ฒ„๊ทธ๋ฅผ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค. https://bugzilla.mozilla.org/show_bug.cgi?id=1367251 ๋ฐ https://bugzilla.mozilla.org/show_bug.cgi?id=1335594

@spite ๊ทธ๊ฒƒ๋„ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ต์…˜ ์‚ฌ์ „์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์— ๋Œ€ํ•œ์ด ๋ฒ„๊ทธ๋ฅผ ๋ณด์•˜์ง€๋งŒ์ด ๊ฒฝ์šฐ์—๋Š” ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€๋„ ์•Š๊ณ  x, y, w, h ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์–ป๋Š” ํŠน์ • ์˜ค๋ฅ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Argument 4 of Window.createImageBitmap '1024' is not a valid value for enumeration ImageBitmapFormat.

ImageBitmapFormat ๋ฅผ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์–‘์— createImageBitmap ๋ฒ„์ „์ด ํ‘œ์‹œ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

ํ‘œ์ค€ ํ…์Šค์ฒ˜ ์ฐธ์กฐ๊ฐ€ ์•„๋‹Œ ์žฅ๋ฉด์˜ ๋ชจ๋“  ํ…์Šค์ฒ˜์— ๋Œ€ํ•ด ํ”„๋ ˆ์ž„ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์™œ ๋‚˜์œ ์ƒ๊ฐ์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ˆ„๊ตฌ๋‚˜ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ์„ฑ๋Šฅ ๋˜๋Š” ๊ธฐ๋Šฅ ๊ด€๋ จ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” max์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์žฅ๋ฉด๋‹น ํ”„๋ ˆ์ž„ ๋ฒ„ํผ, ์ผ๋‹จ ํ”„๋ ˆ์ž„ ๋ฒ„ํผ๊ฐ€ ์„ค์ •๋˜๋ฉด ์•Œ ์ˆ˜ ์žˆ๋Š” ํ•œ, ๋ Œ๋”๋งํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค๋ฅธ ํ…์Šค์ฒ˜ ์ฐธ์กฐ์™€ ๋™์ผํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ถ„๋ช…ํ•œ ๊ฒƒ์„ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค. ์™œ ์ด๊ฒƒ์ด ์ •๋ง ๋‚˜์œ ์ƒ๊ฐ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๊นŒ? :)

@jbaicoianu THREE.WebGLRenderTarget ๋Š” ํ”„๋ ˆ์ž„ ๋ฒ„ํผ, ํ…์Šค์ฒ˜ ๋ฐ ๋ Œ๋” ๋ฒ„ํผ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํ…์Šค์ฒ˜๊ฐ€ ์–ด์…ˆ๋ธ”๋˜๋ฉด ํ”„๋ ˆ์ž„ ๋ฒ„ํผ์™€ ๋ Œ๋” ๋ฒ„ํผ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ํ…์Šค์ฒ˜๋งŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์ด ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(ํ…Œ์ŠคํŠธ๋˜์ง€ ์•Š์Œ).

texture = target.texture;
target.texture = null; // so the webgl texture is not deleted by dispose()
target.dispose();

@wrr ์ข‹์€ ์ •๋ณด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ™•์‹คํžˆ ์ด๊ฒƒ์— ๋Œ€ํ•ด์„œ๋„ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์— ๋Œ€ํ•ด ํŒจ์Šคํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ถฉ๋ถ„ํžˆ ๋ณ€๊ฒฝํ•˜๋ฉด ํ•„์—ฐ์ ์œผ๋กœ ์–ด๋Š ์‹œ์ ์—์„œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์•„์ง ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์€ ์ •๋ฆฌ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํžŒํŠธ๋Š” ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@mrdoob ๊ณผ @jbaicoianu ์ €๋„ ๊ทธ ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์—
OBJLoader ๋ฐ WWOBJLoader ๋ฐ ๋ชจ๋“  ์˜ˆ์ œ( code )์˜ ์ฝ”๋“œ(์žฌ์ž‘์—…๋œ ์ดˆ๊ธฐํ™”, ์ž‘์—…์ž ์ง€์นจ ๊ฐœ์ฒด, ์“ฐ๋ ˆ๊ธฐ ๋‹ค์ค‘ ์ฝœ๋ฐฑ ์ฒ˜๋ฆฌ ๋Œ€์ฒด, ๊ณตํ†ต ๋ฆฌ์†Œ์Šค ์„ค๋ช… ๋“ฑ)๋ฅผ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋‘ ๋กœ๋”๋ฅผ ๊ฒฐํ•ฉํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋‚ด ์—ฌ๊ฐ€ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋‹ค์Œ ์ฃผ์— ๋‹น์‹ ์˜ ์ฒญ์‚ฌ์ง„์— ๋”ฐ๋ผ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ง€์‹œ๋œ WWOBJLoader2 ํ…Œ์ŠคํŠธ:
https://kaisalmen.de/proto/test/wwparallels/main.src.html
์ผ๋ฐ˜ WorkerSupport ์˜ ์ง์ ‘ ์‚ฌ์šฉ์ž:
https://kaisalmen.de/proto/test/meshspray/main.src.html
ํฐ ์••์ถ• OBJ ํŒŒ์ผ ํ…Œ์ŠคํŠธ:
https://kaisalmen.de/proto/test/wwobjloader2stage/main.src.html

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์œ„์˜ ์˜ˆ์ œ๋ฅผ ์ตœ์‹  ์ฝ”๋“œ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์•Œ๋ ค ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
์—…๋ฐ์ดํŠธ 2017-07-30: OBJLoader2 ๋ฐ WWOBJLoader2 ์ด์ œ ๋™์ผํ•œ ํŒŒ์„œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณตํ†ต ๋นŒ๋” ํ•จ์ˆ˜์— ์ง์ ‘ ๋˜๋Š” ์ž‘์—…์ž๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
์—…๋ฐ์ดํŠธ 2017-07-31: WWOBJLoader2 ๊ฐ€ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค. OBJLoader2 ๋Š” parse ๋ฐ parseAsync , load ๋ฐ run ( LoaderDirector ๋˜๋Š” ์ˆ˜๋™์œผ๋กœ ๊ณต๊ธ‰)

์—…๋ฐ์ดํŠธ 2017-08-09:
์—…๋ฐ์ดํŠธ๋ฅผ ์ƒˆ ๊ฒŒ์‹œ๋ฌผ๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค.

OBJLoader2 ๋Š” OBJLoader ์™€ ๋‹ค์‹œ ํ˜ธํ™˜๋˜๋Š” ์„œ๋ช… ๋ฐ ๋™์ž‘์ž…๋‹ˆ๋‹ค(์ง„ํ™” ์ค‘์— ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค). OBJLoader2 ๋Š” parseAsync ๋ฐ load ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค useAsync ํ”Œ๋ž˜๊ทธ๋„ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ด์ œ V2.0.0-๋ฒ ํƒ€๋ผ๊ณ  ๋ถ€๋ฅผ ์ค€๋น„๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ํ˜„์žฌ ๊ฐœ๋ฐœ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/kaisalmen/WWOBJLoader/tree/V2.0.0-Beta/src/loaders

์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฐ ํ•„์ˆ˜ ์ง€์› ๋„๊ตฌ ์—ญํ• ์„ ํ•˜๋Š” LoaderSupport ํด๋ž˜์Šค(OBJ์™€ ๋ฌด๊ด€)๋ฅผ ์ถ”์ถœํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž ์žฌ์ ์ธ ๋‹ค๋ฅธ ์ž‘์—…์ž ๊ธฐ๋ฐ˜ ๋กœ๋”์— ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ๋ชจ๋“  ์ฝ”๋“œ์—์„œ OBJLoader2 ์˜ ์ข…์†์„ฑ์„ ๊ฐ•์กฐํ•˜๊ธฐ ์œ„ํ•ด THREE.LoaderSupport ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์•„๋ž˜์— ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค.

  • Builder : ์ผ๋ฐ˜ ๋ฉ”์‰ฌ ๋นŒ๋”ฉ์šฉ
  • WorkerDirector : ๋ฆฌํ”Œ๋ ‰์…˜์„ ํ†ตํ•ด ๋กœ๋”๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ตฌ์„ฑ๋œ ์ž‘์—…์ž ์ˆ˜๋กœ ๋Œ€๊ธฐ์—ด์—์„œ PrepData ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋กœ๋”๋ฅผ ์™„์ „ํžˆ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ(MeshSpray ๋ฐ Parallels ๋ฐ๋ชจ)
  • WorkerSupport : ๊ธฐ์กด ์ฝ”๋“œ์—์„œ ์ž‘์—…์ž๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ์„ ์„ค์ •ํ•˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค
  • PrepData + ResourceDescriptor : ์ž๋™ํ™”๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์„ค๋ช… ๋˜๋Š” ์˜ˆ์ œ ๊ฐ„์˜ ํ†ต์ผ๋œ ์„ค๋ช…์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์„ค๋ช…
  • Commons : ๋กœ๋”์— ๋Œ€ํ•œ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋ณธ ํด๋ž˜์Šค(๊ณตํ†ต ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฒˆ๋“ค)
  • Callbacks : (onProgress, onMeshAlter, onLoad) ์ž๋™ํ™” ๋ฐ ๋ฐฉํ–ฅ ์ง€์ •์— ์‚ฌ์šฉ๋˜๋ฉฐ LoadedMeshUserOverride ๋Š” onMeshAlter ์—์„œ ์ •๋ณด๋ฅผ ๋‹ค์‹œ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค(์•„๋ž˜ objloader2 ํ…Œ์ŠคํŠธ์˜ ๋ฒ•์„  ์ถ”๊ฐ€).
  • Validator : null/์ •์˜๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜ ๊ฒ€์‚ฌ

@mrdoob @jbaicoianu OBJLoader2 ์ด์ œ ์ œ์•ˆ๋œ ๋Œ€๋กœ ํŒŒ์„œ๋ฅผ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค(์‹คํ–‰์„ ์œ„ํ•ด PrepData ์— ์˜ํ•ด ์ „์—ญ์ ์œผ๋กœ ์„ค์ •๋˜๊ฑฐ๋‚˜ ์ˆ˜์‹ ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ตฌ์„ฑ๋จ). Builder ๋Š” ๋ชจ๋“  ๋‹จ์ผ ์›์‹œ ๋ฉ”์‹œ๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ํŒŒ์„œ๋Š” ๊ธฐ๋ณธ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ๊ทธ ์™ธ์—๋Š” ์ฒญ์‚ฌ์ง„๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.
OBJLoader2 ์—๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์€ ํŒŒ์„œ ์ง๋ ฌํ™”๋ฅผ ์œ„ํ•œ ๋„์šฐ๋ฏธ ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
buildMeshes ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๊ณ„์•ฝ/๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐœ์ฒด๊ฐ€ ์—ฌ์ „ํžˆ OBJ ๋กœ๋“œ์˜ ์˜ํ–ฅ์„ ๋งŽ์ด ๋ฐ›์œผ๋ฏ€๋กœ ๋นŒ๋”๋ฅผ ์ •๋ฆฌํ•ด์•ผ ํ•˜๋ฉฐ ๋”ฐ๋ผ์„œ ์—ฌ์ „ํžˆ ๊ฑด์„ค ์ค‘์ธ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ๋Š” ์•ฝ๊ฐ„์˜ ์—ฐ๋งˆ๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ํ”ผ๋“œ๋ฐฑ, ํ† ๋ก , ๋น„ํŒ ๋“ฑ์„ ์œ„ํ•œ ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค... ๐Ÿ˜„

์˜ˆ ๋ฐ ํ…Œ์ŠคํŠธ

์‹คํ–‰ ๋ฐ ๋กœ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” OBJ ๋กœ๋”:
https://kaisalmen.de/proto/test/objloader2/main.src.html
run async ๋ฐ parseAsync๋ฅผ ์‚ฌ์šฉํ•˜๋Š” OBJ ๋กœ๋”:
https://kaisalmen.de/proto/test/wwobjloader2/main.src.html
๋น„๋™๊ธฐ OBJLoader2 ์‹คํ–‰์˜ ์ง€์‹œ๋œ ์‚ฌ์šฉ:
https://kaisalmen.de/proto/test/wwparallels/main.src.html
์ผ๋ฐ˜ WorkerSupport์˜ ์ง€์‹œ๋œ ์‚ฌ์šฉ:
https://kaisalmen.de/proto/test/meshspray/main.src.html
ํฐ ์••์ถ• OBJ ํŒŒ์ผ ํ…Œ์ŠคํŠธ:
https://kaisalmen.de/proto/test/wwobjloader2stage/main.src.html

์ข‹์•„ ๋ณด์—ฌ! OBJLoader ์˜ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์•Œ๊ณ  ๊ณ„์‹ญ๋‹ˆ๊นŒ? #11871 565c6fd0f3d9b146b9434e5fccfa2345a90a3842

์˜ˆ, ์ด๊ฒƒ์„ ์ด์‹ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์„ฑ๋Šฅ ์ธก์ •์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ์ฃผ๋ง์— ๋‘˜ ๋‹ค ์ž‘์—…์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์–ธ์ œ r87์„ ์ถœ์‹œํ•  ๊ณ„ํš์ž…๋‹ˆ๊นŒ? N-gon ์ง€์›์€ ๋‚ ์งœ์— ๋”ฐ๋ผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@mrdoob ๋ฐ ์งœ์ž”: https://github.com/mrdoob/three.js/pull/11928 n-gon ์ง€์› ๐Ÿ˜„

์ƒํƒœ ์—…๋ฐ์ดํŠธ( ์ฝ”๋“œ ):
์ƒ์„ฑ๋œ ์ž‘์—…์ž๋Š” ์ด์ œ ๋ฉ”์‹œ์ง€์—์„œ ์ˆ˜์‹ ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ž‘์—…์ž ๋‚ด๋ถ€์˜ ๋ชจ๋“  ํŒŒ์„œ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. WorkerSupport ๋Š” ์›ํ•˜๊ฑฐ๋‚˜ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ž์ฒด ์ฝ”๋“œ๋กœ ์™„์ „ํžˆ ๋Œ€์ฒด๋  ์ˆ˜ ์žˆ๋Š” ์ฐธ์กฐ ์ž‘์—…์ž ์‹คํ–‰๊ธฐ ๊ตฌํ˜„( code )์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์ž‘์—…์ž๊ฐ€ ๋งŒ๋“ค๊ณ ์žˆ๋Š” ํŒŒ์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค run ์˜ ๋ฐฉ๋ฒ• WorkerRunnerRefImpl ( Parser ์ž‘์—…์ž ๋ฒ”์œ„ ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ this.applyProperties ํ†ตํ™” ์„ธํ„ฐ ๋˜๋Š” ์†์„ฑ์„ ํŒŒ์„œ):

WorkerRunnerRefImpl.prototype.run = function ( payload ) {
    if ( payload.cmd === 'run' ) {

        console.log( 'WorkerRunner: Starting Run...' );

        var callbacks = {
            callbackBuilder: function ( payload ) {
                self.postMessage( payload );
            },
            callbackProgress: function ( message ) {
                console.log( 'WorkerRunner: progress: ' + message );
            }
        };

        // Parser is expected to be named as such
        var parser = new Parser();
        this.applyProperties( parser, payload.params );
        this.applyProperties( parser, payload.materials );
        this.applyProperties( parser, callbacks );
        parser.parse( payload.buffers.input );

        console.log( 'WorkerRunner: Run complete!' );

        callbacks.callbackBuilder( {
            cmd: 'complete',
            msg: 'WorkerRunner completed run.'
        } );

    } else {

        console.error( 'WorkerRunner: Received unknown command: ' + payload.cmd );

    }
};

OBJLoader2.parseAsync ๋ฉ”์‹œ์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

this.workerSupport.run(
    {
        cmd: 'run',
        params: {
            debug: this.debug,
            materialPerSmoothingGroup: this.materialPerSmoothingGroup
        },
        materials: {
            materialNames: this.materialNames
        },
        buffers: {
            input: content
        }
    },
    [ content.buffer ]
);

๋ฉ”์‹œ์ง€ ๊ฐœ์ฒด๋Š” ๋กœ๋”์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€๋งŒ ์ž‘์—…์ž์˜ ํŒŒ์„œ ๊ตฌ์„ฑ์€ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.
์ด์ „ ๊ฒŒ์‹œ๋ฌผ์˜ ๋งํฌ๋œ ์˜ˆ์ œ์—์„œ ์‚ฌ์šฉ๋œ ์ฝ”๋“œ๋Š” ์ตœ์‹  ์ฝ”๋“œ๋กœ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

OBJLoader2์˜ ์ง„ํ™”์™€ ์ง€์› ๊ธฐ๋Šฅ์˜ ์ถ”์ถœ์€ ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”ผ๋“œ๋ฐฑ์ด ํ•„์š”ํ•œ ์ง€์ ์— ์ด๋ฅด๋ €๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์˜ˆ์ œ๊ฐ€ ํ•ด๋‹น repo์—์„œ ์œ„์˜ ๋ถ„๊ธฐ๋กœ ์ด์‹๋˜๋ฉด ์™„์ „ํ•œ ์š”์•ฝ์ด ํฌํ•จ๋œ PR์„ ์—ด๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ์š”์ฒญํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ, ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ImageBitmapLoader๊ฐ€ ์ž‘์—…์ž๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋Š” ์ž‘์—…์ด ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋” ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์ผ๋ถ€ ์–ด๋ ค์šด ์ˆซ์ž: https://github.com/mrdoob/three.js/pull/12456

firefox์˜ createImageBitmap์€ ์‚ฌ์ „ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ์ง€ ๋ฐฉํ–ฅ์ด๋‚˜ ์ƒ‰ ๊ณต๊ฐ„ ๋ณ€ํ™˜์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ API์˜ ๋Œ€๋ถ€๋ถ„์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฝค ์“ธ๋ชจ ์—†๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ถˆํ–‰ํ•œ ์ผ์ž…๋‹ˆ๋‹ค. โ˜น๏ธ

@mrdoob ๋‹น์‹ ์ด ์ „ํ™˜ ํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ ImageLoader ์— ImageBitmapLoader ์—์„œ TextureLoader ImageBitmap ํ…์Šค์ฒ˜์— ์—…๋กœ๋“œ ๋œ ์ฐจ๋‹จํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—? createImageBitmap() ๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋งŒ ์ „๋‹ฌํ•˜๋ฉด ์ง€๊ธˆ๊นŒ์ง€ FireFox์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. (์•„๋งˆ๋„ TextureLoader ๋ฅผ ํ†ตํ•ด ๋‘ ๋ฒˆ์งธ ๋ฐ ๋” ๋งŽ์€ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๊นŒ?)

return createImageBitmap( blob );

createImageBitmap () ๊ฐ€ ์˜ต์…˜ ์‚ฌ์ „์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ์‹ค์ œ๋กœ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ด๋ฏธ์ง€ ๋ฐฉํ–ฅ(Flip-Y)๊ณผ ๊ฐ™์€ ํ•ญ๋ชฉ์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๋ฏธ๋ฆฌ ๊ณฑํ•œ ์•ŒํŒŒ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ImageBitmap WebGLRenderingContext.pixelStorei ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์–‘์—์„œ :

_TexImageSource๊ฐ€ ImageBitmap์ด๋ฉด ์ด ์„ธ ๊ฐ€์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜(UNPACK_FLIP_Y_WEBGL, UNPACK_PREMULTIPLY_ALPHA_WEBGL, UNPACK_COLORSPACE_CONVERSION_WEBGL)๊ฐ€ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ๋Œ€์‹ ์— ํ•ด๋‹นํ•˜๋Š” ImageBitmapOptions๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ํ˜•์‹์˜ ImageBitmap์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค._

๋”ฐ๋ผ์„œ FF๊ฐ€ ์˜ต์…˜ ์‚ฌ์ „์„ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ImageBitmapLoader ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€, ๊ฐ™์€ ์†์„ฑ Texture.premultiplyAlpha ๋ฐ Texture.flipY ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ImageBitmap ์ง€๊ธˆ์„. ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •ํ•˜๋ฉด ImageBitmap ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ํ…์Šค์ฒ˜์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์†Œ ๋ถˆํ–‰ํ•œ ์ผ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜. ๊ทธ ์‚ฌ์–‘์„ ๋†“์ณค๋„ค์š”.

์˜ต์…˜ ์‚ฌ์ „์˜ ์ค‘์š”์„ฑ๋„ ์—ฌ๊ธฐ์—์„œ ๋…ผ์˜๋ฉ๋‹ˆ๋‹ค.

https://bugzilla.mozilla.org/show_bug.cgi?id=1335594

bugzilla์˜ ๋ฒ„๊ทธ(https://bugzilla.mozilla.org/show_bug.cgi?id=1367251, https://bugzilla.mozilla.org/show_bug.cgi?id=1335594)๊ฐ€ ... 2๋…„ ๋™์•ˆ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋ช‡ ๋…„? ๋‚˜๋Š” ๊ทธ๋“ค์ด ๊ทธ๊ฒƒ์„ ๊ณ ์น˜๋Š” ๋ฐ ์ด๋ ‡๊ฒŒ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜๋‹ค.

๋”ฐ๋ผ์„œ ๋ฌธ์ œ๋Š” "๊ธฐ์ˆ ์ ์œผ๋กœ" ๊ธฐ๋Šฅ์ด FF์—์„œ ์ง€์›๋˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์“ธ๋ชจ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” Chrome์šฉ ๊ฒฝ๋กœ์™€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €์šฉ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” Firefox์— ๊ธฐ๋Šฅ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— UA ์Šค๋‹ˆํ•‘์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹ค์šฉ์ ์ธ ์†”๋ฃจ์…˜์€ ๊ธฐ๋Šฅ ๊ฐ์ง€๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”Œ๋ฆฝ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ๋Š” cIB๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 2x2 ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“  ๋‹ค์Œ ๋‹ค์‹œ ์ฝ๊ณ  ๊ฐ’์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

FireFox ๋ฒ„๊ทธ์— ๋Œ€ํ•ด์„œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ๋„ ์—ฐ๋ฝํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ๊ณ„ํš์„ ๋“ค์€ ํ›„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•œ์ง€ ๋ด…์‹œ๋‹ค.

bugzilla์˜ ๋ฒ„๊ทธ(https://bugzilla.mozilla.org/show_bug.cgi?id=1367251, https://bugzilla.mozilla.org/show_bug.cgi?id=1335594)๊ฐ€ ... 2๋…„ ๋™์•ˆ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋ช‡ ๋…„? ๋‚˜๋Š” ๊ทธ๋“ค์ด ๊ทธ๊ฒƒ์„ ๊ณ ์น˜๋Š” ๋ฐ ์ด๋ ‡๊ฒŒ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜๋‹ค.

๋„ต ์ •๋ง ํ•œ๋™์•ˆ ๋ชป ๋”ฐ๋ผํ•ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค -_-

๋”ฐ๋ผ์„œ ๋ฌธ์ œ๋Š” "๊ธฐ์ˆ ์ ์œผ๋กœ" ๊ธฐ๋Šฅ์ด FF์—์„œ ์ง€์›๋˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์“ธ๋ชจ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” Chrome์šฉ ๊ฒฝ๋กœ์™€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €์šฉ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” Firefox์— ๊ธฐ๋Šฅ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— UA ์Šค๋‹ˆํ•‘์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹ค์šฉ์ ์ธ ์†”๋ฃจ์…˜์€ ๊ธฐ๋Šฅ ๊ฐ์ง€๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”Œ๋ฆฝ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ๋Š” cIB๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 2x2 ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“  ๋‹ค์Œ ๋‹ค์‹œ ์ฝ๊ณ  ๊ฐ’์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋„ค, ๋‘ ์†”๋ฃจ์…˜ ๋ชจ๋‘ ์ •๋ง ํ˜•ํŽธ์—†๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ํ”ผํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ ํŒŒ๊ณ ๋“ค๊ธฐ ์ „์— ์šฐ๋ฆฌ ์ธก์—์„œ ์ฐจ๋‹จ์„ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ImageBitmap ์—…๋กœ๋“œ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค. 5์ดˆ๋งˆ๋‹ค ํ…์Šค์ฒ˜๋ฅผ ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ์ด๋ฏธ์ง€์™€ ImageBitmap์„ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://rawgit.com/takahirox/three.js/ImageBitmapTest/examples/webgl_texture_upload.html (์ผ๋ฐ˜ ์ด๋ฏธ์ง€)
https://rawgit.com/takahirox/three.js/ImageBitmapTest/examples/webgl_texture_upload.html?imagebitmap(ImageBitmap )

๋‚ด ์ฐฝ์—์„œ ๋‚˜๋Š” ๋ณธ๋‹ค

| ๋ธŒ๋ผ์šฐ์ € | 8192x4096 JPG 4.4MB | 2048x2048 PNG 4.5MB |
| ---- | ---- | ---- |
| ํฌ๋กฌ ์ด๋ฏธ์ง€ | 500ms | 140ms |
| ํฌ๋กฌ ์ด๋ฏธ์ง€๋น„ํŠธ๋งต | 165ms | 35ms |
| ํŒŒ์ด์–ดํญ์Šค ์ด๋ฏธ์ง€ | 500ms | 40ms |
| ํŒŒ์ด์–ดํญ์Šค ์ด๋ฏธ์ง€ ๋น„ํŠธ๋งต | 500ms | 60ms |

( texture.generateMipmaps ์€ true )

๋‚ด ์ƒ๊ฐ

  1. Chrome์—์„œ ImageBitmap์„ ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์ด 3๋ฐฐ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ์•„์ฃผ ์ข‹์€ ๊ฐœ์„ ์ž…๋‹ˆ๋‹ค.
  2. FireFox์— ImageBitmap ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ปดํ“จํ„ฐ์—์„œ๋„ ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‚˜์š”? ๋ชจ๋ฐ”์ผ์—์„œ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ๋„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.
  3. ImageBitmap์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ํ…์Šค์ฒ˜ ์—…๋กœ๋“œ๋Š” ์—ฌ์ „ํžˆ ํฐ ํ…์Šค์ฒ˜์— ๋Œ€ํ•ด ์ฐจ๋‹จ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋น„์ฐจ๋‹จ์„ ์œ„ํ•œ ์ ์ง„์  ๋ถ€๋ถ„ ์—…๋กœ๋“œ ๊ธฐ์ˆ ์ด๋‚˜ ๋ฌด์–ธ๊ฐ€๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ImageBitmap์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ํ…์Šค์ฒ˜ ์—…๋กœ๋“œ๋Š” ์—ฌ์ „ํžˆ ํฐ ํ…์Šค์ฒ˜์— ๋Œ€ํ•ด ์ฐจ๋‹จ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ์—…๋กœ๋“œ ๊ธฐ์ˆ ์ด๋‚˜ ๋น„์ฐจ๋‹จ์„ ์œ„ํ•œ ๋ฌด์–ธ๊ฐ€๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•œ ๊ฐ€์ง€ ํ•ด๊ฒฐ์ฑ…์€ ํ…์Šค์ฒ˜ ์••์ถ• ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๊ณ  JPG ๋˜๋Š” PNG๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ ImageBitmap ). ์ด ๋งฅ๋ฝ์—์„œ ์ผ๋ถ€ ์„ฑ๋Šฅ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋Š” ๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŠนํžˆ ๋ชจ๋ฐ”์ผ๊ณผ ๊ฐ™์€ ์ €์ „๋ ฅ ์žฅ์น˜์—์„œ ํฐ ํ…์Šค์ฒ˜์— ๋Œ€ํ•œ ์ฐจ๋‹จ์„ ์—ฌ์ „ํžˆ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์„ฑ๋Šฅ์„ ๋จผ์ € ํ‰๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

๋˜๋Š” scheduled/requestIdleCallback texSubImage2D๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

rIC = requestIdleCallback?

์˜ˆ, ๋‹Œ์ž ํŽธ์ง‘์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ข‹์•„์š”. ๋„ค ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

BTW, ๋‚˜๋Š” ์•„์ง ์••์ถ• ํ…์Šค์ฒ˜์— ์ต์ˆ™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ดํ•ด๋ฅผ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. compressedTexImage2D ๋Š” ImageBitmap ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ImageBitmap ์—๋Š” ์••์ถ• ํ…์Šค์ฒ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ?

https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/compressedTexImage2D

์ด์ „ TiledTextureLoader ์‹คํ—˜์„ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜๊ธฐ ์œ„ํ•ด ๋Œ์•„๊ฐ”์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋น„๋””์˜ค ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์ถฉ๋Œํ•˜๊ณ  ๋‹ค์‹œ ์‹œ์ž‘๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.(

(ํŽธ์ง‘: ์‹ค์ œ๋กœ ๊ฐ€์žฅ ํฐ ํ…์Šค์ฒ˜(16k x 16k - https://baicoianu.com/~bai/three.js/examples/textures/dotamap1_25.jpg)๋ฅผ ํฌ๋กฌ์— ์ง์ ‘ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์กฐ์ฐจ ์ถฉ๋Œ์„ ์ผ์œผํ‚ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์—ˆ์œผ๋ฏ€๋กœ ํฌ๋กฌ์˜ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ์—์„œ ์•ฝ๊ฐ„์˜ ํšŒ๊ท€์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค)

requestIdleCallback, ImageBitmap ๋ฐ ES6 ์ƒ์„ฑ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GPU์— ์—…๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด ํฐ ํ…์Šค์ฒ˜๋ฅผ ์—ฌ๋Ÿฌ ์ฒญํฌ๋กœ ๋ถ„ํ• ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์‹คํ—˜์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. texSubimage2D๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฑ„์šฐ๋”๋ผ๋„ ์—ฌ์ „ํžˆ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ํ• ๋‹นํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜ ํ…์Šค์ฒ˜ ๋Œ€์‹  ํ”„๋ ˆ์ž„ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ GL ํ˜ธ์ถœ๋กœ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์ €์žฅ์†Œ๋Š” https://github.com/jbaicoianu/THREE.TiledTexture/์—์„œ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ธฐ์–ตํ•˜๋Š” ์‹คํ—˜์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋ฉ”๋ชจ:

  • requestIdleCallback์€ ์ด ๋กœ๋“œ ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ๋Š˜๋ฆฌ๋Š” ๋Œ€์‹  ํ…์Šค์ฒ˜๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋™์•ˆ ๋ฒ„๋ฒ…๊ฑฐ๋ฆผ์„ ์ค„์ด๋Š” ๋ฐ ํ™•์‹คํžˆ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์•ฝ๊ฐ„์˜ ์ถ”๊ฐ€ ์ž‘์—…์„ ํ†ตํ•ด ๋จผ์ € ์ถ•์†Œ๋œ ๋ฒ„์ „์˜ ํ…์Šค์ฒ˜๋ฅผ ์—…๋กœ๋“œํ•œ ๋‹ค์Œ ๋” ์—ฌ์œ ๋กœ์šด ์†๋„๋กœ ์ „์ฒด ํ•ด์ƒ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฑ„์šฐ๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ES6 ์ƒ์„ฑ๊ธฐ๋Š” ์ฝ”๋“œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‚ญ๋น„ํ•˜์ง€ ์•Š๊ณ  ๋” ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ๊ฒฐ๊ณผ๋Š” ๋น„์Šทํ–ˆ์Šต๋‹ˆ๋‹ค. ์—…๋กœ๋“œ ์†๋„์™€ ๋ฒ„๋ฒ…๊ฑฐ๋ฆผ ์‚ฌ์ด์— ๊ท ํ˜•์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. (BTW ์ด https://github.com/spite/THREE.UpdatableTexture๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค).

๋‘ ๋ฒˆ์งธ ์˜ต์…˜์ด WebGL 1์—์„œ ์ž‘๋™ํ•˜๋ ค๋ฉด ์‹ค์ œ๋กœ ๋‘ ๊ฐœ์˜ ํ…์Šค์ฒ˜๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์ ์–ด๋„ UV ์ขŒํ‘œ์— ๋Œ€ํ•œ ์ˆ˜์ •์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. WebGL 2์—์„œ๋Š” ๋Œ€์ƒ ํ…์Šค์ฒ˜์™€ ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅธ ์†Œ์Šค๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, texSubImage2D๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ํฌ๊ธฐ ์กฐ์ •์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ํ”„๋ ˆ์ž„ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ OrthographicCamera๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…์Šค์ฒ˜ ์กฐ๊ฐ์ด ์žˆ๋Š” ํ‰๋ฉด์„ ๋ Œ๋”๋งํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํ‰๋ฉด์˜ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ๋“œ๋กœ์šฐ ์ฝœ.

FireFox์—์„œ ImageBItmap์˜ ์„ฑ๋Šฅ ๋ฌธ์ œ์— ๋Œ€ํ•ด bugzilla์—์„œ ๋ฒ„๊ทธ๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.

https://bugzilla.mozilla.org/show_bug.cgi?id=1486454

ํ…์Šค์ฒ˜์™€ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์‹ค์ œ๋กœ GPU์— ๋กœ๋“œ๋˜๊ณ  ์ด ์Šค๋ ˆ๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•œ ์‹œ์ ์„ ๋” ์ž˜ ์ดํ•ดํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋Š” ๋กœ์ปฌ jpeg/gif ํŒŒ์ผ์„ ํ…์Šค์ฒ˜๋กœ ๋กœ๋“œ ๋ฐ ๋””์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š๊ณ  GPU์— ํ…์Šค์ฒ˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ๋กœ๋“œํ•˜๋ ค๋Š” ์‹œ๋„์—๋งŒ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์€ ํ›„ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ๋ชจ๋‘ ๋‹ค๋ฃจ๊ณ  ์žˆ๋Š”์ง€ ์•„๋‹ˆ๋ฉด ์ „์ž๋งŒ ๋‹ค๋ฃจ๊ณ  ์žˆ๋Š”์ง€ ์™„์ „ํžˆ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•œ๋‹ค๊ณ  ๊ณ ๋ฐฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ›„์ž์—๋งŒ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ํ…์Šค์ฒ˜ ๋ฐ์ดํ„ฐ๋ฅผ GPU์— ๊ฐ•์ œ๋กœ ๋กœ๋“œํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰