Three.js: UV ์˜คํ”„์…‹/๋ฐ˜๋ณต์€ ํ…์Šค์ฒ˜๊ฐ€ ์•„๋‹Œ ๋จธํ‹ฐ๋ฆฌ์–ผ์˜ ์ผ๋ถ€์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

UV ์˜คํ”„์…‹ ๋ฐ ๋ฐ˜๋ณต(๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ๋‹ค๋ฅธ ํ…์Šค์ฒ˜ ์†์„ฑ ์ค‘ ์ผ๋ถ€)์€ ํ…์Šค์ฒ˜์—์„œ ๋จธํ‹ฐ๋ฆฌ์–ผ๋กœ ์ด์ƒํ•˜๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ์œ ๋‹ˆํผ์ด๋ฏ€๋กœ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋จธํ‹ฐ๋ฆฌ์–ผ๋‹น ํ…์Šค์ฒ˜๋ฅผ ๋ณต์ œํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ(๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„)๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. -์žฌ๋ฃŒ ์˜คํ”„์…‹/๋ฐ˜๋ณต ๋˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์…ฐ์ด๋”๋ฅผ ๊ตด๋ฆฝ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ด๋ ‡๊ฒŒ ํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ข‹์€ ๊ฒฝ์šฐ๋Š” ์ ์šฉ๋œ ๊ฐœ์ฒด์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ ํ‘œ๋ฉด ์ „์ฒด์— ํ…์Šค์ฒ˜๋ฅผ ํƒ€์ผ๋งํ•˜๊ฑฐ๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์œ„ํ•œ ์Šคํ”„๋ผ์ดํŠธ ์‹œํŠธ๋กœ ํ…์Šค์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ์‹œ์Šคํ…œ์€ "๊ณต์œ " ํ…์Šค์ฒ˜์—์„œ ๊ณต์œ  UV ์˜คํ”„์…‹/๋ฐ˜๋ณต์ด ํ•„์š”ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ ์žฌ๋ฃŒ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์งˆ์ ์ธ ์ด์ ์ด ์—†๋Š” ์žฅ์• ๋กœ๋งŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ํ…์Šค์ฒ˜์—์„œ ์œ ๋‹ˆํผ์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์€ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ…์Šค์ฒ˜์˜ ์ผ๋ถ€๊ฐ€ ์‹ค์ œ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ํ˜ผ๋ž€์„ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‘˜ ์ด์ƒ์˜ ๋งต์ด ์žฌ์งˆ์— ์ ์šฉ๋  ๋•Œ ์˜คํ”„์…‹/๋ฐ˜๋ณต์„ ๋ณ€๊ฒฝํ•˜๋ฉด(์˜ˆ: ํ™•์‚ฐ+๋…ธ๋ฉ€๋งต์€ ํ™•์‚ฐ ๋งต์˜ ์˜คํ”„์…‹/๋ฐ˜๋ณต๋งŒ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ) ๋…ธ๋ฉ€๋งต ์˜คํ”„์…‹/๋ฐ˜๋ณต ๊ฐ’์€ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์—์„œ ์™„์ „ํžˆ ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. , ์‹ค์ œ๋กœ ๋…ธ๋ฉ€ ๋งต ์˜คํ”„์…‹/๋ฐ˜๋ณต์— ์˜ํ–ฅ์„ ์ฃผ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•˜๋Š” ๊ฒฝ์šฐ. ์˜จํ†ต ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

"refreshUniformsCommon" ๊ธฐ๋Šฅ์—์„œ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€๋งŒ ์•„๋งˆ๋„ ๋” ๋งŽ์€ ๊ฒƒ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์Šคํ”„๋ผ์ดํŠธ ํ”Œ๋Ÿฌ๊ทธ์ธ์—๋„ ๋ช‡ ๊ฐ€์ง€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์•„๋งˆ๋„ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์ค‘๋‹จ์‹œํ‚ฌ ๊ฒƒ์ด์ง€๋งŒ ํ…์Šค์ฒ˜/์žฌ๋ฃŒ API์—์„œ ์ƒ๋‹นํžˆ ํฐ ๋ถˆ์ผ์น˜์ž…๋‹ˆ๋‹ค. ์žฌ๋ฃŒ์— ๋Œ€ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ null์ธ ์žฌ์ •์˜๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค์ •ํ•˜๋ฉด ํ…์Šค์ฒ˜์˜ ๊ฐ’์„ ๋ฌด์‹œํ•˜๋ฏ€๋กœ ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ๋ฌผ๊ฑด์„ ์†์ƒ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Suggestion

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

์ด ์Šค๋ ˆ๋“œ๋Š” TL;DR์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฉ๊ธˆ r68(์ด์ „ ํ”„๋กœ์ ํŠธ, ์˜ˆ)์—์„œ ์ด ์ฝ”๋“œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

        // uv repeat and offset setting priorities
        //  1. color map
        //  2. specular map
        //  3. normal map
        //  4. bump map
        //  5. alpha map

        var uvScaleMap;

        if ( material.map ) {

            uvScaleMap = material.map;

        } else if ( material.specularMap ) {

            uvScaleMap = material.specularMap;

        } else if ( material.normalMap ) {

            uvScaleMap = material.normalMap;

        } else if ( material.bumpMap ) {

            uvScaleMap = material.bumpMap;

        } else if ( material.alphaMap ) {

            uvScaleMap = material.alphaMap;

        }

        if ( uvScaleMap !== undefined ) {

            var offset = uvScaleMap.offset;
            var repeat = uvScaleMap.repeat;

            uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );

        }

๊ทธ๋ž˜์„œ, ์˜ˆ...

์—ฌ๊ธฐ์—์„œ ์ œ์•ˆํ•œ ๊ฒƒ๊ณผ ๊ฐ™์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๊ทผ๋ณธ์ ์ธ ๋ณ€๊ฒฝ์„ ์ œ์•ˆํ•˜๋ ค๋ฉด ํ•ด๋‹น ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•˜๊ณ  ์„ค๋“๋ ฅ ์žˆ๋Š” ์ฃผ์žฅ์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋””ํ“จ์ฆˆ ๋งต๊ณผ ๋…ธ๋ฉ€ ๋งต์—์„œ ๋‹ค๋ฅธ ๋ฐ˜๋ณต์„ ์„ค์ •ํ•˜๋ ค๊ณ  ํ–ˆ๊ณ  ์ž‘๋™ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋จธ๋ฆฌ์นด๋ฝ์„ ๋ฝ‘์•˜์Šต๋‹ˆ๋‹ค. API๋Š” ์ด ์„ค์ •์„ ํ…์Šค์ฒ˜์— ๋ฐฐ์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„ค, ์„ค๋“๋ ฅ ์žˆ๋Š” ๋…ผ์Ÿ์„ ์œ„ํ•ด ์ œ ๋จธ๋ฆฌ์นด๋ฝ์„ ์•„๊ปด๋‘๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ด ํ‹ฐ์ผ“์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์—ด๋ ค ์žˆ๊ณ  3js๋Š” ์—ฌ์ „ํžˆ ํ…์Šค์ฒ˜์— ๋Œ€ํ•ด ์ด ์„ค์ •์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ํ…์Šค์ฒ˜ ์ค‘ ํ•˜๋‚˜์— ๋Œ€ํ•ด์„œ๋งŒ ์กด์ค‘๋ฉ๋‹ˆ๋‹ค = ์ด๊ฒƒ์€ ์‚ฌ์‹ค์ƒ ์ด๋ฏธ ์žฌ๋ฃŒ๋ณ„ ์„ค์ •์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ์†ํ•œ ๊ณณ์œผ๋กœ ์˜ฎ๊ธฐ์ง€ ์•Š์œผ๋ ค๋ฉด ์ ์–ด๋„ ๋ฌธ์„œ์—๋Š” ์˜ํ–ฅ์ด ์—†๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๊นŒ?

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

๊ด€๋ จ ๊ฒŒ์‹œ๋ฌผ: https://github.com/mrdoob/three.js/issues/3549

์žฌ๋ฃŒ๋ณ„๋กœ ํ…์Šค์ฒ˜๋ฅผ ๋ณต์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„).

์–ด๋–ค ์˜๋ฏธ์—์„œ ์ˆ˜๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋‚ญ๋น„๋ฉ๋‹ˆ๊นŒ?

"๊ณต์œ " ํ…์Šค์ฒ˜์—์„œ ๊ณต์œ  UV ์˜คํ”„์…‹/๋ฐ˜๋ณต์ด ํ•„์š”ํ•  ๊ฐ€๋Šฅ์„ฑ์€ ๋‚ฎ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒŒ ๋ฌด์Šจ ๋œป ์ด๋‹ˆ?

ํ˜„์žฌ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์œ ์ง€ํ•˜๋Š” ๊ฒฝ์šฐ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ํ•œ ๊ฐ€์ง€๋Š” ํ…์Šค์ฒ˜๊ฐ€ ๋ณต์ œ๋  ๋•Œ ๊ณต์œ  ์ด๋ฏธ์ง€๋ฅผ GPU์— ํ•œ ๋ฒˆ๋งŒ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๋‘ ๋ฒˆ์งธ ์ง„์ˆ ๊ณผ ๊ด€๋ จํ•˜์—ฌ:

ํ˜„์žฌ ํŒจ๋Ÿฌ๋‹ค์ž„์€ ๋™์ผํ•œ UV ์˜คํ”„์…‹/๋ฐ˜๋ณต์œผ๋กœ ๋™์ผํ•œ ํ…์Šค์ฒ˜๋ฅผ ์ ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ž‘์—…์„ ์šฉ์ดํ•˜๊ฒŒ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ–ˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๋“œ๋ฌธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์†Œ์žฌ๋ณ„๋กœ ์œ ๋‹ˆํผ์„ ์ž…๊ณ  ํ…์Šค์ฒ˜๊ฐ€ ์•„๋‹Œ ์†Œ์žฌ๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

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

mrdoob์€ ์žฌ๋ฃŒ๋ณ„๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•˜๋Š” ์ด์œ ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

์žฌ๋ฃŒ.์ง€๋„
material.map์˜คํ”„์…‹
material.map๋ฐ˜๋ณต
์žฌ๋ฃŒ.env
material.envOffset
material.env๋ฐ˜๋ณต
... ๋“ฑ.

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

