Three.js: ์„ ํƒ์  ์กฐ๋ช…

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

์ด๊ฒƒ์ด ์ด๋ฏธ ๊ณ„ํš๋œ ๊ธฐ๋Šฅ์ธ์ง€ ์•„๋‹ˆ๋ฉด ์™„์„ฑ๋œ ๊ธฐ๋Šฅ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋จผ์ € ์ž‘์—…์„ ์„ค๋ช…ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฐฉ์— ๋Œ€ํ•ด ์„ ํƒ์  ์กฐ๋ช…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‘ ๊ฐœ์˜ ๋ฐฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์กฐ๋ช…์€ ํ•œ ๋ฐฉ์˜ ๋ฌผ์ฒด์™€ ๋‚ด๋ฒฝ์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ๋ฐฉ์€ ์ด ๋น›์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

๊ทธ๋ž˜์„œ ํ•œ ๊ด‘์›์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ฐœ์ฒด์™€ ๋‹ค๋ฅธ ๊ด‘์›์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ฐœ์ฒด๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ์กฐ๋ช…์„ ์œ„ํ•œ ์ผ์ข…์˜ ๊ทธ๋ฃน์ด๋‚˜ ์ฑ„๋„์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์กฐ๋ช…์ด๋‚˜ ์‚ฌ๋ฌผ์—์„œ ๊ทธ๋Ÿฐ ๊ฒƒ์„ ์ฐพ์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์€ ๊ธฐ๋Šฅ์ด ์•„๋‹๊นŒ ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  btw, ์•„์ง ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด three.js์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ถŒ์žฅ๋˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

Enhancement

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

์ด์™€ ๊ฐ™์€ ์˜ˆ์— ๋Œ€ํ•œ ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ, ๋‚˜๋Š” ๋‹น์‹ ์„ ์œ„ํ•ด ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค : https://jsfiddle.net/f2Lommf5/524/

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

๋‚ด๊ฐ€ ๋งํ•˜๊ณ ์žˆ๋Š” ๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค channel ํ•„๋“œ THREE.Light ๋ฐ lightChannel ํ•„๋“œ THREE.Mesh ๊ทธ๋Ÿฐ์ด๋‚˜ ๋ญ. ํ›„์ž๊ฐ€ null์ด๋ฉด ๋ชจ๋“  ๊ด‘์›์˜ ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ํ›„์ž๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง„ ๋ผ์ดํŠธ ์ฑ„๋„์—๋งŒ ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค.

๋˜๋Š” ๋ฉ”์‹œ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฉ”์‹œ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ์˜ ๋ฉด์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ?

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

๋‚ด๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์€ ํŠน์ • ๊ด‘์›์ด ํ•œ ์„ธํŠธ์˜ ๋ฉ”์‰ฌ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์„ธํŠธ์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ† ๋ก  ์Šค๋ ˆ๋“œ ์˜ˆ :

glEnable(GL_LIGHT0);
//...
glEnable(GL_LIGHTn);

// Draw the walls to room 1
DrawWalls(room[0]);

// Draw the contents of room 1
DrawContents(room[0]);

glDisable(GL_LIGHT0);
//...
glDisable(GL_LIGHTn);

// Draw the walls to room 2
DrawWalls(room[1]);

// Draw the contents of room 2
DrawContents(room[1]);

๋”ฐ๋ผ์„œ ๊ทธ๋ฆผ์ž์™€๋Š” ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋„ค... ์ •๋ง ํŽธ๋ฆฌํ•  ๊ฒƒ ๊ฐ™์•„์š”. API๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์ด ์—ฌ๊ธฐ์—์„œ ๊ฐ€์žฅ ํšจ๊ณผ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. channel (๋˜๋Š” group )๋ฅผ THREE.Light
  2. affectedByLightChannel (๋˜๋Š” affectedByLightGroup )๋ฅผ THREE.Mesh (๋˜๋Š” ํ˜•์ƒ์˜ ๋ฉด์—๋„ ์ถ”๊ฐ€)

์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด?

'affectedByLightChannel'์ด ๋„ˆ๋ฌด ๊ธธ๊ณ  'lightChannel'๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ๊ฐ€๋Šฅํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ํŽธ๋ฆฌํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ด‘์›๊ณผ ์ˆ˜์‹ ๊ธฐ์˜ ์ฑ„๋„ ๋ฒˆํ˜ธ๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ:

    light = new THREE.PointLight(0xFFF7D6, 1.0, 15)
    light.channel = 123
    testScene.add(light)

    testScene = new THREE.Scene
    geometry = new THREE.BoxGeometry(2,2,2)
    material = new THREE.MeshLambertMaterial 
        color: 0xffffff

    cube = new THREE.Mesh(geometry, material)
    cube.lightChannel = 123
    testScene.add(cube)

lightChannel ๊ฐ€ 0์ด๋ฉด ๋ชจ๋“  ์ฑ„๋„์˜ ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. channel ๊ฐ€ 0์ด๋ฉด ๋ชจ๋“  ๋ฉ”์‹œ์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ˜„์žฌ ๋™์ž‘๊ณผ ์™„์ „ํžˆ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

์ดํ•ดํ•˜๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ... ์–ด์ฉŒ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ๋” ๋‚˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

cube.lightInfluences = [ light1, light2 ];

๋‚˜์—๊ฒŒ ์ ˆ๋Œ€์ ์œผ๋กœ ๊ดœ์ฐฎ์•„ ๋ณด์ธ๋‹ค.

์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ์กฐ๊ธˆ ๋” ์–ด๋ ค์šธ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋ถ„๋ช…ํžˆ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋ฉ”์‰ฌ์™€ ์กฐ๋ช…์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์ •์ˆ˜ ๋งˆ์Šคํฌ ์†์„ฑ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

light = new THREE.PointLight(0xFFF7D6, 1.0, 15)
light.mask = 0xffffffff; // default mask
testScene.add(light);

cube = new THREE.Mesh(geometry, material)
cube.mask = 0xffffffff; // default
testScene.add(cube);

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋งˆ์Šคํฌ์˜ ๋…ผ๋ฆฌ์  AND๊ฐ€ 0์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ๊ฐœ์ฒด์— ์กฐ๋ช…์ด ์ผœ์ง‘๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋ฐฉ๋ฒ• ์—†์ด ์กฐ๋ช…์ด ๋‘˜ ์ด์ƒ์˜ ์ฑ„๋„์— ์˜ํ–ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์Šคํฌ ๊ธฐ๋ณธ๊ฐ’ 0xffffffff๋Š” ๊ธฐ์กด ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@satori99๊ฐ€ ๋งํ•œ ๊ฒƒ.

