Three.js: ์–‘๋ฉด ์žฌ์งˆ์ด์žˆ๋Š” ๋ฉ”์‹œ์˜ ์ผ๋ถ€ ๋ถ€๋ถ„์—์„œ ๋ฒ•์„ ์ด ๋’ค์ง‘ ํ˜”์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2019๋…„ 10์›” 23์ผ  ยท  36์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mrdoob/three.js

๋ฌธ์ œ์— ๋Œ€ํ•œ ์„ค๋ช…

107์—์„œ 108๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ์ด์ œ ๋ชจ๋ธ์˜ ์ผ๋ถ€๊ฐ€ ๋ฒ•์„ ์„ ๋’ค์ง‘์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์–‘๋ฉด ์žฌ๋ฃŒ์—์„œ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค : https://vaulted-jonquil.glitch.me/

์ด๊ฒƒ์€ ๋‘ ๋ฐ”ํ€ด์— ํŒจํ„ด์ด ์›€ํ‘น ๋“ค์–ด๊ฐ„ ์ƒํƒœ๋กœ ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 107์—์„œ ๊ทธ๋žฌ์–ด
Screen Shot 2019-10-23 at 3 51 35 PM

108์—์„œ๋Š” ๋ฐ”ํ€ด ์ค‘ ํ•˜๋‚˜๊ฐ€ ํŠ€์–ด ๋‚˜์˜ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ํŒจํ„ด์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ :
Screen Shot 2019-10-23 at 3 51 27 PM

Three.js ๋ฒ„์ „
  • [x] r108
๋ธŒ๋ผ์šฐ์ €
  • [x] ๋ชจ๋‘
OS
  • [x] ๋ชจ๋‘
  • [] Windows
  • [ ] ๋งฅ OS
  • [] Linux
  • [] Android
  • [] iOS
Bug Regression

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

๊ทธ๊ฒƒ์„ ๊ณ ์นœ๋‹ค!
Screen Shot 2019-11-21 at 10 02 54 AM

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

@pushmatrix ์ด ๋ชจ๋ธ์ด ์ž์ฒด ์ ‘์„ ์„ ์ œ๊ณตํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์ด # 11438๊ณผ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์ž์ฒด ์ ‘์„ ์„ ์ง€์ •ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ git bisect๋Š” ๋ฉ”์‰ฌ๊ฐ€ ์–‘๋ฉด์ด๊ณ  ์Œ์˜ ์ฒ™๋„๊ฐ€ X ์ธ ๊ฒฝ์šฐ ๋ฌธ์ œ๋ฅผ ์‹œ์ž‘ํ•œ PR๋กœ # 17586์„ ๊ฐ€๋ฆฌ ํ‚ต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ r.108์ด ์•„๋‹ˆ๋ผ r.109์—์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—์ด PR์˜ ๋ชจ๋ธ์—์„œ ํ…Œ์ŠคํŠธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ํ…Œ์ŠคํŠธ glb์ž…๋‹ˆ๋‹ค.
wheels.glb.zip

3 ๋…„ ์ „๋ถ€ํ„ฐ : https://github.com/mrdoob/three.js/issues/10331#issue -194807426

๊ธฐ๋ณธ์ ์œผ๋กœ ... gl_FrontFace๊ฐ€ Adreno GPU์˜ ์–‘๋ฉด ์žฌ์งˆ์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด _ ์—ฌ์ „ํžˆ _ ์šฐ๋ฆฌ๊ฐ€ ์ˆ˜์šฉํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ?

//

normalmap_pars_fragment ์—์„œ Adreno ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ œ๊ฑฐํ•˜๋ฉด์ด ๋ชจ๋ธ์ด ๋‚ด ์ปดํ“จํ„ฐ์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

#ifdef DOUBLE_SIDED

    // Workaround for Adreno GPUs gl_FrontFacing bug. See #15850 and #10331

    bool frontFacing = dot( cross( S, T ), N ) > 0.0;

    mapN.xy *= ( float( frontFacing ) * 2.0 - 1.0 );

#else

    mapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );

#endif