@QuaziKb ์—ฌ๊ธฐ์—์„œ ์ œ์•ˆํ•œ ๊ฒƒ๊ณผ ๊ฐ™์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๊ทผ๋ณธ์ ์ธ ๋ณ€๊ฒฝ์„ ์ œ์•ˆํ•˜๋ ค๋ฉด ํ•ด๋‹น ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•˜๊ณ  ์„ค๋“๋ ฅ ์žˆ๋Š” ์ฃผ์žฅ์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์ฐธ์กฐ ํ”„๋ ˆ์ž„์—์„œ ๋…ผ์Ÿํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๊ฒƒ์„ ์ž๋ฅด์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฆ‰, ์˜คํ”„์…‹/๋ฐ˜๋ณต์ด Texture ์—์„œ ์žฌ๋ฃŒ๋กœ ์ด๋™๋˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋งต์ด ๋™์ผํ•œ ์˜คํ”„์…‹/๋ฐ˜๋ณต ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

specularMap
normalMap
bumpMap
alphaMap
aoMap (future)
glossMap (future)
displacementMap (future)

๋‹จ ํ•˜๋‚˜์˜ ์˜ˆ์™ธ๋Š”


์ด๊ฒƒ์ด ํ˜„์žฌ ๊ตฌํ˜„๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๊ฐ ๋งต์—๋Š” ๊ณ ์œ ํ•œ ์˜คํ”„์…‹/๋ฐ˜๋ณต ๊ฐ’์ด ์žˆ์ง€๋งŒ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ MeshPhongMaterial , MeshLambertMaterial , MeshBasicMaterial ๋ฐ SpriteMaterial ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mapOffset // or mapTranslate
mapRepeat // or mapScale

repeat ์—์„œ Texture offset ๋ฐ repeat ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์Šคํ”„๋ผ์ดํŠธ ์‹œํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์Šคํ”„๋ผ์ดํŠธ์—๋Š” ์žฌ์งˆ์ด ์žˆ์œผ๋ฉฐ ํ•ด๋‹น ์žฌ์งˆ์€ ๋‹จ์ผ ํ…์Šค์ฒ˜๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ์งˆ๊ฐ์— ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…์Šค์ฒ˜๋ฅผ ๋” ์ด์ƒ ๋ณต์ œํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. GPU ์ธก์—์„œ ์žฌ๋ฃŒ๋Š” ๋‹จ์ผ ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

IMHO, ์ด๊ฒƒ์€ ๋ณด๋‹ค ์ž์—ฐ์Šค๋Ÿฌ์šด API์ž…๋‹ˆ๋‹ค.

API๊ฐ€ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„๋œ ์ด์œ ๋ฅผ ๊ธฐ์–ตํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿด๋งŒํ•œ ์ด์œ ๊ฐ€ ์žˆ์—ˆ์„ ๊ฑฐ๋ผ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

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

๋‹ค์Œ ๋งต์ด ๋™์ผํ•œ ์˜คํ”„์…‹/๋ฐ˜๋ณต ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์ง€๋„
...
์•ŒํŒŒ๋งต

FWIW, ์ด ๋™์ž‘(ํ˜„์žฌ ๊ตฌํ˜„)์€ ์ง€๊ธˆ ์ด ์ˆœ๊ฐ„์— ์ €์—๊ฒŒ ์ƒ๋‹นํ•œ ์ขŒ์ ˆ์„ ์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์‰ฌ ์žฌ์งˆ์˜ alphaMap ์˜คํ”„์…‹์„ ๋ถ„์‚ฐ ๋งต(๊ณ ์ • โ€‹โ€‹์ƒํƒœ๋กœ ์œ ์ง€๋จ)๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ํŠธ์œ„๋‹ํ•˜์—ฌ ๋ฉ”์‰ฌ ํ‘œ์‹œ๋ฅผ ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ๋งŒ๋“ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์•ฝ๊ฐ„์˜ ์ขŒ์ ˆ ํ›„์— https://github.com/mrdoob/three.js/pull/4987 ๋ฐ ์ด ๋ฒ„๊ทธ๋ฅผ ํ†ตํ•ด ์ด๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

@jcarpenter ๋‹น์‹ ์ด ๋งํ•˜๋Š” "๋ฒ„๊ทธ"๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ฐœ์„ ์„ ์œ„ํ•œ ์ œ์•ˆ ์‚ฌํ•ญ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ˆ˜์ •: "๋ฒ„๊ทธ"๋Š” ์ด ๋ฌธ์ œ๋ฅผ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค. Bugzilla ๋ฌธํ™”์—์„œ ๊ณผ๋„ํ•œ ์‹œ๊ฐ„์œผ๋กœ ์ธํ•œ ํ˜ผ๋ž€. :p ์ด๊ฒƒ์€ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ ์˜๋„๋œ ๋™์ž‘์ด๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

Cinema 4D์™€ ๊ฐ™์€ ๊ธฐ์กด์˜ 3D ์ฝ˜ํ…์ธ  ์ œ์ž‘ ์•ฑ์— ๋Œ€ํ•œ ์ œ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ WRT๋ฅผ ๊ฐœ์„ ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹ค๋ฅธ ํ…์Šค์ฒ˜์™€ ๋…๋ฆฝ์ ์œผ๋กœ ์žฌ์งˆ ๋‚ด์˜ ๊ฐ ํ…์Šค์ฒ˜์— ๋Œ€ํ•ด ์˜คํ”„์…‹/์Šค์ผ€์ผ/๋ฐ˜๋ณต์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒ์œ„ ์žฌ๋ฃŒ์˜ ์˜คํ”„์…‹/์ถ•์ฒ™/๋ฐ˜๋ณต ์ •์˜

๋˜๋Š” ๋‚ด๊ฐ€ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€("๋ฉ”์‰ฌ ๊ณต๊ฐœ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ๋„")์˜ ๊ฒฝ์šฐ ์ „ํ˜€ ๋ž˜ํ•‘ํ•˜์ง€ ์•Š๋Š” wrapS ๋ฐ wrapT์— ๋Œ€ํ•œ ์˜ต์…˜์ด ์žˆ์œผ๋ฉด ํ™˜์ƒ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. UVW ๋งคํ•‘์„ ์œ„ํ•ด ํƒ€์ผ๋ง์„ ์™„์ „ํžˆ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ์˜ต์…˜์ด ์žˆ๋Š” Cinema4D์˜ ์ฒจ๋ถ€๋œ GIF์— ๋”ฐ๋ผ. ๊ธฐ์กด wrapS ๋ฐ wrapT ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ์ƒ๋‹นํžˆ ๊ด‘๋ฒ”์œ„ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉด ์ด์™€ ๊ฐ™์€ ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. three.js์—์„œ ํ•ญ๋ชฉ์˜ ํ‘œ์‹œ๋ฅผ ์• ๋‹ˆ๋ฉ”์ด์…˜ํ™”ํ•˜๋Š” ์˜ต์…˜์€ ์ „์ฒด ๋ฉ”์‹œ์˜ ์œ„์น˜์™€ ๋ถˆํˆฌ๋ช…๋„๋ฅผ ํŠธ์œ„๋‹ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ œํ•œ๋˜์–ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค... ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์ง€ ์•Š๋Š” ํ•œ.

c4d-tile-2

๋™์˜. ๊ณ„ํš์€ ์ด ๋ชจ๋“  ๊ฒƒ์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ (์…ฐ์ด๋”์—์„œ ๋‹จ์ผ ๋งคํŠธ๋ฆญ์Šค3 ์‚ฌ์šฉ) ํ…์Šค์ฒ˜๋‹น ์˜คํ”„์…‹/๋ฐ˜๋ณต(๋˜๋Š” ์ด๋™/์Šค์ผ€์ผ)์„ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋„์›€์„ ์ฃผ๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ๋ผ๋„ ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

@jcarpenter