๊ทธ๋Ÿฌ๋‚˜ mask ๋Š” ๋Œ€์‹  Light ๋ฐ Mesh*Material ์˜ ์†์„ฑ์ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (๋ผ์ดํŠธ์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ์žฌ๋ฃŒ๋งŒ)

๋˜ํ•œ ์†์„ฑ ์ด๋ฆ„์„ lightMask , lightChannel ๋˜๋Š” channel ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฑ„๋„/๋งˆ์Šคํฌ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋ฌธ์ œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋น„ํŠธ ์—ฐ์‚ฐ์„ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. API์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„๊ณผ ๋น„๊ตํ•˜๋ฉด ์•ฝ๊ฐ„ ๋„ˆ๋ฌด ๊ฐ•๋ ฌํ•ฉ๋‹ˆ๋‹ค.

์–ด๋ ˆ์ด ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ๋Š” ํ•  ์ˆ˜ ์—†๋Š” ๋งˆ์Šคํฌ๋กœ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์œ„์˜ ๋‘ ๊ฐœ์˜ ๋ฐฉ์ด ์žˆ๋Š” ์ž‘์—…์˜ ์˜ˆ๋ฅผ ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋ ˆ์ด ๋ฐฉ์‹๋ณด๋‹ค ์ฑ„๋„ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ์š” ํฌ์ธํŠธ๋Š” ์–ด๋ ˆ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 'light1์„ 1๋ฒˆ ๋ฐฉ์—์„œ 2๋ฒˆ ๋ฐฉ์œผ๋กœ ์ด๋™'๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์ž‘์—…์ด ๋” ๋ณต์žกํ•ด์ง„๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ƒฅ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค

light1.channel = 2

(์ด์ „์—๋Š” 1๋กœ ์„ค์ •๋จ)

์ด์ „์— lightInfluences ๋ฐฐ์—ด์— light1์ด ์žˆ์—ˆ๋˜ ๋ฐฉ 1์˜ ๋ชจ๋“  ๊ฐœ์ฒด๋ฅผ ์ฐพ์€ ๋‹ค์Œ ํ•ด๋‹น ๋ฐฐ์—ด์—์„œ ๋น›์„ ์ œ๊ฑฐํ•œ ๋‹ค์Œ ๋ฐฉ 2์˜ ๋ชจ๋“  ๊ฐœ์ฒด์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

'๊ฐ์ฒด 1์„ 1๋ฒˆ ๋ฐฉ์—์„œ 2๋ฒˆ ๋ฐฉ์œผ๋กœ ์˜ฎ๊ธฐ๊ธฐ'์™€ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์กฐ์ž‘๊ณผ ๊ฐ™์€ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค. InfluenceChannel์„ 1์—์„œ 2๋กœ ์„ค์ •ํ•˜๋Š” ๋Œ€์‹  ํ•ด๋‹น ๋ฐฉ์˜ ๋ชจ๋“  ์กฐ๋ช…์„ ์ฐพ์€ ๋‹ค์Œ ์˜ํ–ฅ ๋ฐฐ์—ด์—์„œ ์ œ๊ฑฐํ•œ ๋‹ค์Œ ๋ฐฉ 2์˜ ๋ชจ๋“  ์กฐ๋ช…์„ ์ฐพ์•„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ lightInfluences ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋‚˜์—๊ฒŒ ์ ˆ๋Œ€์ ์œผ๋กœ ์ข‹๋‹ค๊ณ  ๋งํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฑ„๋„ ํ•ญ๋ชฉ์€ 1๊ฐœ์˜ ํ• ๋‹น๋งŒํผ ๊ฐ„๋‹จํ•œ ๊ณตํ†ต ์ž‘์—…์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋‚˜ ์ž์‹ ์„ ์œ„ํ•ด ๊ทธ ์œ„์— ๊ตฌํ˜„ํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋งˆ์Šคํฌ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (CPU์—์„œ ๊ตฌํ˜„๋˜๋Š”์ง€ GPU์—์„œ ๊ตฌํ˜„๋˜๋Š”์ง€๋Š” ๋‚˜์ค‘์— ๋…ผ์˜ํ•  ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.)

์šฐ๋ฆฌ๋Š” ์„ค์ • ๋ฐฉ๋ฒ•์„ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉ์ž๋Š” ํŒจํ„ด์„ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ ๋„ˆ๋ฌด ๋ณต์žกํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด THREE.Channels API๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

light.channels = new THREE.Channels();
...
light.channels.clear();
light.channels.add( channel );
light.channels.remove( channel );
light.channels.all();

Mesh*Material ๋Œ€ํ•œ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ API๋ฅผ ์ข‹์•„ํ•œ๋‹ค :)
๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ฌผ์ฒด์™€ ์กฐ๋ช…์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋จธํ‹ฐ๋ฆฌ์–ผ์— ๋Œ€ํ•ด์„œ๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

์žฌ๋ฃŒ๋งŒ ์กฐ๋ช…์— ๋ฐ˜์‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์žฌ๋ฃŒ์˜ ์†์„ฑ์ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@westlangley์˜ ์˜๊ฒฌ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์กฐ๋ช…์€ ์žฌ๋ฃŒ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

'๊ฐ์ฒด 1์„ 1๋ฒˆ ๋ฐฉ์—์„œ 2๋ฒˆ ๋ฐฉ์œผ๋กœ ์˜ฎ๊ธฐ๊ธฐ'์™€ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์กฐ์ž‘๊ณผ ๊ฐ™์€ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒŒ ๋ฌธ์ œ์•ผ. Channels ๋Š” ๊ฐœ์ฒด ๊ธฐ๋ฐ˜์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๊ฒŒ ๋ฌธ์ œ์•ผ. ์ฑ„๋„์€ ๊ฐ์ฒด ๊ธฐ๋ฐ˜์ด ์•„๋‹™๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์™œ? ๊ธฐ์ˆ ์  ํ•œ๊ณ„์ธ๊ฐ€?

์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์€ ๊ทธ ๋ชจ๋“  ๊ฒƒ์˜ ์ „์ฒด ์•„์ด๋””์–ด๋ฅผ ๋ฌดํšจํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฐ™์€ ์žฌ๋ฃŒ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๊ฐœ์ฒด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” ์ผœ์ ธ ์žˆ์–ด์•ผ ํ•˜๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ผœ์ ธ ์žˆ์œผ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์™œ? ๊ธฐ์ˆ ์  ํ•œ๊ณ„์ธ๊ฐ€?