ํ , ์ €๋„ ๊ทธ ๋Œ“๊ธ€์„ ์ฝ์—ˆ๋˜ ๊ฒƒ์„ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฒ„๊ทธ๋ฅผ ๋ณด๋ฉด์„œ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. r108์—์„œ ๋ถ„๋ช…ํžˆ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค (์ ์–ด๋„ ์—…๊ทธ๋ ˆ์ด๋“œ๋Š” ์šฐ๋ฆฌ๋ฅผ ์œ„ํ•ด ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค) : https://github.com/GoogleWebComponents/model-viewer/issues/740

์•„๋งˆ๋„ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๊นŒ? FWIW, ์ด์ „ Adreno GPU์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•˜์œผ๋ฏ€๋กœ ์—ฌ์ „ํžˆ ์ƒ๋‹นํžˆ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

ํ™•์ธ์„ ์œ„ํ•ด dev ์—์„œ ์—ฌ์ „ํžˆ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Screen Shot 2019-10-25 at 4 06 51 PM

ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹dev์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ถŒ๋ฆฌ. ๊ทธ๋Ÿฌ๋‚˜ Adreno ๋ฒ„๊ทธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ œ๊ฑฐํ•˜๋ฉด ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Adreno ๋ฒ„๊ทธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ œ๊ฑฐํ•˜๋ฉด ์•„๋‹™๋‹ˆ๋‹ค.

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

@ Mugen87 ์ด ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์— ์ €๋Š” ๊ธฐํ•˜ํ•™์ด ์„œ๋กœ์˜ ๊ฑฐ์šธ์ด๋ผ๊ณ  ๋ฏฟ์ง€๋งŒ ๋™์ผํ•œ ๋…ธ๋ฉ€ ๋งต์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์˜ฌ๋ฐ”๋ฅธ Adreno ํ˜ธํ™˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ๊ธฐ ์œ„ํ•ด ๋งŽ์€ ์‹œ๊ฐ„์„ ํˆฌ์žํ–ˆ์Šต๋‹ˆ๋‹ค.

ํœ  ๋ชจ๋ธ ๋ชจ๋ธ์„ ๊ฒ€์‚ฌํ•˜๋ฉด ๊ฐ ํœ ์—๋Š” ์ž์ฒด UV ์‰˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ •์  ์ˆœ์„œ๋Š” ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์–ผ๊ตด ๋ฐฉํ–ฅ์€ ์ ์–ด๋„ Blender์—์„œ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

Screen Shot 2019-11-18 at 11 21 05 AM

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด r108์˜ ๋ฒ„๊ทธ์ธ์ง€ ๋˜๋Š” r108์ด ์ด์ œ ์ œ๋Œ€๋กœ ์ผ์„ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ยฏ_ (ใƒ„) _ / ยฏ

@pushmatrix ๋Š” Unity ๋˜๋Š” Blender์™€ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฟก๋ฟก

๋ธ”๋ Œ๋” 2.8

Screen Shot 2019-11-20 at 8 27 27 AM

๋‹จ์ผ์„ฑ

Screen Shot 2019-11-20 at 8 40 30 AM

Sketchfab

Screen Shot 2019-11-20 at 8 32 48 AM

ํ—‰ํ—‰

๋น›์ด ์นด๋ฉ”๋ผ์™€ ๊ฐ™์€ ๋ฐฉํ–ฅ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Unity๋Š”๋ณด๊ธฐ ์–ด๋ ต์ง€๋งŒ Unity๋„ ์ž˜๋ชป๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ? ๐Ÿค”

๋ฟก๋ฟก

์˜ˆ, ์กฐ๋ช…์— ์•ฝ๊ฐ„ ์˜์กดํ•˜์—ฌ ํ™˜์ƒ์ด๋˜๊ณ  ์–ด๋–ค ๊ณณ์—์„œ ํŠ€์–ด ๋‚˜์˜จ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํšŒ์ „ํ•˜๋ฉด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๋‹ค๋ฅธ ๋น›์ด ์žˆ์œผ๋ฉฐ, ์˜ฌ๋ฐ”๋ฅธ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.
Screen Shot 2019-11-20 at 2 36 16 PM