์Šฌํ”„๊ฒŒ๋„ ์ง€๊ธˆ ๋‹น์žฅ ์ด๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๋ฉ”์‹œ w/ ๋‹ค๋ฅธ ์žฌ์งˆ ๋˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์…ฐ์ด๋” ์žฌ์งˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค three.js ์›Œํฌํ”Œ๋กœ์— ๋ง‰ ๋›ฐ์–ด๋“œ๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ์„ฑ, ์„ฑ๋Šฅ ๋ฐ ํ™•์žฅ์„ฑ ์‚ฌ์ด์—๋Š” ์ผ์ •ํ•œ ๊ท ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ œ์•ˆ์€ ํ…์Šค์ฒ˜์™€ ์žฌ๋ฃŒ๊ฐ€ ํ˜„์žฌ API์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์—ฌ ํ…์Šค์ฒ˜๊ฐ€ ์—„๊ฒฉํ•˜๊ฒŒ ํ”Œ๋Ÿฌ๊ทธ์ธํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์ด๊ณ  ์˜คํ”„์…‹/๋ฐ˜๋ณต/๋žฉ ๋ชจ๋“œ์™€ ๊ฐ™์€ ์…ฐ์ด๋”์—์„œ ์‹ค์ œ๋กœ ๊ท ์ผํ•œ ๊ฐ’์ด ํŠน๋ณ„ํžˆ ๋งํฌ๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์žฌ๋ฃŒ. ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ํ…์Šค์ฒ˜์— ๋Œ€ํ•œ UV ์ œ์–ด์— ์œ ๋‹ˆํผ ๋‚ญ๋น„๋ฅผ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(ํ™•์‚ฐ์—๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ ์žฌ์งˆ์— 4*5 ์ถ”๊ฐ€ ์œ ๋‹ˆํผ์„ ๊ฐ–๋Š” ๊ฒƒ์€ ์—„์ฒญ๋‚œ ๋‚ญ๋น„์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค). ํŠน์ • UV๊ฐ€ ํ•„์š”ํ•˜๊ณ  ํ…์Šค์ฒ˜๊ฐ€ ์ด๋Ÿฌํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋„๋ก ์žฌ๊ตฌ์ถ•๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฐฐํ›„์—์„œ ๋งˆ์ˆ ์ด ์žˆ๊ฑฐ๋‚˜ ํ•„์š”ํ•œ ์กฐ์ • ๊ฐ€๋Šฅํ•œ UV์˜ ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ํƒ์ ์œผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ฉ‹์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜คํ”„์…‹ ๋ฐ ๋ฐฉ๋ฒ•์„ ๋งคํ•‘ํ•˜์ง€๋งŒ ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๊ณ„ํš์€ ์ด ๋ชจ๋“  ๊ฒƒ์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ (์…ฐ์ด๋”์—์„œ ๋‹จ์ผ ํ–‰๋ ฌ3 ์‚ฌ์šฉ) ํ…์Šค์ฒ˜๋‹น ์˜คํ”„์…‹/๋ฐ˜๋ณต(๋˜๋Š” ์ด๋™/์Šค์ผ€์ผ)์„ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@mrdoob

  1. ํ…์Šค์ฒ˜ ๋ณ€ํ™˜์ด ์žฌ์งˆ์— ์žˆ๋„๋ก _per material.map_์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ๋ถˆํ–‰ํžˆ๋„ ๋งŽ์€ ์žฌ๋ฃŒ ๋งต์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ดํŠธ๋งต์„ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋“  ํ…์Šค์ฒ˜ ๋ณ€ํ™˜์ด ๋™์ผํ•˜๋‹ค๊ณ  ๊ณ„์† ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๋‹น์‹ ๋„ ๋กœํ…Œ์ด์…˜์„ ์ง€์›ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ํšŒ์ „ ์ค‘์‹ฌ๋„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํšŒ์ „ ์ค‘์‹ฌ์„ ํ…์Šค์ฒ˜ ์ค‘์‹ฌ์— ๊ณ ์ •ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด ๋ง์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋งค์šฐ ๊ฐ์‚ฌํ•œ ๋ณ€ํ™”์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณ ์œ ํ•œ ๋ฐ˜๋ณต ๊ฐ’์„ ๋ฐฐ์น˜ํ•˜๊ธฐ ์œ„ํ•ด ํ…์Šค์ฒ˜๋ฅผ ๋ณต์ œํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์„ฑ๊ฐ€์‹  ์ผ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋„์„œ๊ด€์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ?

  1. ํ…์Šค์ฒ˜ ๋ณ€ํ™˜์ด ์žฌ์งˆ์— ์žˆ๋„๋ก _per material.map_์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ๋ถˆํ–‰ํžˆ๋„ ๋งŽ์€ ์žฌ๋ฃŒ ๋งต์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ดํŠธ๋งต์„ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋“  ํ…์Šค์ฒ˜ ๋ณ€ํ™˜์ด ๋™์ผํ•˜๋‹ค๊ณ  ๊ณ„์† ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งต๋‹น mat3 ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๊ณ  Texture ์†์„ฑ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  1. ๋‹น์‹ ๋„ ๋กœํ…Œ์ด์…˜์„ ์ง€์›ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ํšŒ์ „ ์ค‘์‹ฌ๋„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํšŒ์ „ ์ค‘์‹ฌ์„ ํ…์Šค์ฒ˜ ์ค‘์‹ฌ์— ๊ณ ์ •ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด ๋ง์ž…๋‹ˆ๋‹ค.

ํšŒ์ „ ๋„ค. ์ค‘์•™์ธ์ง€ ์•„๋‹Œ์ง€... ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ํ•œ ์ด ๋ชจ๋“  ๊ฒƒ์€ ์…ฐ์ด๋”์— ๋Œ€ํ•ด ๋‹จ์ผ mat3 ๋กœ ์ธ์ฝ”๋”ฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋งต๋‹น).

๋‹ค์Œ ์€ Matrix3 ๊ฐ€ ์…ฐ์ด๋”์— ์ „๋‹ฌ๋˜๊ณ  offsetX , offsetY , repeatX , repeatY ์ •์˜๋œ ๋ณ€ํ™˜์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ํ”„๋กœํ† ํƒ€์ž…์ž…๋‹ˆ๋‹ค offsetX repeatY , rotation , rotationCenterX ๋ฐ rotationCenterY .

center ๊ฐ€ ์˜ต์…˜์œผ๋กœ ํ—ˆ์šฉ๋˜์ง€ ์•Š์œผ๋ฉด ( 0.5, 0.5 ) ๊ณ ์ • ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๋ฐ๋ชจ ์—…๋ฐ์ดํŠธ๋จ

rotateuvs

์ด๊ฒƒ์€ ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค! :+1: :+1:

ํ•˜์ง€๋งŒ translation ๋ฐ scale ( offset ๋ฐ repeat ๋Œ€์‹ )๋กœ ๊ฐˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์žฌ๋ฃŒ ์†์„ฑ์€ ์ •ํ™•ํžˆ ๋ฌด์—‡์ด์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋งŽ์€ ์žฌ๋ฃŒ ๋งต์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…์Šค์ฒ˜ ์†์„ฑ์—์„œ ๋ฌด์—‡์„ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

wrapS/T ๊ฐ€ ํ…์Šค์ฒ˜์— ๋‚จ์•„ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

texture.offset ๋ฐ texture.repeat ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ ์†์„ฑ์€ texture.translation , texture.rotation , texture.scale , texture.center ๋ฐ texture.matrix ์ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ์‹œ ํ˜ธ์ถœ๋˜๋Š” texture.updateMatrix() ๋ฉ”์„œ๋“œ๋„ ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๊ฒƒ์€ ํ…์Šค์ฒ˜๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ํ•œ ๋ฒˆ๋งŒ ํ•˜๋„๋ก ํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฒŒ์‹œ๋ฌผ์˜ ์ œ๋ชฉ๊ณผ https://github.com/mrdoob/three.js/issues/5876#issuecomment -69483293์˜ ์ธ์ˆ˜๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์†์„ฑ์„ ๋จธํ‹ฐ๋ฆฌ์–ผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด ํฌ์ธํŠธ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

/ping @bhouston์— ๋Œ€ํ•œ ์˜๊ฒฌ.

๋‚ด ์ƒ๊ฐ์€ ํ…์Šค์ฒ˜ ์˜คํ”„์…‹/๋ฐ˜๋ณต์ด ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์ด UV์— ๊ตฌ์›Œ์ ธ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด UE4/Unity 5๊ฐ€ ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์˜ˆ์™ธ๋Š” Unity 5๊ฐ€ ๋ชจ๋“  ํ…์Šค์ฒ˜์—์„œ ๊ณต์œ ๋˜๋Š” ์žฌ์งˆ๋‹น ํ•˜๋‚˜์˜ ์ „์—ญ ์˜คํ”„์…‹/๋ฐ˜๋ณต์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.)

์—ฌ๊ธฐ์„œ ๋งŽ์€ ์œ ์—ฐ์„ฑ์„ ์˜นํ˜ธํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ์ „๋ฌธ์ ์œผ๋กœ ์ƒ์„ฑ๋œ ๋ชจ๋ธ์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ ์ ˆํ•œ UV๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฝ˜ํ…์ธ  ์ƒ์„ฑ ๋„๊ตฌ์—๋Š” ์ด๋ฅผ ๊ตฝ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” WebGL์ด Fragment Uniforms -- 16 Vec4์— ๋Œ€ํ•ด ํ„ฐ๋ฌด๋‹ˆ์—†์ด ๋‚ฎ์€ ํ•˜ํ•œ์„ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งต๋‹น ๋ฐ˜๋ณต/์˜คํ”„์…‹์ด ์žˆ์–ด์•ผ ํ•˜๊ณ  ๊ณง ๋งŽ์€ ๋งต์„ ์–ป๊ฒŒ ๋œ๋‹ค๋ฉด ๋งค์šฐ ์ ์€ ๊ฐ€์น˜๋กœ Fragment Uniforms๋ฅผ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์ตœ๊ทผ Clara.io์—์„œ ๋ฐ˜๋ณต/์˜คํ”„์…‹์„ ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ ํ…์Šค์ฒ˜๋‹น ๋ฐ๊ธฐ/๊ฒŒ์ธ ์ปจํŠธ๋กค์„ ์ถ”๊ฐ€ํ–ˆ์œผ๋ฉฐ ๋ชจ๋“  Apple iOS ์žฅ์น˜์™€ ๊ฐ™์€ ์ €๊ฐ€ํ˜• ์žฅ์น˜์—์„œ ์กฐ๊ฐ ์œ ๋‹ˆํผ ์˜ค๋ฒ„ํ”Œ๋กœ๋กœ ์ด์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ทจ์†Œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ณต/์˜คํ”„์…‹ ๋ฐ ๋ฐ๊ธฐ/๊ฒŒ์ธ์ด NVIDIA 980์ด ํƒ‘์žฌ๋œ ๋ฐ์Šคํฌํƒ‘์—์„œ ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๊ณ ๊ธ‰ ์ปดํ“จํ„ฐ๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ์‚ฌ๋žŒ์„ ์œ„ํ•ด ์„ค๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ;)

์šฐ๋ฆฌ๋Š” ์กฐ๊ฐ ์œ ๋‹ˆํผ์„ ์กด์ค‘ํ•ด์•ผ ํ•˜๋ฉฐ ํ•„์š”ํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๊ทธ๋Ÿฌํ•œ ๊ฒฝ์šฐ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์™ธ๋Š” Unity 5๊ฐ€ ์žฌ๋ฃŒ๋‹น ํ•˜๋‚˜์˜ ์ „์—ญ ์˜คํ”„์…‹/๋ฐ˜๋ณต์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

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