์•„๋‹ˆ์˜ค. ๋ฌผ์ฒด๊ฐ€ ๋น›์— ๋ฐ˜์‘ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์žฌ๋ฃŒ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ฐ™์€ ์žฌ๋ฃŒ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๊ฐœ์ฒด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” ์ผœ์ ธ ์žˆ์–ด์•ผ ํ•˜๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ผœ์ ธ ์žˆ์œผ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์žฅ๋ฉด์˜ ๋ชจ๋“  ๊ฐœ์ฒด์— ๋Œ€ํ•ด ๋™์ผํ•œ ์žฌ์งˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์žฌ์งˆ์— ๋‹ค๋ฅธ ๊ท ์ผ ๊ฐ’์ด ํ•„์š”ํ•œ ๊ฐœ์ฒด์˜ ์žฌ์งˆ์€ clone ๋ฟ์ž…๋‹ˆ๋‹ค. ๋ชจ๋‘๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ๋งŒ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์Šคํฌ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (CPU์—์„œ ๊ตฌํ˜„๋˜๋Š”์ง€ GPU์—์„œ ๊ตฌํ˜„๋˜๋Š”์ง€๋Š” ๋‚˜์ค‘์— ๋…ผ์˜ํ•  ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.)

GPU์—์„œ ์ง์ ‘ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

GPU์—์„œ ์ง์ ‘ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ, ์กฐ๋ช…๊ณผ ์žฌ๋ฃŒ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ channels ์œ ๋‹ˆํผ์„ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

๊ทธ๋ฆผ์ž๋„ ๊ด€๋ จ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค. ์„ ํƒ์  ์„€๋„์šฐ ์บ์ŠคํŒ… ๊ฐ™์€ ๊ฒƒ๋„ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”. 'receiveShadow = true' ๋Œ€์‹  'receiveShadowFrom = ...'(๋ฐ ์†Œ์Šค ๋ชฉ๋ก)๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํŠน์ • ๋ฐฉ์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์กฐ๋ช…์„ ์„ค์ •ํ•  ๋•Œ(์ œ ์˜ˆ์—์„œ๋Š”) ํ•ด๋‹น ์กฐ๋ช…์ด ์ด ๋ฐฉ ๊ฐœ์ฒด์—๋งŒ ๊ทธ๋ฆผ์ž๋ฅผ ๋“œ๋ฆฌ์šฐ๋„๋ก ์ฆ‰์‹œ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆผ์ž ์†์„ฑ์€ ์ด ์Šค๋ ˆ๋“œ์—์„œ ์œ„์™€ ๊ฐ™์€ ์ด์œ ๋กœ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์‹ค์ œ๋กœ ์žฌ๋ฃŒ์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆผ์ž ์†์„ฑ์€ ์ด ์Šค๋ ˆ๋“œ์—์„œ ์œ„์™€ ๊ฐ™์€ ์ด์œ ๋กœ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์‹ค์ œ๋กœ ์žฌ๋ฃŒ์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋„ค, ์ดํ•ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค!

์ด ๊ธฐ๋Šฅ์„ ํฌํ•จํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ(์˜ˆ: ์ฒซ ๋ฒˆ์งธ ์ดˆ์•ˆ์— ๋Œ€ํ•œ ๊ณ„ํš๋œ ๋Œ€์ƒ ๋ฆด๋ฆฌ์Šค)?

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ ๋ฐฉ(๋ฐ ํ•ด๋‹น ์กฐ๋ช…)์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์žฅ๋ฉด์„ ์„ค์ •ํ•˜์—ฌ ๋Œ€๋ถ€๋ถ„์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

renderer.autoClear = false;
...
renderer.render( scene1, camera );
renderer.render( scene2, camera );

ํ , ์ด ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

์„ ํƒ์  ์กฐ๋ช…/๊ทธ๋ฆผ์ž๋Š” ํ–ฅํ›„ ๋ฒ„์ „ IMO์— ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•ด BIG +9999, ์žฌ์งˆ์ด ๊ด‘์› A์—์„œ ๊ทธ๋ฆผ์ž๋ฅผ ๋“œ๋ฆฌ์šธ์ง€ ์•„๋‹ˆ๋ฉด ๊ด‘์› B์—์„œ ๊ทธ๋ฆผ์ž๋ฅผ ๋“œ๋ฆฌ์šธ์ง€ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋‘ ์žฅ๋ฉด์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜์—๊ฒŒ ๊ฝค ๊ณ ํ†ต์Šค๋Ÿฌ์šด ์ผ์ด ๋ ๊ฑฐ์•ผ...

์ด๋Ÿฐ ์  ์žฅ ์–ด๋–ป๊ฒŒ ์•„์ง๋„ ๊ตฌํ˜„๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? rohan์—์„œ +9999 ์ดํ›„)

ํ•˜ํ•˜ ์ œ ์ถ”์ธก์œผ๋กœ๋Š” @tsone ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ™์Šต๋‹ˆ๋‹ค . ํ•ด๋‹น ์ปค๋ฐ‹์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ง€๊ธˆ ์ „ํ™” ํด๋ผ์ด์–ธํŠธ์—์„œ ํƒ์ƒ‰ ์ค‘

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

๋‹ค์Œ์€ Dev ๋ถ„๊ธฐ์˜ Layers ๊ตฌํ˜„์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฐ„๋‹จํ•œ JSFiddle์ž…๋‹ˆ๋‹ค.
https://jsfiddle.net/Angrypickle/t8f7q3vo/4/
๋ถˆํ–‰ํžˆ๋„ ํ˜„์žฌ๋กœ์„œ๋Š” ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ๋‚ด๊ฐ€ ๋ญ”๊ฐ€ ์ž˜๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ. ๋ ˆ์ด์–ด๋Š” ์•„์ง ์กฐ๋ช…๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์นด๋ฉ”๋ผ/๊ฐ์ฒด์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ˜Š

๋กœ์ € ๊ทธ ์„ ์ƒ๋‹˜! ๋‹ค์Œ์€ ์ค‘์ฒฉ ์นด๋ฉ”๋ผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ ˆ์ด์–ด๋กœ ์„ ํƒ์  ์กฐ๋ช…์„ ๊ตฌํ˜„ํ•˜๋Š” ์—…๋ฐ์ดํŠธ๋œ JSFiddle์ž…๋‹ˆ๋‹ค.
https://jsfiddle.net/Angrypickle/t4a1eusL/
๋ฐ์Šคํฌํ†ฑ๊ณผ ๋ชจ๋ฐ”์ผ์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์—์„œ ์‹ฌ๊ฐํ•˜๊ฒŒ ๋‚˜์œ ์ ์„ ๋ณธ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ตœ์†Œํ•œ ์กฐ๋ช…์ด ๋ ˆ์ด์–ด ๊ธฐ๋Šฅ์— ์—ฐ๊ฒฐ๋  ๋•Œ๊นŒ์ง€?