@mrdoob ์•ž๋ฉด์€ three.js์—์„œ ์‹œ๊ณ„ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ๊ธฐ ์ˆœ์„œ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ๋ฉด์˜ 3 ๊ฐœ ์ •์  UV๋„ UV ๋งต์—์„œ ์‹œ๊ณ„ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์˜ ๊ฐ๊ธฐ ์ˆœ์„œ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.

์ด ์˜ˆ์—์„œ ๋‚ด _conjecture_๋Š” ์™ผ์ชฝ์˜ ๋ชจ๋ธ์ด ์‹œ๊ณ„ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์˜ UV๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์˜ค๋ฅธ์ชฝ์˜ ๋ชจ๋ธ์€ _clockwise_ UV๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. doubleSide ์ด true ๋•Œ ์˜ค๋ฅธ์ชฝ ๋ชจ๋ธ์ด three.js์—์„œ ์ž˜๋ชป ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.

AFAIK, Adreno ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ œ๊ฑฐํ•˜๋ฉด Adreno๊ฐ€ ์•„๋‹Œ GPU์˜ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

@pushmatrix Unity ์˜ˆ์ œ์—๋Š” ๋‘ ๋ฐฉํ–ฅ์˜ ๋ฐฉํ–ฅ ์กฐ๋ช…์ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ๋ถ„๋ณ„ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋‹จ์ผ ์กฐ๋ช…์ด ๋ฐ”๋žŒ์ง ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@WestLangley ๋ชจ๋ธ ๋ทฐ์–ด ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ํ™˜๊ฒฝ ๋งต์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋™์ผํ•œ ํšŒ์ „์ด ์—†์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ•˜๋‚˜์˜ ๋น›์œผ๋กœ ์‹œ๋„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@WestLangley ๋‹จ์ผ ๋ฐฉํ–ฅ ์กฐ๋ช…์ด ํšŒ์ „ํ•ฉ๋‹ˆ๋‹ค. ์ฐฉ์‹œ ํ˜„์ƒ์„ ๋ณด๋Š” ๊ฒƒ ๊ฐ™์•„

unity

Unity๊ฐ€ ๋น›์ด ๋‹ฟ๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ๊ทธ๋ฃจ๋ธŒ๊ฐ€ ํŠ€์–ด ๋‚˜์˜ค๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์ ์–ด๋„ ๋‘˜ ๋‹ค ์ผ๊ด€๋ฉ๋‹ˆ๋‹ค.

Threejs๋„ ์ผ๊ด€์„ฑ์ด ์žˆ์ง€๋งŒ ๋ถ„๋ช…ํžˆ ํ•ญ์ƒ ํŠ€์–ด ๋‚˜์˜จ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.
wheels

Unity One์— ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ...
๊ฐ™์€ ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. material.normalMapScale.x = -1

๋ฟก ๋นต๋€จ

@mrdoob ์•ž๋ฉด์€ three.js์—์„œ ์‹œ๊ณ„ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ๊ธฐ ์ˆœ์„œ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ๋ฉด์˜ 3 ๊ฐœ ์ •์  UV๋„ UV ๋งต์—์„œ ์‹œ๊ณ„ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์˜ ๊ฐ๊ธฐ ์ˆœ์„œ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.

์ด ์˜ˆ์—์„œ ๋‚ด _conjecture_๋Š” ์™ผ์ชฝ์˜ ๋ชจ๋ธ์ด ์‹œ๊ณ„ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์˜ UV๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์˜ค๋ฅธ์ชฝ์˜ ๋ชจ๋ธ์€ _clockwise_ UV๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. doubleSide ์ด true ๋•Œ ์˜ค๋ฅธ์ชฝ ๋ชจ๋ธ์ด three.js์—์„œ ์ž˜๋ชป ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.

AFAIK, Adreno ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ œ๊ฑฐํ•˜๋ฉด Adreno๊ฐ€ ์•„๋‹Œ GPU์˜ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

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

์˜ค๋Š˜ ๊ฐ๊ฐ์˜ ์…ฐ์ด๋” ์ฝ”๋“œ๋ฅผ ์‚ดํŽด ๋ดค๋Š”๋ฐ "ํ”ฝ์…€ ๋‹น ์ ‘์„  ๊ณต๊ฐ„ ๋…ธ๋ฉ€ ๋งคํ•‘"์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ๊ฒŒ์‹œ๋ฌผ ์— ๋”ฐ๋ฅด๋ฉด Sketchfab์€ ์ž์‚ฐ์˜ ํƒ„์  ํŠธ ์ •์˜ ๋˜๋Š” ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ๊ฐ€
UV ์ขŒํ‘œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ GLSL ์ฝ”๋“œ์—์„œ ๋ณธ ๊ฒƒ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