์ œ์•ˆ์€ ํ…์Šค์ฒ˜์—์„œ ์˜คํ”„์…‹/๋ฐ˜๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  ๋Œ€์‹  ์žฌ๋ฃŒ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๋ชจ๋“  ๋จธํ‹ฐ๋ฆฌ์–ผ ํ…์Šค์ฒ˜๋Š” ๋™์ผํ•œ ์„ค์ •์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค(์ผ๋ถ€ ์‚ฌ์šฉ์ž๋Š” ์ด์— ๋Œ€ํ•ด ๋งŒ์กฑํ•˜์ง€ ์•Š์„์ง€๋ผ๋„). ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ท ์ผํ•œ ์‚ฌ์šฉ๋Ÿ‰์„ ๋‚ฎ๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„, ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋งŽ์€ ํ•ฉ์˜๋ฅผ ์–ป์ง€ ๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Unity 5๊ฐ€ ํ•˜๋Š” ์ผ์„ ํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ์งˆ๊ฐ์ด ์•„๋‹Œ ์†Œ์žฌ์—๋„ ์˜ฌ๋ ค๋ด…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋‚ด ์ง€์›์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋งต๋ณ„์€ ์‹ค์ œ๋กœ ์ด์ƒ์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ๋Œ€๋น„ํ•˜์—ฌ ์žฌ๋ฃŒ๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ํ”Œ๋ž˜๊ทธ/ํ‚ค๋กœ ์ง€์ •ํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์…ฐ์ด๋”์—์„œ UV๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์œ ์ผํ•œ ์ด์œ ๋Š” UV๊ฐ€ ์• ๋‹ˆ๋ฉ”์ด์…˜๋˜๊ธฐ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. UV๋ฅผ ์ •์ ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์…ฐ์ด๋”๋ฅผ ์ˆ˜์ •ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์…ฐ์ด๋”์— ๋Œ€ํ•ด ์ œ์•ˆ๋œ ์œ ์ผํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€

vUv = uv * offsetRepeat.zw + offsetRepeat.xy;

~์™€ ํ•จ๊ป˜

vUv = ( uvTransform * vec3( uv, 1 ) ).xy;

ํ™•์ธ. ์ด๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ... texture.dynamic (๊ธฐ๋ณธ์ ์œผ๋กœ false )๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋‹ค์Œ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

vUV = uv;

์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ texture.dynamic ๋กœ true ์šฐ๋ฆฌ๊ฐ€ ๊ณ„์‚ฐ texture.matrix ์•„์›ƒ texture.translation , texture.rotation , texture.scale ๋ฐ texture.center , ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ programa์— ์ „๋‹ฌํ•˜๊ณ  ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:

vUv = ( uvTransform * vec3( uv, 1 ) ).xy;

๋ฌผ๋ก  texture.dynamic ๋ณ€๊ฒฝ๋˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‘ ์„ธ๊ณ„์˜ ์žฅ์ ์„ ๋ชจ๋‘ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@mrdoob

  1. ๊ท€ํ•˜๊ฐ€ ๋ณด๊ธฐ์— scale ๋Š” ํ…์Šค์ฒ˜์˜ ์†์„ฑ์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด texture.scale ๋Š” ์žฌ์งˆ์˜ ์†์„ฑ์ž…๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์ด ์ด ์Šค๋ ˆ๋“œ์˜ ์ „๋ถ€์ด๊ธฐ ๋•Œ๋ฌธ์— ํ›„์ž์ด๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  2. .matrix ์†์„ฑ์€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด Matrix3 ๋Š” ์žฌ๋ฃŒ ์œ ๋‹ˆํผ offsetRepeat ์„ ๋Œ€์ฒดํ•˜๋Š” ์œ ๋‹ˆํผ์ž…๋‹ˆ๋‹ค. ๋ Œ๋”๋Ÿฌ์˜ ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ ๊ณ„์‚ฐ๋˜์–ด ๋‹ค๋ฅธ ์œ ๋‹ˆํผ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ GPU์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
  1. ๊ท€ํ•˜๊ฐ€ ๋ณด๊ธฐ์— scale ๋Š” ํ…์Šค์ฒ˜์˜ ์†์„ฑ์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด texture.scale ๋Š” ์žฌ์งˆ์˜ ์†์„ฑ์ž…๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์ด ์ด ์Šค๋ ˆ๋“œ์˜ ์ „๋ถ€์ด๊ธฐ ๋•Œ๋ฌธ์— ํ›„์ž์ด๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. mapMatrix , envMapMatrix , ... ๋˜ํ•œ mapTranslation , mapRotation , mapScale ์žฌ๋ฃŒ๋ฅผ ์˜ค์—ผ์‹œ์ผœ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. THREE.Texture ์— translation , rotation , scale ๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ center ๊ฐ€ ์žˆ์œผ๋ฉด ๋” ๊นจ๋—ํ•˜๋‹ค๊ณ  โ€‹โ€‹์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  1. .matrix ์†์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด Matrix3 ๋Š” ์žฌ๋ฃŒ ์œ ๋‹ˆํผ offsetRepeat ์„ ๋Œ€์ฒดํ•˜๋Š” ์œ ๋‹ˆํผ์ž…๋‹ˆ๋‹ค. ๋ Œ๋”๋Ÿฌ์˜ ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ ๊ณ„์‚ฐ๋˜์–ด ๋‹ค๋ฅธ ์œ ๋‹ˆํผ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ GPU์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

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

์ด ์Šค๋ ˆ๋“œ์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. mapMatrix, envMapMatrix, ...๋„ mapTranslation, mapRotation, mapScale์„ ์‚ฌ์šฉํ•˜์—ฌ ์žฌ๋ฃŒ๋ฅผ ์˜ค์—ผ์‹œ์ผœ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. THREE.Texture์— ๋ณ€ํ™˜, ํšŒ์ „, ํฌ๊ธฐ ๋ฐ ์ค‘์•™์ด ์žˆ์œผ๋ฉด ๋” ๊นจ๋—ํ•˜๋‹ค๊ณ  โ€‹โ€‹์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฐ˜๋ณต ์†์„ฑ์„ ๊ฐ€์ง€๋ ค๋ฉด ํ…์Šค์ฒ˜๋ฅผ ๋ณต์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์ž‘์€ ์žฅ๋ฉด์—์„œ๋Š” ๋ณ„ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ์ด๋ฏธ 40๊ฐœ ์ด์ƒ์˜ ํ…์Šค์ฒ˜๊ฐ€ ์žˆ๋Š” ํฐ ์žฅ๋ฉด์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์•…๋ชฝ์ž…๋‹ˆ๋‹ค.

@titansoftime image ๋Š” THREE.Texture ์—์„œ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” translation , rotation , ... ๊ตฌ์„ฑ์ด ๋‹ค๋ฅธ THREE.Texture ํ•˜๋‚˜์˜ ๋‹จ์ผ THREE.Image ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@titansoftime ์ด๋ฏธ์ง€๋Š”

๊ทธ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. texture.clone()์ด ์ด๋ฏธ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

texture.clone() ๋Š” ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ WebGLRenderer ๋Š” ์ด๋ฏธ์ง€๊ฐ€ ๋™์ผํ•œ์ง€ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ํ…์Šค์ฒ˜ ์—…๋กœ๋“œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค...

์ด ์Šค๋ ˆ๋“œ์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. mapMatrix, envMapMatrix, ...๋„ mapTranslation, mapRotation, mapScale์„ ์‚ฌ์šฉํ•˜์—ฌ ์žฌ๋ฃŒ๋ฅผ ์˜ค์—ผ์‹œ์ผœ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. THREE.Texture์— ๋ณ€ํ™˜, ํšŒ์ „, ํฌ๊ธฐ ๋ฐ ์ค‘์•™์ด ์žˆ์œผ๋ฉด ๋” ๊นจ๋—ํ•˜๋‹ค๊ณ  โ€‹โ€‹์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ ํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ๊ฐ ํ…์Šค์ฒ˜์—๋Š” ๊ณ ์œ ํ•œ offset ์†์„ฑ์ด ์žˆ์œผ๋ฉฐ ๊ฐœ๋ณ„ ์˜คํ”„์…‹์€ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ Œ๋”๋Ÿฌ๋Š” ์žฌ์งˆ์˜ ๊ฐ ๋งต์— ๋Œ€ํ•ด ๋™์ผํ•œ ์˜คํ”„์…‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

FWIW, https://github.com/mrdoob/three.js/issues/5876#issuecomment -69483293 ์—์„œ ๋งํ•œ ๋Œ€๋กœ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

API๊ฐ€ @jcarpenter ๊ฐ€ ์›ํ•˜๋Š” ์ž‘์—…์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค( alphaMap ์˜ ์˜คํ”„์…‹์— ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๋ฅผ ์ฃผ๋Š” ๋ฐ˜๋ฉด map ๋Š” ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋จ ). ์บ”๋ฒ„์Šค์—์„œ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋Œ€์‹  GPU์˜ ์ž‘์—…์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ๋žŒ์ด ํ•  ์ˆ˜์žˆ๋Š” ์ผ์˜ ํ†ค์ด ์ƒ์‡„ ... ๋‹ค๋ฅธ ๋งต์˜ ์˜คํ”„์…‹ (offset)๋กœ ์žฌ์ƒํ•˜์—ฌ์ด alphaMap ์Šค์ผ€์ผ๋ง ๋งŒ normalMap , ๋“ฑ

์žฌ๋ฃŒ๋‹น uvTransform ํ•˜๋‚˜๋งŒ ๊ฐ–๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ œํ•œ์ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜ค, ์ž ๊น. ์žฌ๋ฃŒ๋ณ„๋กœ ์„ ํ˜ธํ•˜์‹œ๋Š” ์ด์œ ๋ฅผ ์•Œ ๊ฒƒ ๊ฐ™์•„์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์กฐ๊ฐ ์…ฐ์ด๋”์—์„œ ํ”ฝ์…€๋‹น uv๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋Œ€์‹  ์ •์  ์…ฐ์ด๋”์—์„œ ๋‹จ์ผ vUv๊ฐ€ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅธ์ชฝ?

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

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