๋ˆ„๊ตฌ๋“ ์ง€ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์—์„œ ์‹ฌ๊ฐํ•˜๊ฒŒ ๋‚˜์œ ์ ์„ ๋ณธ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌผ๋ก  ๋‚˜์˜๋‹ค. ํ•œ ๋Œ€์˜ ์นด๋ฉ”๋ผ๋กœ ํ˜„์žฅ์„ ํƒ์ƒ‰ํ•˜๋Š” ๋Œ€์‹  ์‚ฌ๋žŒ๋“ค์€ ์ด์ œ ์ผ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. camera1.add( camera2 ); ์ œ๊ฐ€ ๋ณผ ๋•Œ ์ด๊ฒƒ์€ WTF๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฌด์—‡์ฒ˜๋Ÿผ? ๋‚ด ์นด๋ฉ”๋ผ์— ์นด๋ฉ”๋ผ? ๊ฐœ๋ณ„์ ์œผ๋กœ ์กฐ๋ช…์„ ์ผœ์•ผ ํ•˜๋Š” ์ˆ˜์‹ญ ๊ฐœ์˜ ๋ฐฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์นด๋ฉ”๋ผ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๋ ˆ์ด์–ด... ์–ด์ œ๋Š” ๋ ˆ์ด์–ด๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋งž์ฃ . ์ด์ œ ๋ ˆ์ด์–ด์— ๋Œ€ํ•ด lฬฒeฬฒaฬฒrฬฒnฬฒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

@makc ๋ ˆ์ด์–ด๋Š” ์‹ค์ œ๋กœ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค!
@Zob1 ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ ํ™•์‹คํžˆ ์˜ฌ๋ฐ”๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ ˆ์ด์–ด๊ฐ€ ์กฐ๋ช…๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•  ๋•Œ๊นŒ์ง€ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋”ฐ๋ฅด๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๋‹จ์ผ ์žฅ๋ฉด๊ณผ "์ฃผ" ๊ด‘์›์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ์žฌ๋ฃŒ๊ฐ€ ์ด ์ฃผ ๊ด‘์›์„ ๋ฌด์‹œํ•˜๊ณ  ๋‹ค๋ฅธ ๊ด‘์›์—์„œ ๊ทธ๋ฆผ์ž๋ฅผ ๋“œ๋ฆฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ธ€์Ž„, ๊ทธ๊ฒƒ์„ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ์žฌ๋ฃŒ์— ๋ ˆ์ด์–ด ์ง€์›์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์€ ์นด๋ฉ”๋ผ์—์„œ ๊ฐ์ฒด๋ฅผ ํ‘œ์‹œ/์ˆจ๊ธฐ๊ธฐ์ž…๋‹ˆ๋‹ค.

๊ฒŒ์ž„์„ ํ•˜๊ณ  ์žˆ๊ณ  ํŽธ์ง‘๊ธฐ์—์„œ ๊ตฌ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถฉ๋Œ์ฒด๋ฅผ ํ‘œ์‹œํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ตฌ์ฒด๋Š” ๋ ˆ์ด์–ด 1๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ณ  ์นด๋ฉ”๋ผ์˜ ํŽธ์ง‘๊ธฐ๋Š” ๋ ˆ์ด์–ด 0๊ณผ 1์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฒŒ์ž„ ์นด๋ฉ”๋ผ๋Š” ๋ ˆ์ด์–ด 0์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ํŽธ์ง‘๊ธฐ์—์„œ ๋ชจ๋“  ๋”๋ฏธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฒŒ์ž„์—์„œ๋Š” ' ๋‹ค์‹œ ๊ฐ”๋‹ค.

ํŽธ์ง‘๊ธฐ ์ž์ฒด์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ์ด๊ฒƒ์ด ๋” ์ดํ•ด๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋„ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋“ค์–ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ค๋ฅธ์ชฝ! ๊ทธ๋ž˜์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ฐ€ ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์€ ์ œ Three JS ์„ธ๊ณ„์— 2D ์บ๋ฆญํ„ฐ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์บ๋ฆญํ„ฐ๋Š” ํ™˜๊ฒฝ์˜ ์ผ๋ถ€์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋„๋ก "์ " ๊ทธ๋ฆผ์ž๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ํ˜„์žฌ ๋ฐœ์— ํˆฌ๋ช…ํ•œ ๊ฒ€์€์ƒ‰ ์› ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ  ๋น„์Šค๋“ฌํžˆ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ์ƒ๋‹นํžˆ ํ•ดํ‚น๋œ ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ณต์žกํ•œ ํ‘œ๋ฉด์—์„œ๋Š” ์ „ํ˜€ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

์ด ์•„์ด๋””์–ด๊ฐ€ ์ž‘๋™ํ•˜๋ ค๋ฉด ๋ ˆ์ด์–ด๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‚˜์š”?

์ด ํ›„๊ด‘์€ ์ด ๊ด‘์›์˜ ๊ทธ๋ฆผ์ž๋งŒ ํˆฌ์‚ฌํ•˜๋Š” ๋ฐ˜๋ฉด ์žฅ๋ฉด์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์€ "์ฃผ" ๊ด‘์›์˜ ๊ทธ๋ฆผ์ž๋ฅผ ํˆฌ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

shadowOnly ์˜ต์…˜์ด ์žˆ์—ˆ์ง€๋งŒ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

FWIW, ๊ทธ๋ฆผ์ž๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค ...

์•„, ํ•˜์ง€๋งŒ shadowOnly๋Š” ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ›„๊ด‘์ด ๋‘ ๊ด‘์› ๋ชจ๋‘์—์„œ ๊ทธ๋ฆผ์ž๋ฅผ ํˆฌ์‚ฌํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ๊ทธ๋“ค์ด ํ•˜๋‚˜์˜ ๊ด‘์›์—์„œ๋งŒ ๊ทธ๋ฆผ์ž๋ฅผ ํˆฌ์‚ฌํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ ์ „ํ™”๋กœ ๊ทธ ์˜ˆ๋ฅผ ํ™•์ธํ•˜๊ฒ ์ง€๋งŒ ์œ ๋งํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

ํ  ํŽธ์ง‘ ํ•˜์ง€๋งŒ ๊ทธ ๊ตฌ์ฒด๊ฐ€ ์žฅ๋ฉด์—์„œ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ๊ทธ๋ผ์šด๋“œ ๋ฉ”์‹œ์˜ ๋†’์ด๊ฐ€ ๋‹ค์–‘ํ•˜๋‹ค๋ฉด ๊ทธ ๊ทธ๋ฆผ์ž๊ฐ€ ์ง€๋ฉด์˜ ํ‘œ๋ฉด ๋ฒ•์„ ๊ณผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ผ์น˜ํ• ๊นŒ์š”?

์•„๋‹ˆ์š”...