BufferGeometryUtils.computeTangents() ๋ฅผ ํ†ตํ•ด ๋ชจ๋ธ์— ์ ‘์„ ์„ ์ถ”๊ฐ€ํ•˜๊ณ  Material.vertexTangents ์„ true ๋กœ ์„ค์ •ํ•˜๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

image

BTW :์ด ๊ฒŒ์‹œ๋ฌผ์—์„œ Sketchfab์˜ ์ฝ”๋“œ ์Šค ๋‹ˆํŽซ์„ ๊ณต์œ ํ•ด๋„ ๋˜๋‚˜์š” ^^? ๊ฒฐ๊ตญ ์˜คํ”ˆ ์†Œ์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ๋‹ค์Œ์€ 1 ๊ฐœ์˜ ๋ฐฉํ–ฅ ์กฐ๋ช…์ด ์•ž๋’ค๋กœ ์›€์ง์ด๋Š” Sketchfab์ž…๋‹ˆ๋‹ค.

sketchfab

์˜ˆ, ๋ช…์‹ฌํ•ด์•ผ ํ•  ํ•œ ๊ฐ€์ง€๋Š” Sketchfab์ด ๋ชจ๋ธ์„ ์—…๋กœ๋“œ ํ•  ๋•Œ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’์Šต๋‹ˆ๋‹ค. ๋ณด๊ณ ์žˆ๋Š” ๊ฒƒ์€ glTF๊ฐ€ ์•„๋‹ˆ๋ผ ์ž์ฒด ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ ๋œ glTF ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

@pushmatrix # 17958์ด ๋ชจ๋ธ์— ์ ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์„ _please_ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

three.js๋Š” ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”์—์„œ ํƒ„์  ํŠธ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ๋ฒ„๊ทธ๊ฐ€์žˆ๋Š” Adreno GPU๋ฅผ ์ˆ˜์šฉํ•˜๊ธฐ์œ„ํ•œ ํ•ดํ‚น์ด ์ œ๊ฑฐ๋˜๋ฉด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. # 17958์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

//