์• ๋‹ˆ๋ฉ”์ด์…˜ ํƒ€์ผ์˜ ๋ชจ๋“  ํ”„๋ ˆ์ž„์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๊ณ  ํ•ด๋‹น ํƒ€์ผ์˜ ์˜คํ”„์…‹/๋ฐ˜๋ณต๋„ ์ œ์–ดํ•˜๊ณ  ์‹ถ์–ดํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ํ”„๋ ˆ์ž„์„ ์˜คํ”„์…‹์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๊ณ  ํ•ด๋‹น ํƒ€์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๊ณ ์œ ํ•œ ์žฌ๋ฃŒ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ๋ชจ๋“  ํ”„๋ ˆ์ž„์˜ ๋ณต์‚ฌ๋ณธ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๊ฒƒ์— ๋Œ€ํ•ด ์ˆ˜๋ฐฑ ๊ฐœ์˜ ์ƒˆ๋กœ์šด ๊ฐœ์ฒด์™€ ์ถ”๊ฐ€ ํ• ๋‹น์œผ๋กœ ๋น ๋ฅด๊ฒŒ ๋ˆˆ๋ฉ์ด์ฒ˜๋Ÿผ ์Œ“์ž…๋‹ˆ๋‹ค. ์ •๋‹นํ•œ ์ด์œ  ์—†์ด ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์žฅ๋ฉด ๋’ค์—์„œ ์žฌ๋ฃŒ๋‹น ๋ช‡ ๊ฐœ์˜ ์ˆ˜๋ ˆ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋งต๋‹น ๋ณ€ํ™˜์— ๊ด€ํ•ด์„œ๋Š”, ์ข‹๊ฒ ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๊ท ์ผ ๋น„์šฉ์ด ์ด์œ  ์—†์ด ๋„ˆ๋ฌด ๋†’์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™˜์ด ๊ณ ์œ ํ•˜๊ฑฐ๋‚˜ ๊ณต์œ  ๋˜๋Š” ๋™์ ์ด์–ด์•ผ ํ•˜๋Š” ์‹œ๊ธฐ์™€ ๋ฐฉ๋ฒ•์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๋ณต์žกํ•œ API๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  IMO ๊ทธ ํ†ต์ œ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ ์ข‹์€ ์ผ์ด์ง€๋งŒ ์‹ ์ค‘ํ•˜๊ฒŒ ์ƒ๊ฐํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ค, ์ž ๊น. ์žฌ๋ฃŒ๋ณ„๋กœ ์„ ํ˜ธํ•˜์‹œ๋Š” ์ด์œ ๋ฅผ ์•Œ ๊ฒƒ ๊ฐ™์•„์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์กฐ๊ฐ ์…ฐ์ด๋”์—์„œ ํ”ฝ์…€๋‹น uv๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋Œ€์‹  ์ •์  ์…ฐ์ด๋”์—์„œ ๋‹จ์ผ vUv๊ฐ€ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅธ์ชฝ?

์•„๋‹ˆ์˜ค. uv๋Š” ์–ธ์ œ๋‚˜์ฒ˜๋Ÿผ ์ •์  ์…ฐ์ด๋”์—์„œ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.

์Šคํ”„๋ผ์ดํŠธ ์‹œํŠธ์™€ 20๊ฐœ์˜ ์Šคํ”„๋ผ์ดํŠธ๋ฅผ ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ํ˜„์žฌ http://threejs.org/examples/misc_ubiquity_test2.html ์—์„œ์™€ ๊ฐ™์ด 20๊ฐœ์˜ ๋ณต์ œ๋œ ์žฌ๋ฃŒ์™€ 20๊ฐœ์˜ ๋ณต์ œ๋œ ํ…์Šค์ฒ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค SpriteMaterial.rotation ์žˆ์Šต๋‹ˆ๋‹ค.)

์žฌ๋ฃŒ๋กœ ์˜คํ”„์…‹์„ ์ด๋™ํ•˜๋ ค๋ฉด ๋ณต์ œ๋œ ์žฌ๋ฃŒ 20๊ฐœ์™€ โ€‹โ€‹ํ…์Šค์ฒ˜ 1๊ฐœ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์˜คํ”„์…‹์„ ์Šคํ”„๋ผ์ดํŠธ๋กœ ์ด๋™ํ•˜๋ ค๋ฉด 1๊ฐœ์˜ ์žฌ์งˆ๊ณผ 1๊ฐœ์˜ ํ…์Šค์ฒ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์Šคํ”„๋ผ์ดํŠธ ์‹œํŠธ์™€ 20๊ฐœ์˜ ์Šคํ”„๋ผ์ดํŠธ๋ฅผ ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ํ˜„์žฌ 20๊ฐœ์˜ ๋ณต์ œ๋œ ์žฌ๋ฃŒ์™€ 20๊ฐœ์˜ ๋ณต์ œ๋œ ํ…์Šค์ฒ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์˜ด, ๋‚˜๋Š”์ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

์ด๊ฒƒ์ €๊ฒƒ ์ƒ๊ฐํ•ด๋ณผ๊ฒŒ...

๋‚˜๋Š” ํ…์Šค์ฒ˜์—์„œ UV ๋ณ€ํ™˜์ด ์•„๋‹Œ ๊ฒƒ์„ ์˜นํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. (1) ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ , (2) ์ „ํŒŒํ•  ์ด๋ฒคํŠธ๊ฐ€ ๋” ๋งŽ๊ณ , (2) ๋‚ญ๋น„์ž…๋‹ˆ๋‹ค.

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

๋” ๋งŽ์€ ์ด๋ฒคํŠธ ์ „ํŒŒ: Clara.io์—์„œ ๋งŒ๋‚œ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ํ…์Šค์ฒ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ ์ „ํŒŒ์ž…๋‹ˆ๋‹ค. ๊ฐ ํ…์Šค์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ ์ค‘์ธ ๊ฐ ๋จธํ‹ฐ๋ฆฌ์–ผ์„ ์ถ”์ ํ•œ ๋‹ค์Œ ํ•ด๋‹น ๋จธํ‹ฐ๋ฆฌ์–ผ์— ๋”๋Ÿฝ๊ณ  ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์•Œ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•  ๋ฟ์ž…๋‹ˆ๋‹ค.

๋‚ญ๋น„: ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” 3D ๋ชจ๋ธ ๋˜๋Š” ์•…์˜์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๊ณ  ๋ชจ๋‘ ๋™์ผํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํ…์Šค์ฒ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ํ…์Šค์ฒ˜ ๋ฐ์ดํ„ฐ ์ž์ฒด๊ฐ€ ๋™์ผํ•˜๋”๋ผ๋„ ๋‹ค๋ฅด๊ฒŒ ์• ๋‹ˆ๋ฉ”์ด์…˜๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ํ…์Šค์ฒ˜์˜ ๊ณ ์œ ํ•œ ๋ณต์‚ฌ๋ณธ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋ฉด์—์„œ ๋จธํ‹ฐ๋ฆฌ์–ผ์— UV ํŠธ๋žœ์Šคํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•˜๋ฉด ์กฐ๊ธˆ ๋‚ญ๋น„์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋จธํ‹ฐ๋ฆฌ์–ผ๋‹น UV ๋ณ€ํ™˜์ด ํ•˜๋‚˜๋งŒ ํ—ˆ์šฉ๋œ๋‹ค๋ฉด ๋จธํ‹ฐ๋ฆฌ์–ผ ์ž์ฒด์— ์ ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. UV ์˜คํ”„์…‹, ์žฌ๋ฃŒ ํšŒ์ „์ด ์žˆ๋Š” Unity 5 ๋ชจ๋ธ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์ž๋Š” ์ด๋ฏธ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์— ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค.

์Šคํ”„๋ผ์ดํŠธ๋Š” ๋จธํ‹ฐ๋ฆฌ์–ผ์—์„œ๋„ UV Transform์œผ๋กœ ์ž˜ ์ฒ˜๋ฆฌ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ 3D ๋ชจ๋ธ ์‚ฌ๋ก€์™€ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Having only one uvTransform per material seems very very limiting.

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

๊ทธ๋Ÿฌ๋‚˜ ํด๋ก ์„ ์งˆ์‹์‹œํ‚ค์ง€ ์•Š๊ณ  ์–ด๋–ป๊ฒŒ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ…์Šค์ฒ˜๊ฐ€ ์•„๋‹Œ ๋จธํ‹ฐ๋ฆฌ์–ผ์— ๊ฐ’์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋“  ํ…์Šค์ฒ˜๊ฐ€ ์ผ์น˜ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ ํด๋ก ์„ ์งˆ์‹์‹œํ‚ค์ง€ ์•Š๊ณ  ์–ด๋–ป๊ฒŒ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

THREE.ShaderMaterial ๋˜๋Š” THREE.RawShaderMaterial ๋Š” ์ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ ํ˜„์žฌ ์ผ๋ฐ˜ ์žฌ๋ฃŒ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ด ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋” ํŽ‘ํ‚คํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ๋งต ๋ฐ˜๋ณต ๋ฐ ์˜คํ”„์…‹์„ ๋…๋ฆฝ์ ์œผ๋กœ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ํŽ‘ํ‚คํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์–ด์จŒ๋“  ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ๊ธฐ์šธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•ด +1์ž…๋‹ˆ๋‹ค.

๊ฑฐ๋Œ€ํ•œ ์Šคํ”„๋ผ์ดํŠธ ์‹œํŠธ(์•„ํ‹€๋ผ์Šค๋ผ๊ณ ๋„ ํ•จ)๊ฐ€ ์žˆ๊ณ  ์—ฌ๋Ÿฌ THREE.Sprite ์ธ์Šคํ„ด์Šค์—์„œ ํ…์Šค์ฒ˜๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