๊ทธ๋ž˜ ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ–ˆ๋‹ค. ๋ ˆ์ด์–ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค! ํ—คํ—ค

์•ˆ๋…•ํ•˜์„ธ์š” @rohan-deshpande ,

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

์—ฌ๊ธฐ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/erichlof/3dLightCycles

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

๋ฏธ๋ž˜์˜ ๋ ˆ์ด์–ด์— ๋Œ€ํ•ด ์—ฌ๊ธฐ์—์„œ +1 :)

@erichlof ๊ฒŒ์ž„์€

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ ˆ์ด์–ด๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋•Œ๊นŒ์ง€๋Š” ๋‚ด ํ•ดํ‚น ์†”๋ฃจ์…˜์œผ๋กœ ์ถฉ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์–˜๋“ค ์•„
์ด๊ฒŒ ๊ตฌํ˜„๋œ๊ฑด๊ฐ€์š”?
http://stackoverflow.com/questions/33689781/casting-shadows-based-on-a-specific-light?noredirect=1#comment55153706_33689781

์•„๋‹ˆ์š” ์•„์ง ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ ˆ์ด์–ด๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฑฐ๋‚˜ ITT์— ๋‚˜์—ด๋œ ์†”๋ฃจ์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‹œ๋„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ๋ณ„๋„์˜ ์žฅ๋ฉด).

๋‹ค์‹œ +99999

์ด๊ฒƒ์€ ํ™•์‹คํžˆ ๋งค์šฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด์ œ ๋ ˆ์ด์–ด๊ฐ€ ์ž‘๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ด๊ฒƒ์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ์ž, ์—ฌ๊ธฐ ๋‹ค์ •ํ•œ ์ถฉ๋Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ;-)

@manthrax ์ด๊ฒƒ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค!

๋‹ค์‹œ +99999

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

์•ˆ๋…•!
์ด ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜( initMaterial in WebGLRenderer )๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งค์šฐ ๊ฐ„๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ๋ ˆ์ด์–ด.

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

๊ด€๋ จ์ด ์žˆ์„๊นŒ์š”?

๋‹น์‹ ์ด ๊ทธ ์ „์— ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‚˜๋ฅผ ๋ฆฌ๋””๋ ‰์…˜ํ•˜์ง€ ์•Š๋Š” ํ•œ ์ด๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ  ๋‚ด๊ฐ€ ์ด๊ฒƒ์„ ๋‹ฌ์„ฑํ•˜๋Š” ์ฆ‰์‹œ ํ’€ ์š”์ฒญ์„ ์ œ์ถœํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

https://github.com/tiesselune/three.js/tree/selective-lighting

๋‚˜๋Š” ์–ด๋”˜๊ฐ€์— ๋„์ฐฉํ•˜๊ณ ์žˆ๋‹ค. ์ด๊ฒƒ์ด ์„ฑ๋Šฅ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น ์ง€ ๋˜๋Š” ์„ฑ๋Šฅ์„ ์œ„ํ•ด ๋‚ด ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๋‚ด๊ฐ€ ๋งŒ๋“  ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ์—์„œ ์ž‘๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ ˆ์ด์–ด๋ณ„ ์กฐ๋ช…! ์•ผ!

๊ทธ๋ž˜๋„ ์•„์ง ๋” ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•˜๊ณ  pull ์š”์ฒญ์„ ์ œ์ถœํ•˜๊ธฐ ์ „์— ๊ด€๋ จ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

๋‹ค์Œ์€ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

  1. ์กฐ๋ช… ์„ค์ •์ด ๋‹ค๋ฅธ ๋ ˆ์ด์–ด์˜ ๋‘ ๊ฐœ์ฒด๊ฐ€ ๋™์ผํ•œ ์žฌ์งˆ์„ ๊ณต์œ ํ•  ๋•Œ ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ƒˆ ๋ณต์ œ ์žฌ์งˆ์„ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ์˜ค๋ธŒ์ ํŠธ ๋ ˆ๋ฒจ ๋Œ€์‹  ์žฌ๋ฃŒ ๋ ˆ๋ฒจ์—์„œ ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ์กฐ๋ช…์— ๋Œ€ํ•œ ๋ณ‘๋ ฌ ๋ ˆ์ด์–ด ์‹œ์Šคํ…œ ์ƒ์„ฑ). ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ์žฌ๋ฃŒ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์กฐ๋ช… ์„ค์ •์„ ๋‹ฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ€์‹œ์„ฑ์„ ์œ„ํ•œ ํ˜„์žฌ ๋ ˆ์ด์–ด ์‹œ์Šคํ…œ(์˜ค๋ธŒ์ ํŠธ ๋ฐ ์นด๋ฉ”๋ผ)๊ณผ ์กฐ๋ช…(์žฌ๋ฃŒ ๋ฐ ์กฐ๋ช…)์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์ด ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์„ธ์š”?

๋‚˜๋Š” ๋‹น์‹ ์˜ ์˜๊ฒฌ์ด ๋“ค์–ด์˜ค๋Š” ๊ฒƒ์„๋ณด๊ณ  ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์•„๋งˆ ๊ทธ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์€ ๋„์›€์ด๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ์ค‘ ์ €๋Š” ํ™•์‹คํžˆ ๋ฌผ์ฒด๋ณด๋‹ค๋Š” ์žฌ์งˆ์— ๋ผ์ดํŠธ ๋ ˆ์ด์–ด๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์†Œ ์ง๊ด€์ ์ด์ง€ ์•Š์ง€๋งŒ ์—ฌ์ „ํžˆ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , filterAmbiantLights ๋Š” filterAmbientLights ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฒ ์ž ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ๋‹น์‹ ์ด ์˜ณ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ‹€๋ ธ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„์ฐจ๋ฆฌ๊ธฐ ์ „์— ์‹ค์ œ๋กœ "ambiant"๋กœ ๋ชจ๋“  ๊ฒƒ์„ ์ž‘์„ฑํ–ˆ๊ณ  ๋‚˜๋Š” ๊ทธ ๋ฐœ์ƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜‡

๊ทธ๋Ÿฐ ๋‹ค์Œ ์žฌ๋ฃŒ์˜ ๋ ˆ์ด์–ด ์ •๋ณด๋ฅผ ์ด๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž‘๋™ ๋ฐฉ์‹๊ณผ ๋” ๊ด€๋ จ์„ฑ์ด ์žˆ๊ณ  ์ผ๊ด€์„ฑ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

initMaterial (๊ทธ๋ฆฌ๊ณ  acquireProgram ๋ฐ getShaderParameter ๋Š” ์–ด๋–ค ์ด์œ ๋กœ ์—„์ฒญ๋‚˜๊ฒŒ ๋Š๋ฆผ)๊ฐ€ ๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœ๋˜์–ด ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค lightHash ๋Š” ๋งค๋ฒˆ ๋‹ค๋ฅด๋ฉฐ material.needsUpdate ๋ฅผ true ํ•ฉ๋‹ˆ๋‹ค.