Sketchfab์€ ์ ‘์„ ์ด ํ•„์š”ํ•˜์ง€๋งŒ ๋ชจ๋ธ์—์„œ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ CPU์—์„œ ์ ‘์„ ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ( @donmccurdy ์ด๊ฒƒ์ด glTF ์‚ฌ์–‘์— ํ•„์š”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

three.js๋„ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ชจ๋“  ๋‚ด์žฅ ๋„ํ˜•์— ์˜ฌ๋ฐ”๋ฅธ ์ ‘์„ ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. three.js๋Š” ๋˜ํ•œ MIKKTSpace ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜์—ฌ ComputeTangents() ๋ฅผ ๋Œ€์ฒดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. three.js๋Š” ์ธ๋ฑ์‹ฑ ๋œ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ์™€ ๋น„ ์ธ๋ฑ์‹ฑ ๋œ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•˜๋ฏ€๋กœ ์ƒ๋‹นํ•œ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์„ ๊ณ ์นœ๋‹ค!
Screen Shot 2019-11-21 at 10 02 54 AM

์ข‹์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ•ด๊ฒฐ์ฑ…์€ Adreno ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• (# 17958)์„ ๋˜๋Œ๋ฆฌ๊ณ  ๋ชจ๋ธ์— ํƒ„์  ํŠธ๊ฐ€์—†๊ณ  Adreno GPU (# 15850)๋ฅผ ์ง€์›ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ BufferGeometryUtils.computeTangents() ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. .

์ข‹์€๊ฐ€์š”?

๋˜ ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ…์€ ์ œ๊ณต๋˜์ง€ ์•Š์„ ๋•Œ ์—”์ง„์—์„œ ์ž๋™์œผ๋กœ BufferGeometryUtils.computeTangents() ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”์—์„œ ํƒ„์  ํŠธ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค ... ๐Ÿค”

BufferGeometryUtils.computeTangents() ํ˜„์žฌ ์ธ๋ฑ์Šค๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ์ฝ”์–ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ three.js ๊ฐ€ MIKKTSpace์— ๋”ฐ๋ผ ์–ด๋–ค ์ง€์ ์—์„œ ํƒ„์  ํŠธ๋ฅผ ์ƒ์„ฑ ํ•œ ๋‹ค์Œ perturbNormal2Arb() ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@WestLangley ๋Š” ๋‹ค์Œ

์ด๋Š” ๋ชจ๋“  ๋‚ด์žฅ ํ˜•์ƒ์— ์˜ฌ๋ฐ”๋ฅธ ์ ‘์„ ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์Œ์„ ๋ฐ”๊พธ๋Š” ์ค‘ ... ์ ‘์„ ์ด ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋Œ€์‹ , BufferGeometry.computeTangents() ๋ฉ”์„œ๋“œ๋ฅผ ๋ณต์›ํ•˜๊ณ  ๋ถ„์„์ ์œผ๋กœ ์ •ํ™•ํ•œ ์ ‘์„ ์„ ์„ค์ •ํ•  ์ˆ˜์žˆ๋Š” ๋ชจ๋“  ๋‚ด์žฅ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ์— ๋Œ€ํ•ด ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ "์žฌ์ •์˜"ํ•ฉ๋‹ˆ๋‹ค.

//

๋˜ ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ…์€ ์—”์ง„์—์„œ BufferGeometryUtils.computeTangents ()๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š์„ ๋•Œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœํ•˜๊ณ  ์กฐ๊ฐ ์…ฐ์ด๋”์—์„œ ํƒ„์  ํŠธ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ €์—๊ฒŒ ๋งž๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

BufferGeometryUtils.computeTangents ()๋Š” ํ˜„์žฌ ์ธ๋ฑ์Šค๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ์ฝ”์–ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์‰ฝ๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  https://github.com/mrdoob/three.js/issues/17804#issuecomment -557135610์„ ์ง€์›ํ•˜๋„๋ก ์ˆ˜์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

three.js๊ฐ€ ์–ด๋–ค ์ง€์ ์—์„œ MIKKTSpace์— ๋”ฐ๋ผ ํƒ„์  ํŠธ๋ฅผ ์ƒ์„ฑ ํ•œ ๋‹ค์Œ perturbNormal2Arb ()๋ฅผ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

BufferGeometryUtils.computeTangents ๊ฐ€ MikkTSpace ์ ‘๊ทผ ๋ฐฉ์‹์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•ด์•ผํ•œ๋‹ค๋ฉด ์ด๊ฒƒ์ด ์ตœ๊ณ ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ์กด์˜ ๊ธฐ๋ณธ ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” glTF-Pipeline ๋˜๋Š” gltfpack๊ณผ ๊ฐ™์€ ๋„๊ตฌ์— MikkTSpace๋ฅผ ๋„ฃ๊ณ  ์˜คํ”„๋ผ์ธ์—์„œ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฟก๋ฟก

ํ•˜์ง€๋งŒ <model-viewer> ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ Adreno GPU๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜์žˆ๋Š” ์‹ ๋ขฐํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ณด์ด๊ธธ ์›ํ•ฉ๋‹ˆ๋‹ค (https : // github. com / GoogleWebComponents / model-viewer / issues / 740).

์ ‘์„ ์ด ์ œ๊ณต๋˜์ง€ ์•Š์„ ๋•Œ <model-viewer> (๋ฐ x-gpu ์ง€์›์„ ์›ํ•˜๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ)์—์„œ BufferGeometryUtils.computeTangents ํ˜ธ์ถœํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด 3 ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

ํ—‰ํ—‰

ํ•˜ํ•˜,์ด ๋ฐ”ํ€ด๊ฐ€ ์–ด๋””์—์„œ ์™”๋Š”์ง€ ๋ฐฉ๊ธˆ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค ๐Ÿ˜

https://bumbleride.com/products/era?variant=20719969599599

Screen Shot 2019-11-22 at 3 52 19 PM

@mrdoob ๐Ÿ•ต

์ด์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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