์• ๋‹ˆ๋ฉ”์ด์…˜ ์ง€๋„์˜ ์œ ์—ฐ์„ฑ์€ ํ˜„์žฌ ์‹œ์Šคํ…œ์— ์—†์Šต๋‹ˆ๋‹ค. ์„ค์ •์„ ๋จธํ‹ฐ๋ฆฌ์–ผ์— ๋ฌถ์œผ๋ฉด ์œ ์—ฐ์„ฑ์ด ์ค„์–ด๋“ค ๊ฒƒ์ด๋ผ๋Š” ์ฃผ์žฅ์ด ๊ณ„์† ์ œ๊ธฐ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ์—ฐ์„ฑ์€ ํ˜„์žฌ ์‹œ์Šคํ…œ์— ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ฃผ์žฅ์€ ๋ฌด์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์žฌ๋ฃŒ์— ๋Œ€ํ•ด ์ „์—ญ์ ์œผ๋กœ ์˜คํ”„์…‹/๋ฐ˜๋ณต๋งŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ™•์‚ฐ ๋งต(?)์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ์šฉ ์ค‘์ธ ๋Œ€๋ถ€๋ถ„์˜ ๋งต์— ์ค‘๋ณต๋œ "์˜คํ”„์…‹"/"๋ฐ˜๋ณต" ์„ค์ •์ด ์žˆ๋Š” ํ›จ์”ฌ ๋” ๋‚˜์œ ๋ฌธ์ œ๋กœ ์ด์–ด์ง€๋ฉฐ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์œ„ํ•ด ํ…์Šค์ฒ˜๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์—†์„ ๋•Œ๋งˆ๋‹ค ๋ณต์ œ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋ฏ€๋กœ ์œ ์—ฐ์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ์ค„์ธ. ๊ฐ ํ…์Šค์ฒ˜/๋งต์— ๊ณ ์œ ํ•œ ์˜คํ”„์…‹์ด ์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์ง€๋งŒ ์ด๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜/์‚ฌ์–‘์— ๋Œ€ํ•ด ์˜คํ”„์…‹์„ ๋™์ผํ•œ ๊ฒƒ์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์งœ์ฆ๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ํ•œ ์„ธํŠธ์˜ UV ์˜คํ”„์…‹์„ ์›ํ•ฉ๋‹ˆ๋‹ค. /diffuse(๊ณ ์ • ํ™•์‚ฐ ๋งต ์œ„์˜ ์Šคํฌ๋กค๋ง ๋…ธ๋ฉ€ ๋งต์€ ์…ฐ์ด๋” ์žฌ์งˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ‹ˆ์ƒˆ ์šฉ๋„์ž…๋‹ˆ๋‹ค).

๋นŒ๋“œ ์ค‘์ธ ์‹ค์ œ ์…ฐ์ด๋”๋ฅผ ๋ณด๋ฉด ํ…์Šค์ฒ˜ ์˜คํ”„์…‹/๋ฐ˜๋ณต์ด ์žฌ๋ฃŒ์— ๋ฌถ์—ฌ ์žˆ์ง€๋งŒ ์ด์ƒํ•˜๊ฒŒ๋„ ์ œ์–ดํ•  ์ˆ˜ ์—†๋Š” ํ•œ ๋งต์—์„œ ๋ณต์‚ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ค‘๋ณต ์—†์ด ๋น ๋ฅด๊ณ  ์šฐ์•„ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด ์žฌ๋ฃŒ๋ฅผ ์ œ์–ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ @sunag ์˜ NodeMaterial btw์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด๊ฒƒ์„ ์œ„ํ•ด ๋‚ด +1์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค! ์Šคํ”„๋ผ์ดํŠธ ์‹œํŠธ ์ž‘์—…์„ ํ›จ์”ฌ ๋” ๋ฉ‹์ง€๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

:+1: ๋†€๋ผ์šด ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋˜๋Š” ๋ชจ๋“  ์Šคํ”„๋ผ์ดํŠธ๊ฐ€ ์„œ๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ƒ์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒŒ์ž„์—์„œ ๊ฐ ์Šคํ”„๋ผ์ดํŠธ์— ๋Œ€ํ•œ ํ…์Šค์ฒ˜๋ฅผ ๋ณต์ œํ•˜๊ธฐ ์‹œ์ž‘ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ค‘๋ณต ์Šคํ”„๋ผ์ดํŠธ ๋ฐ์ดํ„ฐ๋ฅผ GPU์— ๋กœ๋“œํ•œ๋‹ค๋Š” ์˜๋ฏธ์ธ๊ฐ€์š”?

๋ˆ„๊ตฌ๋“ ์ง€ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ํ…์Šค์ฒ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์…ฐ์ด๋”์—์„œ ์œ ๋‹ˆํผ์„ ์ง์ ‘ ์„ค์ •ํ•˜์—ฌ UV ์˜คํ”„์…‹์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ @sunag ์˜ NodeMaterial btw์ž…๋‹ˆ๋‹ค.

@bhouston , ๋งํฌ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ•ด๋‹น ์ด๋ฆ„์„ ๊ฐ€์ง„ @sunag ์˜ ๊ณ„์ • ์•„๋ž˜์—๋Š” ๊ณต๊ฐœ ์ €์žฅ์†Œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@rhys-vdw dev ๋ธŒ๋žœ์น˜์—๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/mrdoob/three.js/tree/dev/examples/js/nodes

์ƒˆ๋กญ๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ผ์ดํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์™„์ „ํžˆ ๊ทธ๋ž˜ํ”„ ๊ธฐ๋ฐ˜ ์…ฐ์ด๋” ์‹œ์Šคํ…œ์ด๋ฏ€๋กœ ํ…์Šค์ฒ˜ ์•ก์„ธ์Šค๋ฅผ ์ž„์˜๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กญ๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ผ์ดํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์™„์ „ํžˆ ๊ทธ๋ž˜ํ”„ ๊ธฐ๋ฐ˜ ์…ฐ์ด๋” ์‹œ์Šคํ…œ์ด๋ฏ€๋กœ ํ…์Šค์ฒ˜ ์•ก์„ธ์Šค๋ฅผ ์ž„์˜๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

@bhouston Node๋กœ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณด๊ธฐ ์ข‹์Šต๋‹ˆ๋‹ค.

THREE.SpriteMaterial ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด spritesheet ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์˜คํ”„์…‹/์Šค์ผ€์ผ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var offsetX = frameX / mapWidth;
var scaleX = mapWidth / frameWidth;

sprite.material.map.offset.x = offsetX;
sprite.material.map.repeat.x = scaleX;

https://github.com/mrdoob/three.js/blob/master/src/renderers/webgl/plugins/SpritePlugin.js#L53

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

...๊ทธ๋ž˜์„œ ํ…์Šค์ฒ˜ ์•ก์„ธ์Šค๋ฅผ ์ž„์˜๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

tbh ๊ทธ๊ฒŒ ๋ฌด์Šจ ๋œป์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์žฌ๋ฃŒ๋ณ„๋กœ "์˜คํ”„์…‹" ๋ฐ "๋ฐ˜๋ณต"์— ๋Œ€ํ•œ ๊ฐœ๋ณ„ ์„ธํŠธ ์…ฐ์ด๋” ์œ ๋‹ˆํผ์„ ์• ๋‹ˆ๋ฉ”์ด์…˜ํ•ฉ๋‹ˆ๋‹ค.

THREE.SpriteMaterial์— ๋Œ€ํ•ด ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํ”„๋ผ์ดํŠธ ์‹œํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์˜คํ”„์…‹/์Šค์ผ€์ผ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

@QuaziKb ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ ํƒ€๊ฒŸํŒ…ํ•  ์ˆ˜ ์žˆ๋Š” PR์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@WestLangley๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ๋‹ค์Œ์ด ์‚ฌ์‹ค์ด๋ผ๋ฉด ์ด ๋ชจ๋“  ๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์œ ์ง€ํ•˜๋Š” ๊ฒฝ์šฐ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ํ•œ ๊ฐ€์ง€๋Š” ํ…์Šค์ฒ˜๊ฐ€ ๋ณต์ œ๋  ๋•Œ ๊ณต์œ  ์ด๋ฏธ์ง€๋ฅผ GPU์— ํ•œ ๋ฒˆ๋งŒ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ ๋งž์Šต๋‹ˆ๊นŒ?

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

ํ , ์ด NodeMaterial ํ™•์‹คํžˆ ํ•ด๊ฒฐ๋  ๊ฒƒ์ด๋ฏ€๋กœ, ๋™์ผํ•œ ํ…์Šค์ฒ˜๋ฅผ ๋‹ค๋ฅธ ๋จธํ‹ฐ๋ฆฌ์–ผ๊ณผ ๋…๋ฆฝ์ ์ธ uv ์˜คํ”„์…‹๊ณผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ฉฐ, ๋…ธ๋“œ ๊ธฐ๋ฐ˜ ๋จธํ‹ฐ๋ฆฌ์–ผ์ด ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋งž์ถคํ˜• ํ•„ํ„ฐ ๋ฐ ๊ธฐํƒ€ ๊ธฐ๋Šฅ๊ณผ ๊ฐ™์€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

https://github.com/mrdoob/three.js/issues/7522

๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด uuid๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

THREE.Texture.prototype.createInstance = function() {

    var inst = this.clone();

    inst.uuid = this.uuid;
    inst.version = this.version;

    return inst;

}

needsUpdate ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค version ๋„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ:

var uniqueTextureOffset = map.createInstance();
var material = new THREE.SpriteMaterial( { map: uniqueTextureOffset } );

๋™์ผํ•œ uuid ํ•˜๊ณ  version ๋Š” GPU์—์„œ texture ๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/mrdoob/three.js/blob/master/src/renderers/WebGLRenderer.js#L2832
https://github.com/mrdoob/three.js/blob/master/src/renderers/webgl/WebGLProperties.js#L11

๋‚˜๋ฅผ ์œ„ํ•ด ๊ทธ๊ฒƒ์€ ์ž ์ •์ ์ธ ํ•ด๊ฒฐ์ฑ…์ด์ง€๋งŒ. ๋‚˜๋Š” ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•ด NodeMaterial ๋ฅผ ๋ฏฟ์Šต๋‹ˆ๋‹ค.

uv ๋ณ€ํ™˜์„ ์žฌ๋ฃŒ๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‘ ์„ธ๊ณ„์˜ ์ตœ๊ณ ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์žฌ๋ฃŒ์— ์ƒˆ๋กœ์šด uvOffset ๋ฐ uvRepeat ๊ฐ€ ์žˆ๋Š” ์žฌ๋ฃŒ์— ํ”Œ๋ž˜๊ทธ overrideOffsetRepeat ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ”Œ๋ž˜๊ทธ๊ฐ€ false์ด๋ฉด ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋ฉฐ ์ด๊ฒƒ์ด ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ์‚ฌ์‹ค์ด๋ผ๋ฉด ๋จธํ‹ฐ๋ฆฌ์–ผ ์˜คํ”„์…‹/๋ฐ˜๋ณต์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ํ•„์š”์„ฑ์ด ๊ฐ•๋ ฌํ•˜๊ณ  ๋„๋ฆฌ ํผ์ ธ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์ง€์ง€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. @WestLangley? @mrdoob?

(๋‚˜๋Š” ์•ž์œผ๋กœ ๋ชจ๋“  ์ผ์— NodeMaterial์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ •๋ง๋กœ ์ง€์›ํ•˜์ง€๋งŒ, ๊ทธ๊ฒƒ์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ๊ณ ํ†ต์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.)

๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด THREE.Image ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. https://github.com/mrdoob/three.js/issues/5876#issuecomment -81189892

THREE.Image

@mrdoob , ํ• ๋‹น๋œ ๊ฐ Texture ๊ฐ€ Material ์™€ ํ•จ๊ป˜ ๋ณต์ œ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

@mrdoob ์€ ๋‹ค์Œ

๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ด๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด THREE.Image๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

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

Unity๋Š” ์žฌ์งˆ๋‹น ๋ฐ˜๋ณต/์˜คํ”„์…‹์„ ์ง€์›ํ•˜์ง€๋งŒ 3DS Max, Maya, Softimage์™€ ๊ฐ™์€ ๊ณ ๊ธ‰ VFX ๋„๊ตฌ๋Š” ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ์—๋Š” Bitmap ๋…ธ๋“œ์™€ Texture ๋…ธ๋“œ(๋น„ํŠธ๋งต ๋…ธ๋“œ์™€ UV ๋งคํ•‘ ๋ชจ๋‘ ํฌํ•จ)๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. nod), @mrdoob ์˜ ๋””์ž์ธ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

UE4๋„ @mrdoob ์ด ์ œ์•ˆํ•œ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜๋ฉฐ ๋น„ํŠธ๋งต ๋กœ๋”์ธ "ํ…์Šค์ฒ˜" ๋…ธ๋“œ๊ฐ€ ์žˆ๊ณ  ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ UV ๋งคํ•‘์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ผ๋ จ์˜ UV ๋งคํ•‘ ๋…ธ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ ๊ธ‰ ๋„๊ตฌ๋Š” ํ…์Šค์ฒ˜์—์„œ ์ด๋ฏธ์ง€/๋น„ํŠธ๋งต์„ ๋ถ„ํ• ํ•˜๊ณ  ๋‹ค์Œ ํ˜•์‹์œผ๋กœ ๋ณ„๋„์˜ UV ๋งคํ•‘ ๋…ธ๋“œ๋„ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค.

 -> Bitmap
 -> UVMapping

ํ˜„์žฌ ๊ธฐ๋ณธ StandardMaterial์—์„œ ๋งŽ์€ UVMapping ์˜ต์…˜์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ UE4, Maya, Softimage, 3DS Max์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ UVMappings๋Š” ์‚ฌ์šฉํ•  ์ฑ„๋„, ์ ์šฉํ•  ๋ณ€ํ™˜, ์†Œ์Šค๋กœ World Coordinates ์‚ฌ์šฉ ๋˜๋Š” Spherical, Cube, Planar ํˆฌ์˜์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์˜ˆ์ธก์— ํ•„์š”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

UE4์—๋Š” ๋จธํ‹ฐ๋ฆฌ์–ผ ๋‚ด์—์„œ ๋ฐ˜๋ณต/์˜คํ”„์…‹์„ ํ—ˆ์šฉํ•˜๋Š” ์Šคํ”„๋ผ์ดํŠธ ํ…์Šค์ฒ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

https://docs.unrealengine.com/latest/INT/Engine/Paper2D/Sprites/index.html

Maya, Softimage, 3DS Max ๋ฐ UE4๋Š” @mrdoob ์ด ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํ…์Šค์ฒ˜(๋ฐ UV ์ƒ์„ฑ)์—์„œ ๋น„ํŠธ๋งต/์ด๋ฏธ์ง€๋ฅผ ๋ถ„๋ฆฌํ•˜์ง€๋งŒ ๋ชจ๋‘ ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์…ฐ์ด๋” ๊ทธ๋ž˜ํ”„๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์…ฐ์ด๋” ๊ทธ๋ž˜ํ”„๊ฐ€ ์—†๋Š” Unity3D๋Š” ์˜คํ”„์…‹/๋ฐ˜๋ณต์„ ๋จธํ‹ฐ๋ฆฌ์–ผ ์ž์ฒด์— ํ†ตํ•ฉํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์…ฐ์ด๋” ๊ทธ๋ž˜ํ”„ ๋…ธ๋“œ๋กœ ์ œ๋Œ€๋กœ ๋ถ„๋ฆฌํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ณ„๋„๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ…์Šค์ฒ˜๋ณ„๋กœ ์ด๋ฏธ์ง€๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๊นŒ๋‹ค๋กœ์šด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋งŒ Image๋ฅผ ์ง์ ‘ ์กฐ์ž‘ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ฐ”๋กœ ๐Ÿ˜Š

์–ธ๊ธ‰ํ•˜๊ธฐ์—๋Š” ๋‹ค์†Œ ์• ๋งคํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ PTEX๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
http://ptex.us/PtexFile.html
์ผ๋ฐ˜์ ์ธ ํ”„๋กœ์ ์…˜ ๋“ฑ์„ NodeTexture(?)๋กœ ๋ณ€ํ™˜/๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ๋” ๊ฐ•๋ ฅํ•˜๊ณ  ํฌ๊ด„์ ์ธ ๊ธฐ๋ณธ ์ˆ˜์ค€ ํ…์Šค์ฒ˜ ๋งคํ•‘ ์‹œ์Šคํ…œ์ธ ์ƒˆ๋กœ์šด ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ? ...๊ทธ๋ ‡๋‹ค๋ฉด ๋ฏธ๋ฆฌ ์ƒ๊ฐํ•ด ๋ณด์•„์•ผ ํ•  ์‚ฌํ•ญ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
[๊ฐ™์€ ์š”์ ์œผ๋กœ ๋” ๋‚˜์•„๊ฐ€:]
ptex์˜ ๊ฐœ๋…์€ ์‹ค์ œ๋กœ 2d ์ด๋ฏธ์ง€๊ฐ€ ์•„๋‹ˆ๋ผ uv ๊ด€๊ณ„์ด๋ฏ€๋กœ 2d๋ฅผ 3d๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฐœ๋…/๋„์ „ ์—†์ด ๋ณต์žกํ•œ ํ‘œ๋ฉด ์ฃผ์œ„์— ํŽ˜์ธํŠธ/์Šคํƒฌํ”„/ํˆฌ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ˆ˜ํ•™์ ์œผ๋กœ ๋น„๊ตํ•˜๋ฉด ๊ธฐ๊ปํ•ด์•ผ ํ•ดํ‚น์ž…๋‹ˆ๋‹ค( ํ•ญ์ƒ ๊ธฐ์ˆ ์ ์œผ๋กœ ํŒŒ๊ดด์™€ ์‹ธ์šฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค).
๋‚˜๋Š” ๋‹จ์ง€ ptex๊ฐ€ 20๋…„ ์ด์ƒ ์ „์— ๋” ํ•ฉ๋ฆฌ์ ์ด๊ณ  ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋˜์–ด์•ผ ํ–ˆ์œผ๋ฉฐ ํ™•์žฅ ๋˜๋Š” 2๊ธ‰ ์„ฑ๋Šฅ์œผ๋กœ ๊ฐ„์ฃผ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ์ ์„ ์ง€์ ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ๋‚˜์—๊ฒŒ๋Š” ๊ทธ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. 2d ์ด๋ฏธ์ง€๊ฐ€ ptex์˜ ํ•ญ์ƒ ์ž‘๋™ํ•˜๋Š” ํ•˜๋‚˜์˜ ์ง„์ •ํ•œ ๊ธฐ๋ณธ ๋ ˆ๋ฒจ ์‹œ์Šคํ…œ์œผ๋กœ ํˆฌ์˜/์Šคํƒฌํ”„๋˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ ์–ธ์ ์œผ๋กœ ๋งํ•˜๋Š” ์˜ค๋ž˜๋œ ์›๋ž˜ ๋ฐฉ๋ฒ•์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๋” ์ค‘์•™ ๋กค์„ ์ทจํ•˜๋Š” ๊ฒƒ์ด ์ตœ์„ ์ด ์•„๋‹ˆ๋ผ๋ฉด ํ†ตํ•ฉ๋˜์–ด์•ผํ•œ๋‹ค๋Š” ์•„์ด๋””์–ด๋ฅผ ์‹œํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ณ ์ƒํ•œ ์ œ์•ˆ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ptex๊ฐ€ ์‚ฌ์–‘์— ๋งž๊ฒŒ ๋งŒ๋“ค์–ด์ ธ์„œ ๋„ˆ๋ฌด ๊ธฐ๋ปค์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” 10๋…„ ์ด์ƒ ์ „์— ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์Šค์Šค๋กœ ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์–ด๋ฆฐ ์‹œ์ ˆ์—๋Š” ์ƒˆ๋กœ์šด ์‚ฌ์–‘ ๋“ฑ์„ ์ •์˜ํ•  ๊ถŒํ•œ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋Œ์ด์ผœ ๋ณด๋ฉด ๋‚ด๊ฐ€ ์—ฌ์ „ํžˆ ์œ ์ง€ํ•˜๋Š” ๊ด€์ฐฐ์ž์˜ ์—ญํ•  ๋Œ€์‹  ๋ณ€ํ™”๋ฅผ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์•˜์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ์— ์˜ค๋žœ ์ž˜๋ชป์„ ๋˜๋Œ๋ฆฌ๋ ค๋Š” ์‹œ๋„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Flux์˜ ์ž ์žฌ์ ์ธ ํ˜„์žฌ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋” ๊นŠ์€ ์ดํ•ด๋ฅผ ๊ฐ€์ง„ ์‚ฌ๋žŒ์ด THREEjs์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ์ ์šฉ ๊ฐ€๋Šฅํ•œ ์ œ์•ˆ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ƒˆ ์Šค๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์‹œ ํ•œ ๋ฒˆ ๋“ค์„ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@MasterJames ์ข…๋ฅ˜์˜ ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚œ ... ์ƒˆ ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“œ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

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

@QuaziKb ๋„ค. ๋ฐ”๋กœ NodeMaterial ํƒœํดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Texture ๊ฐ€ ๊ฐ .clone() ์— ๋Œ€ํ•ด ๋™์ผํ•œ OpenGL ํ…์Šค์ฒ˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹™๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ œ๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฑด๊ฐ€์š”? ์‹ค์ œ๋กœ ๊ฐ ํด๋ก ์— ๋Œ€ํ•ด ๋‹ค์‹œ ์—…๋กœ๋“œํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๊ฒƒ์€ _๋งค์šฐ_ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