BTW Chrome์˜ ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. (ํƒ€์ž„๋ผ์ธ ๋ฐ ํ”„๋กœํŒŒ์ผ๋Ÿฌ).

์ œ ์ƒ๊ฐ์—๋Š” ๊ดœ์ฐฎ์ง€๋งŒ acquireProgram ๊ฐ€ ํ•ญ์ƒ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ด์œ ๊ฐ€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๊ฐ ์กฐ๋ช… ์œ ํ˜•์˜ ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋งค๋ฒˆ ์…ฐ์ด๋”๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•  ํ•„์š”๊ฐ€ ์—†๊ฒ ์ฃ ?

๋‚˜๋„ ์ดํ•ด๊ฐ€ ์•ˆ ๊ฐ„๋‹ค;

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

threejscalltree

WebGLProgram์ด ์ƒ์„ฑ๋˜๋Š” ๋™์•ˆ ์ •์ /์กฐ๊ฐ ์…ฐ์ด๋” ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์…ฐ์ด๋”๋กœ ๊ฐ„์ฃผํ•˜๋Š” replaceLightNums ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ?

ํŽธ์ง‘ : ์–ด์จŒ๋“ , ์žฌ๋ฃŒ ์ˆ˜์ค€์—์„œ ๋ ˆ์ด์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ˆ์ƒ๋Œ€๋กœ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์กฐ์‚ฌํ•ด์•ผ ํ•  ์–ด๋”˜๊ฐ€์— ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์žˆ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ฝค ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ์™„์ „ํžˆ ์ดํ•ดํ•˜๊ณ  ์ƒˆ๋กœ์šด ๋ฒ„๊ทธ๋ฅผ ๋„์ž…ํ•˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์™œ ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์…ฐ์ด๋” ์ฝ”๋“œ๊ฐ€ ํ”„๋ ˆ์ž„๋งˆ๋‹ค ๋ณ€๊ฒฝ๋˜๋Š” ์ด์œ ๋ฅผ ๋‹จ๊ณ„๋ณ„๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

์‹ค์ œ๋กœ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ผ์ดํŠธ ์ˆซ์ž๊ฐ€ ๊ฐ€๋ณ€์ ์ด๋ผ๋ฉด ์•ฝ๊ฐ„์˜ ๊ฐœ์„ ์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐ ๋จธํ‹ฐ๋ฆฌ์–ผ์€ ๋™์ผํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ธ์Šคํ„ด์Šค์ผ ๋ฟ์ด์ง€๋งŒ ํ•ด๋‹น ์ˆซ์ž๋Š” ์…ฐ์ด๋” ์ฝ”๋“œ( replaceLightNums )์— ์‚ฝ์ž…๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ๋ฐฉ์‹๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. (๋ฐ ์ตœ์ ํ™”)์ž…๋‹ˆ๋‹ค.

์„ค๋ช…์ด ์ถฉ๋ถ„ํžˆ ์ดํ•ด๊ฐ€ ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค

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

๋ญ”๊ฐ€...

for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {

    pointLight = pointLights[ i ];
    pointLight.distance *= float( object.mask & pointlight.mask > 0.0 );

    ...

}

์Œ, glsl์—์„œ ๋น„ํŠธ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค...

์˜ˆ, ๋น„ํŠธ ์—ฐ์‚ฐ์ด GLSL 1.30์—์„œ ์‹œ์ž‘๋˜๊ณ  ํ‘œ์ค€ WebGL์ด 1.00์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๐Ÿ˜•

์•ˆ๋…•ํ•˜์„ธ์š” @mrdoob ๊ณผ @tiesselune ,

Chrome 56 ๋ฐ Firefox 51์ด ๋ฐฉ๊ธˆ ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, WebGL 2.0์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค(WebGL2๋Š” OpenGL ES 3.0 ์‚ฌ์–‘์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค). ์ฆ‰, ์ด์ œ ๋น„ํŠธ ์ž‘์—…(๋ฐ 3D ํ…์Šค์ฒ˜์™€ ๊ฐ™์€ ๊ธฐํƒ€ ๋ฉ‹์ง„ ๊ธฐ๋Šฅ)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Three๊ฐ€ WebGL 2.0์œผ๋กœ์˜ ์ „ํ™˜์„ ์ฒœ์ฒœํžˆ ์ค€๋น„ํ•˜๊ณ  ์žˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ €๋Š” three84.js ์‚ฌ๋ณธ์— ๋ช‡ ๊ฐ€์ง€ ํ•„์ˆ˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๊ณ  WebGL 2.0์„ ํ™œ์„ฑํ™”ํ–ˆ์œผ๋ฉฐ ์…ฐ์ด๋”์—์„œ ์•ฝ๊ฐ„์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ๊ณ  ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค!
https://developers.google.com/web/updates/2017/01/nic56
https://developer.mozilla.org/en-US/Firefox/Releases/51

๋‹จ์ง€ ๋‹น์‹ ์—๊ฒŒ ์•Œ๋ฆฌ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์Šคํ‚น ์•„์ด๋””์–ด์— +1 :-)

์•ˆ๋…•ํ•˜์„ธ์š” @erichlof์ž…๋‹ˆ๋‹ค ! WebGL2์— ๋Œ€ํ•œ ์ข‹์€ ์†Œ์‹์ž…๋‹ˆ๋‹ค. ์ด๋Š” WebGL2 ๋ Œ๋”๋Ÿฌ๊ฐ€ ๋งˆ์Šคํ‚น ๋ฌธ์ œ์— ๋ณด๋‹ค ํšจ์œจ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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

๋‹ค์‹œ ์•ˆ๋…•!

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

์–ด์จŒ๋“  ๋‚˜๋Š” examples/webgl_lights_selective_lighting.html ์—์„œ

๋‹ค์Œ์€ ์Šคํฌ๋ฆฐ์ƒท์ž…๋‹ˆ๋‹ค.
shadowmap

์—ฌ๊ธฐ์—์„œ ์˜ˆ์ œ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

https://rawgit.com/tiesselune/three.js/selective-lighting/examples/webgl_lights_selective_lights.html

๊ทธ๋ž˜๋„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Uncaught TypeError: Cannot read property 'set' of undefined
    at init (webgl_lights_selective_lights.html:117)
    at webgl_lights_selective_lights.html:67

@looeee : ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ์—์„œ npm run build-uglify ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณ‘ํ•ฉ ๊ฐ€๋Šฅ์„ฑ์„ ์œ„ํ•ด ์ž๋ฐœ์ ์œผ๋กœ ์ปค๋ฐ‹์— ๋นŒ๋“œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค...

