https://github.com/mrdoob/three.js/issues/11301 ์์ ๋ ผ์๋ ๋ฐ์ ๊ฐ์ด WebVR์ ์ฃผ์ ๋ฌธ์ ์ค ํ๋๋ VR์ด ์๋ ๊ฒฝํ์์๋ ์ฑ๊ฐ์์ง๋ง ์์ฐ์ ๋ก๋ํ๋ ๋์ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ๋ ๊ฒ์ ๋๋ค.
๋ธ๋ผ์ฐ์ ์์ ๋งํฌ ์ํ ์ ๋ํ ์ต๊ทผ ๊ตฌํ๊ณผ ํจ๊ป ๋น์ฐจ๋จ ๋ก๋ฉ์ ๋ง์กฑ์ค๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํ๊ธฐ ์ํ ํ์ ์์์ ๋๋ค. ํ ํ์ด์ง์์ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ๊ณ ๋์ ํ์ด์ง๊ฐ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ๋ ์์ฐ์ ๋ก๋ํ๊ธฐ ์์ํ๋ฉด ๋ ๋๋ง ๊ธฐ๋ฅ์ด ์ฐจ๋จ๋์ด ํ๋ ์์ด ํค๋์ ์ ์ ์ถ๋์ง ์๊ณ ์ ์ ํ์ ๋ธ๋ผ์ฐ์ ๊ฐ VR์์ ์ฐ๋ฆฌ๋ฅผ ์ถ๋ฐฉํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ํค๋์ ์ ๊บผ๋ด๊ณ VR ์ ๋ ฅ์ ๋ค์ ํด๋ฆญํ๊ณ (์ด๋ ๊ฒ ํ๋ ค๋ฉด ์ฌ์ฉ์ ์ ์ค์ฒ๊ฐ ํ์ํจ) ๊ฒฝํ์ผ๋ก ๋์๊ฐ์ผ ํฉ๋๋ค.
ํ์ฌ OBJ ํ์ผ์ ๋น์ฐจ๋จ ๋ก๋์ ๋ ๊ฐ์ง ๊ตฌํ์ ๋ณผ ์ ์์ต๋๋ค.
๋ ๋ค ์ฅ๋จ์ ์ด ์์ผ๋ฉฐ ์ ๋ ์์งํ ๊ทธ ๊ตฌํ์ ํ๊ฐํ๋ ์น ์์ ์์ ์ ๋ฌธ๊ฐ๋ ์๋์ง๋ง ์ด์์ ์ผ๋ก๋ ๋ก๋๋ฅผ ๋น์ฐจ๋จ ๋ฒ์ ์ผ๋ก ์ด์ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ์ผ๋ฐ ๋ชจ๋๋ก ์ด์ด์ง ๊ฒ์ด๋ผ๋ ํฅ๋ฏธ๋ก์ด ๋ ผ์์ ๋๋ค.
์ด๋ค ์ ์?
/cc @mikearmstrong001 @kaisalmen @delapuente @spite
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 ์ ์ฑ๋ฅ ํ๋กํ์ด
์ด ๊ฒฝ์ฐ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ๋ ์ฃผ์ ์์ ์ ํ ์ค์ฒ๋ฅผ 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:
builder
์๋ ๊ด์ฐฎ์ง๋ง parser
์ ๋์์ ์กฐ์ ํ๊ธฐ ์ํด ์ผ๋ถ ๋งค๊ฐ๋ณ์๋ฅผ ์ค์ ํ ์ ์๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ํ ๊ตฌ์ฑ ๋งค๊ฐ๋ณ์๊ฐ ๊ตฌ๋ฌธ ๋ถ์๊ณผ ๋
๋ฆฝ์ ์ผ๋ก ์์
์์๊ฒ ์ ์ก ๊ฐ๋ฅํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.WWOBJLoader
, btw์ ๋ง์ถคํ Commons ๋ถ๊ธฐ์์ ์๋ ์ค์
๋๋ค).WWOBJLoader2
์ด์ OBJLoader
ํ์ฅํ๊ณ ๊ตฌ๋ฌธ ๋ถ์์ ์ฌ์ ์ํฉ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ๋ ๊ฐ์ ๊ตฌ๋ฌธ ๋ถ์ ์บก์ ๊ฐ์ง๊ณ ์์ง๋ง ํด๋์ค๋ ๋ค๋ฆ
๋๋ค. ์ ์์ ๊ฐ๊น์์ก์ง๋ง ์์ง๊น์ง๋ ์ด๋ฅด์ง ๋ชปํ์ต๋๋ค. ์ผ๋ถ ํ์ ์ฝ๋๋ฅผ ํตํฉํด์ผ ํ๋ฉฐ ๊ฒฐ๊ตญ ๋ ํด๋์ค๋ฅผ ์ตํฉํด์ผ ํฉ๋๋ค.์ง๊ธ์ ๊ทธ๊ฒ๋ฟ์ ๋๋ค. ํผ๋๋ฐฑ ํ์ ๐
@mrdoob ๋ก๋์ ์ฝ๋์์ ์์ ์๋ฅผ ์ฆ์์์ ๊ตฌ์ฑํ๋ ์์ด๋์ด๊ฐ ๋ง์์
๊ธฐ๋ณธ ์ค๋ ๋๋ก ๋ค์ ์ ๋ฌํ ๋ TypedArray๋ฅผ ์ ์ก ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ํ์ํ๋ ๊ฒ์ด ์ฝ๊ธฐ ๋๋ฌธ์ ์์
์ ๊ฐ์ ์ ๋ฌํ๊ธฐ ์ํด ์ถ์๋ ์ ์ก ํ์์ ์ฌ์ฉํ๋ ์ ๊ทผ ๋ฐฉ์์ ์ข์ํฉ๋๋ค. ํ์ฌ ์ ๊ทผ ๋ฐฉ์์์๋ ์์
์์์ .toJSON()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ ์์ง๋ง ์ ์ , UV ๋ฑ์ ๋ํ JS ๋ฐฐ์ด์ ์ดํด๋ณด๊ณ ์ ์ ํ TypedArray ์ ํ์ผ๋ก ๊ต์ฒดํ๊ณ ํธ์ถํ ๋ ์ ์ก ๊ฐ๋ฅ์ผ๋ก ํ์ํฉ๋๋ค. ํฌ์คํธ ๋ฉ์์ง. ์ด๊ฒ์ ์์
์์ ์ฒ๋ฆฌ/๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์กฐ๊ธ ๋ ํฌ์์ํค๋ฉด์ ๊ธฐ๋ณธ ์ค๋ ๋์์ ๊ตฌ๋ฌธ ๋ถ์/๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์กฐ๊ธ ๋ ๊ฐ๋ณ๊ฒ ๋ง๋ญ๋๋ค. ์๋ก์ด ์ ์ก ํ์์ ์ ์ํ๊ฑฐ๋ .toJSON()
๋ฅผ ์์ ํ์ฌ JS ๋ฐฐ์ด ๋์ TypedArray๋ฅผ ์ ํ์ ์ผ๋ก ์ ๊ณตํฉ๋๋ค.
์ด ๋จ์ํ๋ ์ ๊ทผ ๋ฐฉ์์ ๋ ๊ฐ์ง ๋จ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@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
๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ํ
์ค์ฒ์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค. ์ด๋ ๋ค์ ๋ถํํ ์ผ์
๋๋ค.
๊ทธ๋. ๊ทธ ์ฌ์์ ๋์ณค๋ค์.
์ต์ ์ฌ์ ์ ์ค์์ฑ๋ ์ฌ๊ธฐ์์ ๋ ผ์๋ฉ๋๋ค.
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
)
๋ด ์๊ฐ
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/์์ ๊ณ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ด๊ฐ ๊ธฐ์ตํ๋ ์คํ์ ๋ํ ๋ช ๊ฐ์ง ๋ฉ๋ชจ:
๋ด ๊ฒฐ๊ณผ๋ ๋น์ทํ์ต๋๋ค. ์ ๋ก๋ ์๋์ ๋ฒ๋ฒ ๊ฑฐ๋ฆผ ์ฌ์ด์ ๊ท ํ์ด ์์์ต๋๋ค. (BTW ์ด https://github.com/spite/THREE.UpdatableTexture๋ฅผ ๋ง๋ค์์ต๋๋ค).
๋ ๋ฒ์งธ ์ต์ ์ด WebGL 1์์ ์๋ํ๋ ค๋ฉด ์ค์ ๋ก ๋ ๊ฐ์ ํ ์ค์ฒ๊ฐ ํ์ํ๊ฑฐ๋ ์ ์ด๋ UV ์ขํ์ ๋ํ ์์ ์๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. WebGL 2์์๋ ๋์ ํ ์ค์ฒ์ ํฌ๊ธฐ๊ฐ ๋ค๋ฅธ ์์ค๋ฅผ ๋ณต์ฌํ๋ ๊ฒ์ด ๋ ์ฝ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์, texSubImage2D๋ฅผ ์ฌ์ฉํ๋ฉด ๊ทธ๋ฐ ์ข ๋ฅ์ ํฌ๊ธฐ ์กฐ์ ์ด ๊ฐ๋ฅํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ํ๋ ์ ๋ฒํผ๋ฅผ ์ฌ์ฉํ ๋ OrthographicCamera๋ฅผ ์ฌ์ฉํ์ฌ ํ ์ค์ฒ ์กฐ๊ฐ์ด ์๋ ํ๋ฉด์ ๋ ๋๋งํ๊ณ ์์ผ๋ฏ๋ก ํ๋ฉด์ ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๊ทธ ๋๋ก์ฐ ์ฝ.
FireFox์์ ImageBItmap์ ์ฑ๋ฅ ๋ฌธ์ ์ ๋ํด bugzilla์์ ๋ฒ๊ทธ๋ฅผ ์ด์์ต๋๋ค.
ํ ์ค์ฒ์ ๊ด๋ จ๋ ๋ฐ์ดํฐ๊ฐ ์ค์ ๋ก GPU์ ๋ก๋๋๊ณ ์ด ์ค๋ ๋๋ฅผ ๋ฐ๊ฒฌํ ์์ ์ ๋ ์ ์ดํดํ๋ ค๊ณ ๋ ธ๋ ฅํ์ต๋๋ค. ๋ด ํน์ ์ฌ์ฉ ์ฌ๋ก์์๋ ๋ก์ปฌ jpeg/gif ํ์ผ์ ํ ์ค์ฒ๋ก ๋ก๋ ๋ฐ ๋์ฝ๋ฉํ๋ ๊ฒ์ ๋ํด ๊ฑฑ์ ํ์ง ์๊ณ GPU์ ํ ์ค์ฒ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ก๋ํ๋ ค๋ ์๋์๋ง ๊ด์ฌ์ด ์์ต๋๋ค. ์ด ์ค๋ ๋๋ฅผ ์ฝ์ ํ ๋๋ ๊ทธ๊ฒ์ด ๋ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ๋ชจ๋ ๋ค๋ฃจ๊ณ ์๋์ง ์๋๋ฉด ์ ์๋ง ๋ค๋ฃจ๊ณ ์๋์ง ์์ ํ ํ์ ํ์ง ๋ชปํ๋ค๊ณ ๊ณ ๋ฐฑํด์ผ ํฉ๋๋ค. ํ์์๋ง ๊ด์ฌ์ด ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ ๋ค๋ฅธ ์๋ฃจ์ ์ ์ฐพ์์ผ ํฉ๋๊น? ์๋๋ฉด ํ ์ค์ฒ ๋ฐ์ดํฐ๋ฅผ GPU์ ๊ฐ์ ๋ก ๋ก๋ํ๋ ๋ฐ ๋์์ด ๋๋ ๊ฒ์ด ์์ต๋๊น?
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
THREE.UpdatableTexture์ ์ฒซ ๋ฒ์งธ ์ ์ ๋ฆด๋ฆฌ์ค
์ด์์ ์ผ๋ก๋ THREE.Texture์ ์ผ๋ถ์ฌ์ผ ํ์ง๋ง ๋จผ์ ์ด ์ ๊ทผ ๋ฐฉ์์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.