@evrimoztamur , ๋งค๋ฒˆ ํ…์Šค์ฒ˜๋ฅผ ๋ณต์‚ฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. WebGL Inspector ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง„ํ–‰ ์ƒํ™ฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@sunag ์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ํฌํ•จํ•˜์—ฌ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์•„๋ฌด ๊ฒƒ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š๋Š” ์‹คํ—˜๊ณผ ์œ„์˜ ๋…ผ์˜๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์Šคํ”„๋ผ์ดํŠธ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ €๋Š” Babylon.js์˜ Sprite ๋ฐ SpriteManager API๊ฐ€ ์ œ ํŠน์ • ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ์†”๋ฃจ์…˜์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ผ์ดํŠธ ์‹œํŠธ, ์˜คํ”„์…‹ ๋ฐ ๋ฐ˜๋ณต, ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด๊ฒƒ์€ THREE.js๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋†’์€ ์ˆ˜์ค€์˜ ์ถ”์ƒํ™”์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ฐธ์กฐ๋กœ ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@rhys-vdw: ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ MeshBasicMaterial์˜ ๋‚˜์œ ๋ฒ„์ „์œผ๋กœ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค.
https://gist.github.com/karimbeyrouti/790d2e1a8c0137b16bae

๋งต์„ ์„ค์ •ํ•˜๋ฉด ์˜คํ”„์…‹/๋ฐ˜๋ณต ์œ ๋‹ˆํผ์ด ์ž๋™์œผ๋กœ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ๋ณ„๋„๋กœ ์‰ฝ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹น์žฅ์€ ํ…์Šค์ฒ˜๋ฅผ ๋ณต์ œํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. (r73์œผ๋กœ ์ž‘์—…)

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” PR์„ ๋ฐฉ๊ธˆ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค. PR #8278

@WestLangley ๋Š” ๋‹ค์Œ

๋‹ค์Œ ๋งต์ด ๋™์ผํ•œ ์˜คํ”„์…‹/๋ฐ˜๋ณต ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ง€๋„
์ŠคํŽ˜ํ˜๋Ÿฌ ๋งต
๋…ธ๋ฉ€๋งต
๋ฒ”ํ”„๋งต
์•ŒํŒŒ๋งต
aoMap(๋ฏธ๋ž˜)
๊ธ€๋กœ์Šค๋งต(๋ฏธ๋ž˜)
๋ณ€์œ„ ๋งต(๋ฏธ๋ž˜)

ํ•ญ์ƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ €๋Š” ํ˜„์žฌ ๋™์ผํ•œ ์žฌ๋ฃŒ(์•„์ŠคํŒ”ํŠธ)์˜ ๋งต๊ณผ ๋ฒ”ํ”„ ๋งต์— ๋Œ€ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ˜๋ณต ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‘˜ ๋‹ค ๋‹ค์†Œ ์ž‘์€ ํƒ€์ผ๋กœ ํƒ€์ผ๋ง๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ˆจ๊ธฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด ํฐ ํ…์Šค์ฒ˜๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๊ฐ€์งˆ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋งค์šฐ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. :-)

ํŽธ์ง‘: ๊ธ€์Ž„, ๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ํ•œ ์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠธ๋ฆญ์€ ์•„๋งˆ๋„ ๋ฌด์‹œ๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์…ฐ์ด๋”์— ๋…ธ์ด์ฆˆ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋น„์Šทํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. WestLangley์˜ Matrix3 ๋ฐ๋ชจ๋Š” ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด Sprite์—์„œ UV๊ฐ€ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ํ…์Šค์ฒ˜๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ vertex ๋ฐ pixel shader ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://threejs.org/examples/#webgl_sprites_nodes

SpriteNodeMaterial ๋ฐ Mesh ๋ฅผ ๊ณต์œ  PlaneBufferGeometry ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” Sprite ํ•˜์ง€ ์•Š์ง€๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋” ์นœ์ˆ™ํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด SpriteMesh ๋กœ ์ง„ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๋Š” TL;DR์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฉ๊ธˆ r68(์ด์ „ ํ”„๋กœ์ ํŠธ, ์˜ˆ)์—์„œ ์ด ์ฝ”๋“œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

        // uv repeat and offset setting priorities
        //  1. color map
        //  2. specular map
        //  3. normal map
        //  4. bump map
        //  5. alpha map

        var uvScaleMap;

        if ( material.map ) {

            uvScaleMap = material.map;

        } else if ( material.specularMap ) {

            uvScaleMap = material.specularMap;

        } else if ( material.normalMap ) {

            uvScaleMap = material.normalMap;

        } else if ( material.bumpMap ) {

            uvScaleMap = material.bumpMap;

        } else if ( material.alphaMap ) {

            uvScaleMap = material.alphaMap;

        }

        if ( uvScaleMap !== undefined ) {

            var offset = uvScaleMap.offset;
            var repeat = uvScaleMap.repeat;

            uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );

        }

๊ทธ๋ž˜์„œ, ์˜ˆ...

์—ฌ๊ธฐ์—์„œ ์ œ์•ˆํ•œ ๊ฒƒ๊ณผ ๊ฐ™์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๊ทผ๋ณธ์ ์ธ ๋ณ€๊ฒฝ์„ ์ œ์•ˆํ•˜๋ ค๋ฉด ํ•ด๋‹น ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•˜๊ณ  ์„ค๋“๋ ฅ ์žˆ๋Š” ์ฃผ์žฅ์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋””ํ“จ์ฆˆ ๋งต๊ณผ ๋…ธ๋ฉ€ ๋งต์—์„œ ๋‹ค๋ฅธ ๋ฐ˜๋ณต์„ ์„ค์ •ํ•˜๋ ค๊ณ  ํ–ˆ๊ณ  ์ž‘๋™ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋จธ๋ฆฌ์นด๋ฝ์„ ๋ฝ‘์•˜์Šต๋‹ˆ๋‹ค. API๋Š” ์ด ์„ค์ •์„ ํ…์Šค์ฒ˜์— ๋ฐฐ์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„ค, ์„ค๋“๋ ฅ ์žˆ๋Š” ๋…ผ์Ÿ์„ ์œ„ํ•ด ์ œ ๋จธ๋ฆฌ์นด๋ฝ์„ ์•„๊ปด๋‘๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ด ํ‹ฐ์ผ“์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์—ด๋ ค ์žˆ๊ณ  3js๋Š” ์—ฌ์ „ํžˆ ํ…์Šค์ฒ˜์— ๋Œ€ํ•ด ์ด ์„ค์ •์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ํ…์Šค์ฒ˜ ์ค‘ ํ•˜๋‚˜์— ๋Œ€ํ•ด์„œ๋งŒ ์กด์ค‘๋ฉ๋‹ˆ๋‹ค = ์ด๊ฒƒ์€ ์‚ฌ์‹ค์ƒ ์ด๋ฏธ ์žฌ๋ฃŒ๋ณ„ ์„ค์ •์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ์†ํ•œ ๊ณณ์œผ๋กœ ์˜ฎ๊ธฐ์ง€ ์•Š์œผ๋ ค๋ฉด ์ ์–ด๋„ ๋ฌธ์„œ์—๋Š” ์˜ํ–ฅ์ด ์—†๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๊นŒ?

@sunag ํ™๋ณด์šฉ:
https://github.com/mrdoob/three.js/pull/11531

๋‚ด๊ฐ€ ๋งŒ๋‚œ ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ :
https://jsfiddle.net/f0j2v3s8/

SpriteNodeMaterial ํˆฌ๋ช…๋„๊ฐ€ ์†์‹ค๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ๋ฅผ ์ž‘๋™์‹œํ‚ค๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ˜ผํ•ฉ ์กฐํ•ฉ์ด ์—†์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ์•„์ด๋””์–ด?

@karimbeyrouti ๋Š” ๋‹ค์Œ

๋งต์„ ์„ค์ •ํ•˜๋ฉด ์˜คํ”„์…‹/๋ฐ˜๋ณต ์œ ๋‹ˆํผ์ด ์ž๋™์œผ๋กœ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ๋ณ„๋„๋กœ ์‰ฝ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹น์žฅ์€ ํ…์Šค์ฒ˜๋ฅผ ๋ณต์ œํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. (r73์œผ๋กœ ์ž‘์—…)

uniforms.offsetRepeat ๊ฐ€ uniforms.uvTransform (r88)๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

'์—ฌ๋Ÿฌ Object3D ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ๋Š” ํ…์Šค์ฒ˜ ์•„ํ‹€๋ผ์Šค ์žฌ์‚ฌ์šฉ' ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ ๊ด€๋ จํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ๋‘˜๋Ÿฌ๋ณด๊ธฐ๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

  1. ์•„ํ‹€๋ผ์Šค json ๊ฐ์ฒด์— UV ๋ฐ์ดํ„ฐ(์˜คํ”„์…‹, ๋ฐ˜๋ณต)๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  2. Object3D์˜ onBeforeRender\onAfterRender ํ•จ์ˆ˜ ์Œ์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ Œ๋”๋ง ์ „ ์ฝœ๋ฐฑ์—์„œ atlas json ๊ฐ์ฒด์—์„œ UV ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๊ณ  material.map์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ Œ๋”๋ง ํ›„ ์ฝœ๋ฐฑ์—์„œ ๋‹ค์‹œ ์žฌ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค.

๊ฒฐ๊ณผ:

  1. ํ•˜๋‚˜์˜ ํ…์Šค์ฒ˜์™€ ์—ฌ๋Ÿฌ ๊ฐœ์ฒด๊ฐ€ ๊ณต์œ ํ•˜๋Š” ํ•˜๋‚˜์˜ ์žฌ์งˆ, ๋ณต์ œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ info.memory.textures ์นด์šดํ„ฐ๊ฐ€ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ๋‹ค๋ฅธ ๋ชจ๋“  ๋งต(๋…ธ๋ฉ€, o, ๋ณ€์œ„...)์€ ๋™์ผํ•œ UV ๋ณ€ํ™˜์„ ์ค€์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