์•„๋‹ˆ๋ฉด ํ•ด์•ผ ํ• ๊นŒ์š”?

ํŽธ์ง‘ : ๋‹ค์Œ์€ ํ…Œ์ŠคํŠธ ๋ชฉ์ ์œผ๋กœ ๋‹ค๋ฅธ ์ง€์ ์—์„œ ์ž‘๋™ํ•˜๋Š” ๋งํฌ์ž…๋‹ˆ๋‹ค. https://rawgit.com/tiesselune/three.js/selective-lights-test/examples/webgl_lights_selective_lights.html

์ด๋ด, ๋‚˜์—๊ฒŒ์„œ +999999. ์ด๊ฒƒ์€ ๊ตฌํ˜„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ ์–ด๋„ THREE.Layers )

$$('.comment-body').reduce((acc, el) => {
  let mat = el.textContent.match(/\+(\d+)/)
  let num = +(mat && mat[1] || 0)
  return acc + num
}, 0)
>> 1219997

๐Ÿค”

@mrdoob ๊ทธ๋Š” ์ด ์Šค๋ ˆ๋“œ์—์„œ +N์„ ๊ณ„์‚ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

btw, ์„ ํƒ์  ์กฐ๋ช…์˜ ๊ฒฝ์šฐ +14570

์ด๊ฒƒ์€ ๋” ๋†’์€ ์ถ”์ƒํ™”์—์„œ ์กฐ๋ช…์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ๋ฏธ์„ธ ์กฐ์ •ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ํŽœ์—์„œ ์กฐ๋ช…์ด ์ข€ ๋” ์‚ฌ์‹ค์ ์œผ๋กœ ๋ณด์ด๋„๋ก DOM ์š”์†Œ์— ๋Œ€ํ•ด ์กฐ๋ช…์ด ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๊ณ  Sphere์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

https://codepen.io/trusktr/pen/RjzKJx

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

์˜ˆ๋ฅผ ๋“ค์–ด, ์ด์ „ ์˜ˆ์—์„œ "DOM ์š”์†Œ"์— ์ข‹์€ ๊ทธ๋ฆผ์ž๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๋น›์˜ ๊ฐ•๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋Ÿฌ๋ฉด Sphere๊ฐ€ ๋„ˆ๋ฌด ๋น›๋‚˜๊ณ  ๋ฐ๊ฒŒ ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ Sphere์— ๋Œ€ํ•ด ๋” ์–ด๋‘์šด ์กฐ๋ช…์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ  "DOM ์š”์†Œ"์— ๋Œ€ํ•ด ๋” ๋ฐ์€ ์กฐ๋ช…์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์‹œ์ฒญ์ž์—๊ฒŒ ์—ฌ์ „ํžˆ ํ•˜๋‚˜์˜ ์กฐ๋ช…๋งŒ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ๋” ํ˜„์‹ค์ ์ธ ๊ฒƒ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜๋Š” ์ƒ์œ„ ๋ ˆ๋ฒจ API์—์„œ ์ถ”์ƒํ™”๋˜์–ด ์”ฌ ๋’ค์—์„œ ๋‘ ๊ฐœ์˜ Three.js ์กฐ๋ช…์ด ์‹ค์ œ๋กœ ์ž‘๋™ํ•  ๋•Œ ํ•˜๋‚˜์˜ ์กฐ๋ช…๋งŒ ์กฐ์ž‘๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@WestLangley

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ ๋ฐฉ(๋ฐ ํ•ด๋‹น ์กฐ๋ช…)์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์žฅ๋ฉด์„ ์„ค์ •ํ•˜์—ฌ ๋Œ€๋ถ€๋ถ„์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด์™€ ๊ฐ™์€ ์˜ˆ์— ๋Œ€ํ•œ ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฒฐ๊ณผ์— ๋‹ค๋ฅธ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ Œ๋”๋ง ํšจ๊ณผ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฒฐ๊ณผ์— ๋‹ค๋ฅธ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ Œ๋”๋ง ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ๋ฅผ ๋“ค์–ด ํˆฌ๋ช… ๊ฐœ์ฒด์˜ ๋ Œ๋”๋ง ์ˆœ์„œ - ์žฅ๋ฉด 1์˜ ํˆฌ๋ช… ๊ฐœ์ฒด๋Š” ์žฅ๋ฉด 2์˜ ๋ถˆํˆฌ๋ช… ๊ฐœ์ฒด๋ณด๋‹ค ๋จผ์ € ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.

์ด์™€ ๊ฐ™์€ ์˜ˆ์— ๋Œ€ํ•œ ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ, ๋‚˜๋Š” ๋‹น์‹ ์„ ์œ„ํ•ด ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค : https://jsfiddle.net/f2Lommf5/524/

์˜ˆ๋ฅผ ๋“ค์–ด ํˆฌ๋ช… ๊ฐœ์ฒด์˜ ๋ Œ๋”๋ง ์ˆœ์„œ - ์žฅ๋ฉด 1์˜ ํˆฌ๋ช… ๊ฐœ์ฒด๋Š” ์žฅ๋ฉด 2์˜ ๋ถˆํˆฌ๋ช… ๊ฐœ์ฒด๋ณด๋‹ค ๋จผ์ € ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งค์šฐ ์ œํ•œ๋œ ๊ฒฝ์šฐ์—๋งŒ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ง„์ •ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค!

๊ธ€์Ž„, ๋‹น์‹ ์€ scene1 trough์—์„œ scene2์˜ ๋ถˆํˆฌ๋ช…ํ•œ ๋ฌผ์ฒด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๋‹ค๋ฉด ์กฐ๋ช…๋„ ํ†ต๊ณผํ•ด์•ผ ํ•˜๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ ์žฅ๋ฉด์„ ๋ถ„๋ฆฌํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์ฃผ์žฅ์ด ์‹ค์ œ๋กœ ์„ค๋“๋ ฅ์ด ์—†๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

@makc ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฌธ์ œ์˜ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

https://discourse.threejs.org/t/how-to-make-shadows-darker-on-transparent-objects/1389

์„ ํƒ์  ์กฐ๋ช…์ด ์ด์— ์ •๋ง ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@trusktr mrdoob์˜ ๊ทธ๋ฆผ์ž ์žฌ์งˆ์„ ๋ณ€๊ฒฝํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ‘๋ฐฑ ๊ทธ๋ฆผ์ž ํ…์Šค์ฒ˜๋งŒ ํ‘œ์‹œ๋˜๋ฉฐ ํ•„์š”์— ๋”ฐ๋ผ ํˆฌ๋ช…ํ•˜๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PlayCanvas์˜ ๋งˆ์Šคํฌ๋Š” ์„ ํƒ์  ์กฐ๋ช…์— ์‚ฌ์šฉํ•˜๊ธฐ ์ •๋ง ์‰ฌ์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค( https://forum.playcanvas.com/t/set-certain-object-to-not-receive-light/785).

์ด๊ฒƒ์„ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ฆผ์ž ๋ฌธ์ œ๋Š” ์ฝ”๋“œ ๋ณ€๊ฒฝ๊ณผ ๊ด€๋ จ์ด ์—†๋Š” Lambert ์…ฐ์ด๋” ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. @tiesselune

@ErikBehar ์‹ค์ œ๋กœ ์˜ค๋Š˜ ์˜คํ›„์— ํ•  ์ผ์„ ์ฐพ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ตœ์‹  threejs๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ œ์ถœํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๊นŒ? ์ €๋Š” ์ œ๊ฐ€ ์ด๋ ‡๊ฒŒ ํฐ ํ”„๋กœ์ ํŠธ์— ์‹ค์งˆ์ ์ธ ๊ธฐ์—ฌ๋ฅผ ํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์–ด ์ •๋ง ๊ธฐ์ฉ๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ์ด ๋ฒ„๊ทธ๊ฐ€ ๋‚ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ๊ด€๋ จ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค)

ํŽธ์ง‘: ์ฝ”๋“œ์˜ ์ด ๋ถ€๋ถ„์ด ๋งŽ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์— ์‚ฌ์šฉํ•˜๋˜ ์ƒํƒœ๊ฐ€ WebGLRenderer์—์„œ WebGLLights๋กœ ์ด๋™ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@tiesselune ๋‚˜๋Š” ์ด๊ฒƒ์„ ํ”„๋กœ์ ํŠธ์— ๊ฐ€์ ธ์™€์•ผ ํ–ˆ์œผ๋ฏ€๋กœ ๊ณ„์† ์ง„ํ–‰ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ v93์œผ๋กœ ์ด์‹ํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/ErikBehar/three.js/tree/selectiveLights ์ฐธ์กฐ

๋‹น์‹ ์ด ์›ํ•œ๋‹ค๋ฉด ๋‚ด๊ฐ€ PR์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? @mrdoob

@ErikBehar ๊ธ€์Ž„, ๋‚ด๊ฐ€ ๋ชฉํ‘œ๋กœ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์™„์ „ํžˆ ํ•  ์‹œ๊ฐ„์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ํ•„ํ„ฐ๋ง/ํ•ด์‹œ ๊ธฐ๋Šฅ์„ WebGLRenderer์—์„œ ์˜ฎ๊ธฐ๊ณ  WebGLLights ์ƒํƒœ ๊ฐœ์ฒด์— ์ถ”๊ฐ€ํ–ˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ์ด์–ด ์‹œ์Šคํ…œ์€ ๋ Œ๋”๋Ÿฌ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ ์ƒํƒœ์˜ ์ผ๋ถ€์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์ด์ œ ๊ฑฐ๊ธฐ์— ์†ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@ErikBehar ํ™๋ณด ํšจ๊ณผ๊ฐ€ ์ข‹์Šต๋‹ˆ๋‹ค!

@tiesselune ๋‹น์‹ ์ด ์ œ์•ˆํ•œ๋Œ€๋กœ ์ด๋™์„ ์กฐ์‚ฌํ•˜๊ฑฐ๋‚˜ ๋‚ด ํฌํฌ์— PR์„ ์ž์œ ๋กญ๊ฒŒ ํ‘ธ์‹œ lol = ] ๊ณง PR์„ ๊ฒŒ์‹œ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค @mrdoob

์ด์— ๋Œ€ํ•œ ์ƒํƒœ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? @ErikBehar์˜ r94dev ์ฝ”๋“œ๋ฅผ r94 ๋กœ ๋ณ‘ํ•ฉํ•œ ๋‹ค์Œ r97์„ ์—ฌ๊ธฐ์— ๋ณ‘ํ•ฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์ถฉ๋Œ(๋ฒ„์ „ ๋ณ€๊ฒฝ, ์„ ํƒ์  ์กฐ๋ช…์„ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋ณ€์ˆ˜, renderers/WebGLRenderer.js์—์„œ ํ•ด์‹œ ์ƒ์„ฑ)๋งŒ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. @tiesselune PR์„ ๋„ฃ์–ด ๊ฐ€๋ ค๊ณ  ํ–ˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ์‹ค ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ธฐ๊บผ์ด ์˜ฎ๊ธฐ๊ณ  ํ…Œ์ŠคํŠธํ•˜๊ณ  PR์„ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ํ•˜๋‹ค:
์กฐ๊ธˆ ํ›„์—: ์ด์ œ ์ƒˆ ๋ผ์ดํŠธํ•ด์‹œ๋กœ ์ž‘๋™ํ•˜๋ ค๋ฉด ์•ฝ๊ฐ„์˜ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

@VaelynPhi ๋‚˜๋Š” ๊ทธ๋“ค์ด @ErikBehar ์˜ ์ฝ”๋“œ๋ฅผ ๊ธฐ๊บผ์ด ์ˆ˜๋ฝํ• ์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด PR์„ ์ œ์ถœํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ–ˆ๋‹ค

์ด ๋…€์„๋“ค์—๊ฒŒ ๊ณต์„ ๋–จ์–ด๋œจ๋ ค์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค = / ... @VaelynPhi ํฌํฌ/๋ธŒ๋žœ์น˜๋ฅผ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

๋‹ค์Œ์„ ๊ธฐ๋ฐ˜์œผ๋กœ PR์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/ErikBehar/three.js/commit/ac0499b70b82bc7bb780100a8372fcdf318d1424#diff -5e43a0b5002eb2c419def3baf67d4e67
์ž‘์„ฑ์ž @ErikBehar
๋ˆ„๊ตฌ๋“ ์ง€ ๊ฒ€ํ† ์™€ ์˜ˆ๋ฅผ ๋“ค์–ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

https://github.com/mrdoob/three.js/pull/15223

์–˜๋“ค์•„, ์ด๊ฑฐ ์ƒํƒœ๊ฐ€ ์–ด๋•Œ? @tiesselune @ErikBehar ๋ญ”๊ฐ€ ๋„์™€๋“œ๋ฆด๊นŒ์š”? 4๋…„๋งŒ์— ๋“œ๋””์–ด ๊ตฌํ˜„ํ•˜๋ฉด ์ข‹์„ํ…๋ฐ ๐Ÿ˜„๐Ÿ’ฏ

@flyrell ์•„๋งˆ๋„ #15223์—์„œ ๋๋‚  ๊ฒƒ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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