Three.js: ๋…ธ๋“œ ๋จธํ‹ฐ๋ฆฌ์–ผ

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

์•ˆ๋…•ํ•˜์„ธ์š”.

์ €๋Š” 3D ์ €์ž‘ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐ„์˜ ์ฐจ์ด ์ž๋ฃŒ๋ฅผ ์กฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด THREE.NodeMaterial์˜ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. SEA3D Studio์—๋Š” ๋งˆ์Šคํฌ ๋ฐ ๋‹ค์–‘ํ•œ ํ˜ผํ•ฉ ๋ชจ๋“œ, ๋ฆผ ์…ฐ์ด๋” ๋ฐ ๊ธฐํƒ€ ์‚ฌ์šฉ์ž ์ •์˜ ์…ฐ์ด๋” ์ฝ”๋“œ ์—†์ด Albedo์—์„œ ๋ ˆ์ด์–ด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ ์…ฐ์ด๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๊ฒƒ์„ Three.JS๋กœ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

MeshPhongMaterial, MeshPhysicalMaterial ๋“ฑ์€ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ ๋˜๋Š” ํ”„๋ก์‹œ ์ „์šฉ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด NodeMaterial์„ ์‰ฝ๊ฒŒ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ๋จ
http://sunag.github.io/sea3d/Labs/Three.JS-NodeMaterial/webgl_materials_nodes.html
http://sunag.github.io/sea3d/Labs/Three.JS-NodeMaterial/webgl_postprocessing_nodes.html

ํ…์Šค์ฒ˜์— UV1 ๋˜๋Š” UV2๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ๋ฌธ ์˜ˆ:

var usesUv2 = true;
var isLightmap = false;

var t = new THREE.NodeTexture( texture, new THREE.NodeUV( usesUv2 ) );

var nodemat = new THREE.NodePhongMaterial();
if (isLightmap) nodemat.light = t;
else nodemat.color = t;
nodemat.build(); // build shader

๋‚˜๋„ ํŽธ์ง‘๊ธฐ๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ๋Š”๋ฐ, ํ˜„์žฌ ์ด๊ฒƒ์ด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒ‰์ƒ์€ ์•Œ๋ฒ ๋„์ด๊ณ  ๋ณ€ํ™˜์€ ์ •์  ์œ„์น˜์ž…๋‹ˆ๋‹ค.
editor

deferred shading์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹ ๊ฒฝ์„ ์“ฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ฐ˜์‚ฌ ๋ฐ ๊ตด์ ˆ ์ž…๋ ฅ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

PR, ์ œ์•ˆ, ํ…Œ์ŠคํŠธ ๋ฐ ๊ฐœ์„  ์‚ฌํ•ญ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.+1:

Enhancement

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

์ข‹์•„์š”, ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ TS ์ง€์›์ด ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค R017 ๐Ÿ™Œ

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

ํฅ๋ฏธ๋กœ์šด!

@sunag ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฐ ๊ฒƒ์— ๊ด€์‹ฌ์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค? ์ตœ์†Œํ•œ Standard์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค‘๊ฐ„ ๋…ธ๋“œ๋„ ์ž…๋ ฅ์„ ๋ฐ›๋„๋ก ์ƒ๋‹นํžˆ ์ž„์˜์ ์ธ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…์Šค์ฒ˜(tex1, uv1)
B ํ…์Šค์ฒ˜(tex2, uv2)
C ํ˜ผํ•ฉ(A,B, ๋ชจ๋“œ)
D ๋…ธ์ด์ฆˆ(param1, param2)
E ๋ธ”๋ Œ๋“œ(C,D, ๋ชจ๋“œ)

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ตœ์ข… ๋…ธ๋“œ E๋ฅผ ๋จธํ‹ฐ๋ฆฌ์–ผ์— ๋Œ€ํ•œ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ…์Šค์ฒ˜์—๋งŒ ๊ตญํ•œ๋˜์ง€ ์•Š๊ณ  ๋งค์šฐ ์ž„์˜์ ์ž…๋‹ˆ๋‹ค.

๋‚ด ๋ชฉํ‘œ๋Š” ๋‹ค์Œ ๋ช‡ ์ฃผ ์•ˆ์— ์ด๊ฒƒ์„ ๋งŒ๋“œ๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋ฉด ๋‹ค์Œ ์ฃผ์— ๊ท€ํ•˜์™€ ํ˜‘๋ ฅํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. https://github.com/mrdoob/three.js/issues/7339 ์˜ ์…ฐ์ด๋”๊ทธ๋ž˜ํ”„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ThreeJS ๋‚ด์—์„œ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์—ฐํ•˜๊ณ  ์ž‘๋™ํ•˜๋Š” ์†”๋ฃจ์…˜์ด๋ผ๋ฉด ์–ด๋–ค ์†”๋ฃจ์…˜์ด๋“  ์ข‹์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์˜ ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ์žˆ๋Š”๋ฐ, ๊ทธ๊ฒƒ์€ ์•„์ฃผ ๋ฉ‹์ง€๊ฒŒ ๋””์ž์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ํ”ผ๋“œ๋ฐฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณต๋™ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜์—ฌ PR์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

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

(3) UV๋Š” ์žฌ๋ฃŒ์— ์˜ํ•ด ํ•ด๊ฒฐ๋˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ฐธ์กฐ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  NodeTexture๊ฐ€ ์‹ค์ œ๋กœ ๋…ธ๋“œ ์ž…๋ ฅ์„ ๋ฐ›์•„ ์ ˆ์ฐจ์ ์œผ๋กœ ์ƒ์„ฑ๋œ UV๋ฅผ ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

(4) ๋‚˜๋จธ์ง€ Three.JS์™€ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด NodeCube, NodeTextureCube๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ๊ด‘์„  ํˆฌ์‚ฌ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋…ผ๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ €๋Š” ํ‘œ์ค€ ํ๋ธŒ ๋งต์˜ ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‹ค์ œ๋กœ ๋…ธ๋“œ์— ์ŠคํŽ˜ํ˜๋Ÿฌ ๋˜๋Š” ๋””ํ“จ์ฆˆ์— ๋Œ€ํ•œ ํ™˜๊ฒฝ ์ฟผ๋ฆฌ๋ฅผ ๋„ฃ์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ ํ ๋จธํ‹ฐ๋ฆฌ์–ผ์— ํฌํ•จํ•˜๊ณ  ์ฟผ๋ฆฌ์— ์‚ฌ์šฉ๋˜๋Š” ๋ฒ•์„ ๋งŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. cubemap ๊ฒฐ๊ณผ ์ž์ฒด(๋”ฐ๋ผ์„œ ์ ˆ์ฐจ์— ๋”ฐ๋ผ ๊ฒฐ์ •๋œ ์ƒ‰์ƒ์ด ๋  ์ˆ˜ ์žˆ์Œ). ๊ทธ๊ฒŒ ๋ง์ด ๋˜๋‚˜์š”? ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋จธํ‹ฐ๋ฆฌ์–ผ์— ๋…ธ๋ฉ€ ํ”Œ๋Ÿฌ๊ทธ ๊ฐ€๋Šฅํ•˜๊ณ  ํ๋ธŒ ํ…์Šค์ฒ˜ ํ”Œ๋Ÿฌ๊ทธ ๊ฐ€๋Šฅ(๋ฐฉํ–ฅ ๋ฐ ๋ฐ”์ด์–ด์Šค/๋กœ๋“œ๋กœ ์ฟผ๋ฆฌ ๊ฐ€๋Šฅํ•˜๊ณ  ์ƒ‰์ƒ์„ ๋ฐ˜ํ™˜ํ•จ)์„ ๊ฐ€์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•˜๋‚˜๋Š” irradiance ๋งต์— ํ๋ธŒ ํ…์Šค์ฒ˜๋ฅผ ์ œ๊ณตํ•˜๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” specular ๋งต์— ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง„์ •ํ•œ sampleCube๋ฅผ @tschw ์˜ cubeToUV2 ํ•จ์ˆ˜๋กœ ๋…ธ๋“œ ๊ตํ™˜์œผ๋กœ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(5) NodeOp์— ์ถ”๊ฐ€๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž„์˜์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” NodeFunction์„ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค(๋˜๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ณ‘ํ•ฉ๋  ์ˆ˜๋„ ์žˆ์Œ).

(6) ์žฅํ™ฉํ•œ NodeNormal, NodeTransform, NormalMap ๋“ฑ์˜ ๊ฐœ๋ณ„ ํด๋ž˜์Šค๋ฅผ ๋ชจ๋‘ ์—†์• ๊ณ  ์žฌ๋ฃŒ์— ์˜ํ•ด ์ ์ ˆํ•˜๊ฒŒ ํ•ด์„๋˜๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ NodeReference๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ƒ์„ฑ์ž๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. NodeReference๋Š” ์…ฐ์ด๋”์—์„œ ๊ณ„์‚ฐ๋œ ๊ฐ’๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์œ ๋‹ˆํผ, ๊ฐ€๋ณ€์„ฑ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(7) NodeEnvironment์™€ NodeCube์˜ ์ฐจ์ด์ ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. NodeEnvironment๊ฐ€ ๋ถˆ์™„์ „ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

(8) NodePhong์ด NodeMaterial์—์„œ ํŒŒ์ƒ๋˜์ง€ ์•Š์€ ๊ฒƒ์€ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. NodeMaterial์ด ShaderMaterial์—์„œ ํŒŒ์ƒ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ. ShaderMaterial, GraphMaterial(๋˜๋Š” NodeGraphMaterial)์—์„œ ์ง์ ‘ ํŒŒ์ƒ๋ฌผ์„ ํ˜ธ์ถœํ•œ ๊ฒƒ์ด ๋” ์ดํ•ด๊ฐ€ ๋˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ํ•จ๊ป˜ ๊ทธ๋ž˜ํ”„๋ฅผ ํ˜•์„ฑํ•˜๊ณ  ๊ฐœ๋ณ„ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ์žฌ๋ฃŒ๊ฐ€ ๋˜๋Š” ๊ทธ๋ž˜ํ”„์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

(9) ์ข€ ๋” ๋‹ค์–‘ํ•œ ์šฉ์–ด๋ฅผ ์ œ์•ˆํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ MaterialNode๋ผ๊ณ  ํ•˜๊ณ  ์ด ๋…ธ๋“œ์—์„œ PhongMaterialNode๋ฅผ ํŒŒ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ValueNode์—์„œ ํŒŒ์ƒ๋œ Vector3Node, FloatNode ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ์ผ์ •ํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ ๊ฐ’๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 3๊ฐœ์˜ FloatNode๋ฅผ Vector3Node๋กœ ํŒŒ์ดํ”„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ 10๊ฐœ ์ •๋„๊ฐ€ ์•„๋‹Œ ์ด ํ•œ ์ค„ ์ •๋„ ๊ฐ๊ฐ์„ ์„ ์–ธํ•˜๋Š” ๋„์šฐ๋ฏธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

(10) ๋‚˜๋Š” "Node"๋ผ๋Š” ์ด๋ฆ„์„ ํด๋ž˜์Šค ์ด๋ฆ„์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์—์„œ ๋’ค๋กœ ์ด๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์ด ๋‚˜๋จธ์ง€ ThreeJS ํ”„๋กœ์ ํŠธ์˜ ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

(11) ์ƒˆ๋กœ์šด MaterialNode ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์œ ๋‹ˆํผ ๋ฐ ๊ฐ€๋ณ€ ๋ชฉ๋ก์œผ๋กœ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ํ•ด๊ฒฐ๋œ ํ•ญ๋ชฉ์„ ์ถ”์ ํ•˜์—ฌ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŒŒ์ƒ๋œ PhongMaterialNode์—์„œ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๊ธฐ๋ณธ ํด๋ž˜์Šค์— ์˜์กดํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ(๊ฐ€๋ณ€, ์œ ๋‹ˆํผ)๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ œํ•œ๋œ ํ•ด๊ฒฐ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(12) NodePhong๊ณผ NodePhongMaterial์˜ ์ฐจ์ด์ ์ด ํ—ท๊ฐˆ๋ฆฝ๋‹ˆ๋‹ค. ์ด๋•Œ๊นŒ์ง€๋งŒ ํ•ด๋„ ๋‘˜ ๋‹ค ์žˆ๋Š” ์ค„ ๋ชฐ๋ž์–ด์š”.

(13) ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

THREE.NodeGLPosition.prototype = Object.create( THREE.Node.prototype );
THREE.NodeGLPosition.prototype.constructor = THREE.NodeGLPosition;

THREE.NodeGL.prototype.generate = function( material, shader ) {

๊ทธ๋Ÿฌ๋‚˜ ์ด ์Šค๋‹ˆํŽซ ์œ„์—์„œ ์ด๋ฏธ generate ๋Œ€ํ•ด NodeGL ์ •์˜ํ–ˆ๊ณ  NodeGLPosition ๋Œ€ํ•ด ์ •์˜ํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐ-ํŽธ์ง‘ ์˜ค๋ฅ˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

(14) NodeReflectUVW ๋ฐ NodeRefractVector๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋Œ€์‹  ์ฐธ์กฐ ํ™•์ธ์„ ํ†ตํ•ด ๋จธํ‹ฐ๋ฆฌ์–ผ์—์„œ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ฐ˜์‚ฌ ๋ฒกํ„ฐ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋ณ‘ํ•ฉ๋˜์ง€ ์•Š์€ ์‹คํ—˜์ ์ธ ThreeJS ๋ถ„๊ธฐ์˜ GeometryContext ์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

(15) ๋ฐ˜์‚ฌ์™€ ๊ตด์ ˆ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์žฌ์งˆ์˜ ์ƒ‰์ƒ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๋ณ€์ˆ˜๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ Refect, ReflectLOD ๋ฐ Refract, RefractLOD๋ฅผ ํ•ด๊ฒฐํ•œ ๋‹ค์Œ ํ•ด๋‹น ํ…์Šค์ฒ˜ ํ๋ธŒ(์ ˆ์ฐจ ๋˜๋Š” samplerCube ๊ธฐ๋ฐ˜)์— ์ „๋‹ฌํ•œ ๋‹ค์Œ ๊ฒฐ๊ณผ ์ƒ‰์ƒ์„ Material์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋˜๊ฐ€์š”?

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

@bhouston woow, ํ”ผ๋“œ๋ฐฑ ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
๋‹ต๋ณ€์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฒŒ์‹œ๋ฌผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค :)

์ค‘๊ฐ„ ๋…ธ๋“œ๋„ ์ž…๋ ฅ์„ ๋ฐ›๋„๋ก ์ƒ๋‹นํžˆ ์ž„์˜์ ์ธ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ…์Šค์ฒ˜(tex1, uv1)
B ํ…์Šค์ฒ˜(tex2, uv2)
C ํ˜ผํ•ฉ(A,B, ๋ชจ๋“œ)
D ๋…ธ์ด์ฆˆ(param1, param2)
E ๋ธ”๋ Œ๋“œ(C,D, ๋ชจ๋“œ)

ํ˜„์žฌ ์ด์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค. Uv1 ์˜คํ”„์…‹ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์˜ˆ:
NodeMaterial์„ MaterialNode์™€ THREE.PhongMaterialNode๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

var uv2 = false;
var uv_offset = new THREE.NodeFloat(0);     
var uv = new THREE.NodeOperator( '+', new THREE.NodeUV( uv2 ), uv_offset);
var texture = new THREE.NodeTexture( imgTexture, uv );

nodematerial.color = t;

// onUpdate
uv_offset.number += .01;

๊ท€ํ•˜์˜ ์ œ์•ˆ๊ณผ ํ•จ๊ป˜ ์ˆœ์„œ๋ฅผ ๋ฐ˜๋Œ€๋กœ ํ•˜๋ฉด (๋ชจ๋“œ,A,B)๊ฐ€ (A,B,๋ชจ๋“œ)๋กœ ์ข‹์•„์งˆ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฆฌํ”Œ๋ ‰์Šค ๋งต, ํ๋ธŒ๋งต ๋“ฑ์„ ๋งŒ๋“œ๋Š” ์ค‘์ž…๋‹ˆ๋‹ค...

ํ™˜๊ฒฝ๊ณผ Cubemap์ด ๋ถˆ์™„์ „ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋ฒ„๊ทธ๋Š” ํ˜•์‹ ๋ณ€ํ™˜๊ธฐ๊ฐ€ ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋งŽ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฒกํ„ฐ ๋ณ€ํ™˜์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด vec3์—์„œ vec4 ๋˜๋Š” vec4๋กœ.

https://github.com/sunag/sea3d/blob/gh-pages/Labs/Three.JS-NodeMaterial/index.html#L365

์˜ˆ๋ฅผ ๋“ค์–ด ํ˜ผํ•ฉ "ํ…์Šค์ฒ˜": (์ด ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค)
THREE.NodeOperator์™€ ๋™์ผํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/sunag/sea3d/blob/gh-pages/Labs/Three.JS-NodeMaterial/index.html#L1105

THREE.NodeBlend = function( a, b, mode ) {

    THREE.NodeInput.call( this, 'blend' );

    this.mode = mode;
    this.a = a;
    this.b = b;

};

THREE.NodeBlend.prototype = Object.create( THREE.NodeInput.prototype );
THREE.NodeBlend.prototype.constructor = THREE.NodeBlend;

THREE.NodeBlend.prototype.generate = function( material, shader, output ) {

    var a = this.a.build( material, shader, output );
    var b = this.b.build( material, shader, output );

    switch(this.mode)
    {
        case 'multiply':

            return this.format( '(' + a + '*' + b + ')', this.a.type, output);

            break;
    }

    return a;

};

.generate()๋Š” ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๋Šฅ ์†์‹ค ์—†์ด ๋‘˜ ์ด์ƒ์˜ ์ž…๋ ฅ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๊ณ„์‚ฐ ์ฝ”๋“œ๋Š” ์บ์‹œ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ํฌ์ธํ„ฐ๋‚˜ ์ƒ์ˆ˜๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค...

์ปดํŒŒ์ผ์€ ๊ผญ์ง“์  ๋ฐ ์กฐ๊ฐ ์ฝ”๋“œ์— ๋Œ€ํ•ด build()์—์„œ ์ „ํŒŒํ•˜์—ฌ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋‹น์‹ ์„ ํ˜‘๋ ฅ์ž๋กœ ๋„ฃ์–ด๋„ ๋ ๊นŒ์š”? ์–ด๋–ค ์‹์œผ๋กœ๋“  ์ฝ”๋“œ๋ฅผ ํŽธ์ง‘ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ €๋„ ๊ฐ™์ด ์ž‘์—…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋‹น์‹ ์„ ํ˜‘๋ ฅ์ž๋กœ ๋„ฃ์–ด๋„ ๋ ๊นŒ์š”? ์–ด๋–ค ์‹์œผ๋กœ๋“  ์ฝ”๋“œ๋ฅผ ํŽธ์ง‘ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ €๋„ ๊ฐ™์ด ์ž‘์—…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”! ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์Šน์ธํ•  ์ˆ˜ ์žˆ๋„๋ก PR์„ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ๋ Œ๋” ๊ฐ„์— ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋…ธ๋“œ ๋ฐ ์žฌ๋ฃŒ ์ •์˜ ์„ธํŠธ๋ฅผ ์ •์˜ํ•˜๋ ค๋Š” ๋‚ด ๋ถ€ ํ”„๋กœ์ ํŠธ์— ๊ท€ํ•˜( @mrdoob , @WestLangley ๋ฐ @tschw ํฌํ•จ)๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑํ•œ ์ด ์…ฐ์ด๋” ๊ทธ๋ž˜ํ”„ ์‹œ์Šคํ…œ์— ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

์กฐ๋ช…์ด ํ•˜๋‚˜์˜ LightNode๊ฐ€ ๋˜์—ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค. ์ œ ๊ด€์‹ฌ์‚ฌ๋Š” ์ด๋ฏธ Three.JS์šฉ์œผ๋กœ ๊ฐœ๋ฐœ๋œ ์ฝ”๋“œ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(3) UV๋Š” ์žฌ๋ฃŒ์— ์˜ํ•ด ํ•ด๊ฒฐ๋˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ฐธ์กฐ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  NodeTexture๊ฐ€ ์‹ค์ œ๋กœ ๋…ธ๋“œ ์ž…๋ ฅ์„ ๋ฐ›์•„ ์ ˆ์ฐจ์ ์œผ๋กœ ์ƒ์„ฑ๋œ UV๋ฅผ ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

UV๋ฅผ vec2๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

(5) NodeOp์— ์ถ”๊ฐ€๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž„์˜์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” NodeFunction์„ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค(๋˜๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ณ‘ํ•ฉ๋  ์ˆ˜๋„ ์žˆ์Œ).

์ด๊ฒƒ์€ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ BlendNode์šฉ.

(6) ์žฅํ™ฉํ•œ NodeNormal, NodeTransform, NormalMap ๋“ฑ์˜ ๊ฐœ๋ณ„ ํด๋ž˜์Šค๋ฅผ ๋ชจ๋‘ ์—†์• ๊ณ  ์žฌ๋ฃŒ์— ์˜ํ•ด ์ ์ ˆํ•˜๊ฒŒ ํ•ด์„๋˜๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ NodeReference๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ƒ์„ฑ์ž๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. NodeReference๋Š” ์…ฐ์ด๋”์—์„œ ๊ณ„์‚ฐ๋œ ๊ฐ’๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์œ ๋‹ˆํผ, ๊ฐ€๋ณ€์„ฑ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ƒ๊ฐ์—์„œ MaterialNode๋Š” Phong ๋ฐ Physical ์žฌ์งˆ์˜ ๊ธฐ๋ฐ˜์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

(7) NodeEnvironment์™€ NodeCube์˜ ์ฐจ์ด์ ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. NodeEnvironment๊ฐ€ ๋ถˆ์™„์ „ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ์•„์ง๋„ ์ด ๋…ธ๋“œ๋ฅผ ์™„์„ฑํ•  ์ˆ˜ ์—†๋‹ค.

(8) NodePhong์ด NodeMaterial์—์„œ ํŒŒ์ƒ๋˜์ง€ ์•Š์€ ๊ฒƒ์€ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. NodeMaterial์ด ShaderMaterial์—์„œ ํŒŒ์ƒ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ. ShaderMaterial, GraphMaterial(๋˜๋Š” NodeGraphMaterial)์—์„œ ์ง์ ‘ ํŒŒ์ƒ๋ฌผ์„ ํ˜ธ์ถœํ•œ ๊ฒƒ์ด ๋” ์ดํ•ด๊ฐ€ ๋˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ํ•จ๊ป˜ ๊ทธ๋ž˜ํ”„๋ฅผ ํ˜•์„ฑํ•˜๊ณ  ๊ฐœ๋ณ„ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ์žฌ๋ฃŒ๊ฐ€ ๋˜๋Š” ๊ทธ๋ž˜ํ”„์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

NodeMaterial์€ ๋ฃจํŠธ ๋…ธ๋“œ ๋จธํ‹ฐ๋ฆฌ์–ผ์ด ๋  ๊ฒƒ์ด๋ฉฐ, ๊ผญ์ง“์ ๊ณผ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ์œ„ํ•œ ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. NodePhong์€ hibrid์ด๊ณ  NodePhongMaterial์€ ํ”„๋ก์‹œ ํด๋ž˜์Šค์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(9) ์ข€ ๋” ๋‹ค์–‘ํ•œ ์šฉ์–ด๋ฅผ ์ œ์•ˆํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ MaterialNode๋ผ๊ณ  ํ•˜๊ณ  ์ด ๋…ธ๋“œ์—์„œ PhongMaterialNode๋ฅผ ํŒŒ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ValueNode์—์„œ ํŒŒ์ƒ๋œ Vector3Node, FloatNode ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ์ผ์ •ํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ ๊ฐ’๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 3๊ฐœ์˜ FloatNode๋ฅผ Vector3Node๋กœ ํŒŒ์ดํ”„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ 10๊ฐœ ์ •๋„๊ฐ€ ์•„๋‹Œ ์ด ํ•œ ์ค„ ์ •๋„ ๊ฐ๊ฐ์„ ์„ ์–ธํ•˜๋Š” ๋„์šฐ๋ฏธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ž˜ ๋“ค๋ฆฐ๋‹ค.

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

์ด๊ฒƒ์€ ๋ผ์ดํŠธ๋งต ๋˜๋Š” ๊ฐ€๋Šฅํ•œ LightNode์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ผ์ดํŠธ๋งต ๋˜๋Š” ๊ฐ€๋Šฅํ•œ LightNode์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฐ€๋Šฅํ•œ ๋ผ์ดํŠธ๋งต์˜ ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ UV๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. :)

@bhouston ์˜ค๋Š˜ ์ด ํŒŒ์ผ์—์„œ ๋ช‡ ๊ฐ€์ง€ ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ํ•  ์ผ์ด ๋งŽ์Šต๋‹ˆ๋‹ค.
https://github.com/sunag/sea3d/blob/gh-pages/Labs/Three.JS-NodeMaterial/three.node.js

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๋งŒ๋“ค๊ณ  ์žˆ๋Š” ๋†€์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ์˜ˆ์ˆ : ํ…์Šค์ฒ˜์™€ ๋ฒ„ํŠผ์€ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์ด๋ฉฐ ํฌ๋กฌ์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

http://sea3d.poonya.com/flow/

๋†€๋ผ์šด, ๋ฌผ๊ฑด! ์ด๋Ÿฐ ์„ธ์ƒ์—! ๊ทธ๊ฒƒ์€ ์•„๋ฆ„๋‹ค์šด.

๋‚˜๋„ ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ณต๊ณต PR์ด๋‚˜ ๋ญ”๊ฐ€์š”?

์—ฌ๊ธฐ์„œ Sea3D ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ๊ณ„์‹œ์ฃ ?

https://github.com/sunag/sea3d/tree/gh-pages/Labs/Three.JS-NodeMaterial

๊ทธ๋ž˜์„œ ๊ทธ๋ƒฅ ํฌํฌํ•˜๊ณ  ๊ธฐ์—ฌ๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? PR์„ ์ˆ˜๋ฝํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ํšจ๊ณผ์ ์œผ๋กœ ํ˜‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋ฌป์ง€ ์•Š์•˜์ง€๋งŒ @mrdoob์€ ์•„๋งˆ๋„ (?) ThreeJS ํ”„๋กœ์ ํŠธ ์ž์ฒด์—์„œ ์ด๊ฒƒ์„ ๊ฐ–๊ณ  ์‹ถ์–ดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ!

๊ทธ๋ž˜์„œ ๊ทธ๋ƒฅ ํฌํฌํ•˜๊ณ  ๊ธฐ์—ฌ๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? PR์„ ์ˆ˜๋ฝํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ํšจ๊ณผ์ ์œผ๋กœ ํ˜‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌผ๋ก  ๋‹น์‹ ์˜ ๋„์›€์ด ๊ต‰์žฅํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ๋‹น์‹ ์ด ์ œ์•ˆํ•œ ๋Œ€๋กœ ํฌํ™”, ๋…ธ์ด์ฆˆ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๋…ธ๋“œ ์œ ํ˜•์„ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ Sea3D ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ๊ณ„์‹œ์ฃ ?

์˜ˆ๋ฅผ ๋“ค์–ด Three.JS์— ๋Œ€ํ•œ PR์„ ๋งŒ๋“ค ๋•Œ ์ด ๋ชจ๋“  ๊ฒƒ์ด ์ •์˜๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@mrdoob ์žฌ๋ฃŒ ์ด๋ฆ„, THREE.MaterialNode ๋˜๋Š” THREE.NodeMaterial์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

์ผ์ข…์˜ ๋จธํ‹ฐ๋ฆฌ์–ผ์ด๋ฏ€๋กœ THREE.NodeMaterial ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์œ„๋กœ. ๋‚˜๋Š” PR์— ๊ฐ€๊น๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?
https://github.com/sunag/sea3d/commit/55cf70aea38b2b72110abf96f7b96924dad81c54

ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์ด ํ๋ธŒ๋งต์„ ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ๋ฐ ๊ธฐํƒ€ ํ…์Šค์ฒ˜๋กœ ๋“œ๋ž˜๊ทธํ•˜์‹ญ์‹œ์˜ค.
https://raw.githubusercontent.com/mrdoob/three.js/master/examples/textures/skyboxsun25degtest.png

http://sea3d.poonya.com/flow/

๋ฆผ ์…ฐ์ด๋” ์˜ˆ์ œ
flow-rimshader-example

์˜์—ญ ๋ฐ˜์‚ฌ ์˜ˆ
flow-areareflection

๋„ˆ๋ฌด ๋ฉ‹์ ธ์š” @sunag!

@buston ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! R74๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

๋งค์šฐ ์ธ์ƒ์ ์ธ ์ž‘ํ’ˆ์ž…๋‹ˆ๋‹ค! ์…ฐ์ด๋”ํฌ์ง€๊ฐ€ ์ƒ๊ฐ

์ง€๊ธˆ๊นŒ์ง€ ์•„์ฃผ ์ž˜ํ–ˆ์Šต๋‹ˆ๋‹ค!

@sunag ์•ฝ๊ฐ„์˜ ์ž‘์—…์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋„์›€์ด ๋˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. R74 ์…ฐ์ด๋” ์ฝ”๋“œ์˜ ํฐ ๊ตฌ์กฐ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋Œ€๋ถ€๋ถ„ ์ œ ์ž˜๋ชป์ž…๋‹ˆ๋‹ค. :)

@GGAlanSmithee ๋˜ํ•œ UE4๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค: https://docs.unrealengine.com/latest/INT/Engine/Rendering/Materials/ExpressionReference/index.html

์•„๋ฆ„๋‹ค์šด ๋‚จ์ž์™€ ํ•จ๊ป˜ ๋…ธ๋Š” ์žฌ๋ฏธ: Blender3D ๋…ธ๋“œ ํŽธ์ง‘๊ธฐ์— ์˜๊ฐ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธ”๋ Œ๋”์˜ ๋…ธ๋“œ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด PBR์— ๋Œ€ํ•œ ํ›Œ๋ฅญํ•œ ๋น„๋””์˜ค๊ฐ€ ์žˆ์œผ๋ฉฐ ์ฒ˜์Œ๋ถ€ํ„ฐ PBR์„ ๋งŒ๋“œ๋Š” ๋ฐ ๊ฐ€์žฅ ์œ ์šฉํ•œ ๋…ธ๋“œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

https://www.youtube.com/playlist?list=PLlH00768JwqG4__RRtKACofTztc0Owys8

์•ฝ๊ฐ„์˜ ์ž‘์—…์ด ํ•„์š”ํ•˜์ง€๋งŒ R74 ์…ฐ์ด๋” ์ฝ”๋“œ์˜ ํฐ ๊ตฌ์กฐ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋Œ€๋ถ€๋ถ„ ์ œ ์ž˜๋ชป์ž…๋‹ˆ๋‹ค. :)

@buston ์™€์šฐ. ์ƒˆ๋กœ์šด r74 ๋ณ€๊ฒฝ์œผ๋กœ ํ›จ์”ฌ ๋” ๊นจ๋—ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. StandardMaterial์ด ์•„์ง ๋ˆ„๋ฝ๋œ ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์„ ์™„๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์— ๊ฒŒ์‹œํ•˜๋Š” ๋ชจ๋“  ๋ฌธ์ œ :) ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค
https://github.com/sunag/sea3d/commit/d544ad7993272348f8bbea2337cdceb52159a6a8

์šฐ๋ฆฌ๊ฐ€ ์•„์ง ๋†“์น˜๊ณ  ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ๊ฒƒ์€ ๊ตด์ ˆ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Cubemap RTT ๋Œ€์‹  ๋ Œ๋”๋ง ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ •๋ง ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ํ›จ์”ฌ ๋” ํšจ์œจ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@GGAlanSmithee ์ €๋Š” ShaderFX์— ๋Œ€ํ•ด ์ œ๊ฐ€ ์—ด๋ ฌํ•œ ํŒฌ์ด๋ผ๊ณ  ์–ธ๊ธ‰ํ•œ ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. Shader Forge์™€ UE4๋„ ํ›Œ๋ฅญํ•œ ์ฐธ๊ณ  ์ž๋ฃŒ์ž…๋‹ˆ๋‹ค.๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@richardanaya ๋†€๋ผ์šด ๋™์˜์ƒ. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@mrdoob ์ด ํŒŒ์ผ์„ ์–ด๋–ค ํด๋”์— ๋„ฃ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๊นŒ? three.js ๋ฃจํŠธ( src/materials/node ) ๋˜๋Š” ์˜ˆ์ œ์—์„œ ?
https://github.com/sunag/sea3d/tree/gh-pages/Labs/Three.JS-NodeMaterial/node

๋‚˜๋Š” ์ด๊ฒƒ์„ "Material Graph"๋ผ๊ณ  ๋ถ€๋ฅด๊ฑฐ๋‚˜ ์—ญ๋œ ThreeJS ์Šคํƒ€์ผ์ธ "GraphMaterial"์ด๋ผ๊ณ  ๋ถ€๋ฅผ ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” "๋…ธ๋“œ"๋ผ๋Š” ์šฉ์–ด๋ฅผ ๊ณ ์ง‘ํ•œ๋‹ค๋ฉด "NodeBasedMaterial"์ด๋ผ๊ณ  ๋ถ€๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋‘ ์ด๋ฆ„์€ ๋จธํ‹ฐ๋ฆฌ์–ผ ์ด ๋…ธ๋“œ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๋…ธ๋“œ๋ฅผ

๋‚˜๋Š” ์ด๊ฒƒ์„ "Material Graph"๋ผ๊ณ  ๋ถ€๋ฅด๊ฑฐ๋‚˜ ์—ญ๋œ ThreeJS ์Šคํƒ€์ผ์ธ "GraphMaterial"์ด๋ผ๊ณ  ๋ถ€๋ฅผ ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” "๋…ธ๋“œ"๋ผ๋Š” ์šฉ์–ด๋ฅผ ๊ณ ์ง‘ํ•œ๋‹ค๋ฉด "NodeBasedMaterial"์ด๋ผ๊ณ  ๋ถ€๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋‘ ์ด๋ฆ„์€ ๋จธํ‹ฐ๋ฆฌ์–ผ์ด ๋…ธ๋“œ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๋…ธ๋“œ๋ฅผ ํฌํ•จํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ถ„๋ช…ํžˆ ํ•ฉ๋‹ˆ๋‹ค.

์ €์—๊ฒŒ๋Š” ๋‘˜ ๋‹ค ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” @mrdoob ์—๊ฒŒ ๊ฒฐ์ •์„

BTW @sunag ๊ฐ€๋Šฅํ•˜๋ฉด ๊ตด์ ˆ์„ ์œ„ํ•ด ํ๋ธŒ๋งต์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ๊ณ  ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ •ํ™•ํ•œ ๋ฐ˜์‚ฌ๋ฅผ ์œ„ํ•ด์„œ๋Š” RTT ์ž๋ฃŒ๋„ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. 128^2 ๋˜๋Š” 256^2์—์„œ ๋น ๋ฅธ ๋ Œ๋”๋ง์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

BTW @sunag ๊ฐ€๋Šฅํ•˜๋ฉด ๊ตด์ ˆ์„ ์œ„ํ•ด ํ๋ธŒ๋งต์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ๊ณ  ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ •ํ™•ํ•œ ๋ฐ˜์‚ฌ๋ฅผ ์œ„ํ•ด์„œ๋Š” RTT ์ž๋ฃŒ๋„ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. 128^2 ๋˜๋Š” 256^2์—์„œ ๋น ๋ฅธ ๋ Œ๋”๋ง์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ๋‘˜ ๋‹ค ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ x ์ •ํ™•๋„ ๊ฐ„์˜ ํ† ๋ก ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ํ‰๋ฉด ๊ตด์ ˆ(์œ ๋ฆฌ, ๋ฌผ)์˜ ๊ฒฝ์šฐ CubeMap ๋Œ€์‹  ๋ฒ„ํผ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค(๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ).

NodeStandard๋ฅผ ๋ถ„์„ํ•˜๋ ค๋ฉด CubeMap์„ ๋“œ๋ž˜๊ทธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
https://raw.githubusercontent.com/mrdoob/three.js/master/examples/textures/skyboxsun25degtest.png
http://sea3d.poonya.com/flow/

์›์ฒœ:
https://github.com/sunag/sea3d/blob/gh-pages/Labs/Three.JS-NodeMaterial/node/NodeStandard.js

@mrdoob ์ด ํŒŒ์ผ์„ ์–ด๋–ค ํด๋”์— ๋„ฃ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๊นŒ? three.js ๋ฃจํŠธ( src/materials/node ) ๋˜๋Š” ์˜ˆ์ œ์—์„œ ?

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ์˜ˆ์ œ์— ๋„ฃ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž˜ ์ •์˜๋˜๋ฉด ๋‚˜์ค‘์— src๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜Š

๋‚˜๋Š” ์ด๊ฒƒ์„ "Material Graph"๋ผ๊ณ  ๋ถ€๋ฅด๊ฑฐ๋‚˜ ์—ญ๋œ ThreeJS ์Šคํƒ€์ผ์ธ "GraphMaterial"์ด๋ผ๊ณ  ๋ถ€๋ฅผ ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” "๋…ธ๋“œ"๋ผ๋Š” ์šฉ์–ด๋ฅผ ๊ณ ์ง‘ํ•œ๋‹ค๋ฉด "NodeBasedMaterial"์ด๋ผ๊ณ  ๋ถ€๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ €์—๊ฒŒ๋Š” ๋‘˜ ๋‹ค ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” @mrdoob ์—๊ฒŒ ๊ฒฐ์ •์„

๋‚˜๋Š” ์ด๋ฏธ NodeMaterial ๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค... ์•„๋งˆ๋„ NodesMaterial ? NodeGraphMaterial ? @WestLangley ์ œ์•ˆ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ฒ ์ง€๋งŒ... NodeColor , NodeFloat , NodeTexture , ... to ColorNode , FloatNode , TextureNode

http://sea3d.poonya.dev/flow/

๐Ÿ˜ ๋กœ๋”ฉ์ด ์•ˆ๋˜๋„ค์š”.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ์˜ˆ์ œ์— ๋„ฃ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž˜ ์ •์˜๋˜๋ฉด ๋‚˜์ค‘์— src :blush๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@mrdoob ์ž˜ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ด๋ฆ„์„ ๋ฐ”๊ฟ€ ๊ฒƒ์ž…๋‹ˆ๋‹ค ... NodeColor, NodeFloat, NodeTexture, ... ColorNode, FloatNode, TextureNode

๊ทธ๋•Œ ์ „๋‹ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋กœ์ปฌ url :blush: ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.
http://sea3d.poonya.com/flow/

@WestLangley ์ œ์•ˆ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

THREE.FlowMaterial ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์„ ํƒ์€ THREE.CustomMaterial ์ž…๋‹ˆ๋‹ค.

์™„์ „ํžˆ ๋ฌด์ž‘์œ„ ๋ฐฉ๊ด€์ž๋กœ์„œ. NodeMaterial์€ Blender3D์—์„œ ๊ทธ๋ ‡๊ฒŒ ๋ถ€๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์ง๊ด€์ ์œผ๋กœ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

@mrdoob ์ด ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

NodeMaterial ๊ทธ๋Ÿผ ๐Ÿ˜

์ด ํ”„๋กœ์ ํŠธ๋Š” ๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค! ๋ฐฉ๊ธˆ Twitter์—์„œ ๋ฐ๋ชจ๋ฅผ ๋ณด์•˜๋Š”๋ฐ ๋งค์šฐ ์ธ์ƒ์ ์ž…๋‹ˆ๋‹ค.

๋…ธ๋“œ๊ฐ€ ์“ฐ๋ฆฌ ์ฝ”์–ด์— ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์ด์–ด์•ผ ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋งค์šฐ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค. ์ €๋„ ShaderFrog.com์šฉ Three.js ์…ฐ์ด๋” ๊ทธ๋ž˜ํ”„ ํŽธ์ง‘๊ธฐ(์•„์ง ์ถœ์‹œ๋˜์ง€ ์•Š์Œ)๋ฅผ ๊ตฌ์ถ• ์ค‘์ด๋ฉฐ GLSL ์ฝ”๋“œ์™€ ๊ท ์ผํ•œ ์ด๋ฆ„๊ณผ ๊ฐ™์€ ํ•„์š”ํ•œ ๋ชจ๋“  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ž‘์€ JSON ํŒŒ์ผ๋กœ ๋‚ด๋ณด๋‚ด๊ณ  ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ด ํ•ด๊ฒฐ์ฑ…์ž…๋‹ˆ๋‹ค. ์™ธ๋ถ€ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ

screen shot 2015-11-20 at 12 05 26 pm

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

์ด NodeMaterial ์œ ํ˜•์ด Three์˜ ์ฝ”์–ด ์™ธ๋ถ€์—์„œ๋„ ์™„์ „ํžˆ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ž์‹ ์˜ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก RawShaderMaterial๋งŒ ์ถœ๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

@DelvarWorld ์•ˆ๋…•ํ•˜์„ธ์š”. ์ด๋ก ์ƒ์œผ๋กœ๋Š” ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์›์‹œ์—์„œ ์ข‹์€ ์…ฐ์ด๋”๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ด๋ฆ…๋‹ˆ๋‹ค. ๋‹น์‹œ์—๋Š” ์ดˆ๊ธฐ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Three.JS์˜ Skin/Morph ๋ฐ ๊ธฐํƒ€ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ์™€์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์‚ฌ์†Œํ•œ ๋ฌธ์ œ๋ฅผ ์–ธ๊ธ‰ํ•˜๋ ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
"Flow"์—์„œ ๋…ธ๋“œ๋ฅผ ์„œ๋กœ ์œ„๋กœ ๋Œ ๋•Œ ์ปค๋„ฅํ„ฐ๊ฐ€ ์ตœ์ƒ์œ„ ์ˆ˜์ค€์œผ๋กœ ํŒ์—…๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์•„๋งˆ๋„ ์ด ๋ฌธ์ œ๋Š” ๋ ˆ์ด์–ด๋‚˜ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‘ ์ ‘๊ทผ ๋ฐฉ์‹์„ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ๋‹ค์ค‘ ๋ ˆ์ด์–ด ์…ฐ์ด๋”์— ๊ด€์‹ฌ์ด ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ตœ์ข… ๊ฒฐ๊ณผ์— ๊ธฐ์—ฌํ•˜๋Š” ์—ฌ๋Ÿฌ BSDF๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์…ฐ์ด๋”ฉ ๋ชจ๋ธ์„ ๋” ๋ถ„๋ฆฌํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ @sunag ์˜ ํ˜„์žฌ ๋””์ž์ธ์—์„œ ๋งค์šฐ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. Standard ๋˜๋Š” Phong ์žฌ์งˆ์„ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜์•„๊ฐ€์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐ ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ ์ง„์ ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ @sunag ๊ฐ€ ๊ฐ€์ง„ ๊ฒƒ์€ ์ข‹์€ ์‹œ์ž‘์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ตฌ์ฒดํ™”๋œ ๋‹ต๋ณ€์ด ์•„๋‹ˆ์ง€๋งŒ ์–ผ๋งˆ ์ „์— ๋‚˜๋Š” ๊ท ์ผํ•œ ์ด๋ฆ„, ์œ ํ˜•, Three.js์˜ ์œ ํ˜• ๋“ฑ๊ณผ ๊ฐ™์€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ์ด์‹ ๊ฐ€๋Šฅํ•œ ์…ฐ์ด๋” ํ˜•์‹์— ๋Œ€ํ•œ ๋Œ€๋žต์ ์ธ ์ œ์•ˆ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com /DelvarWorld/ShaderFrog-Runtime/blob/master/THREE_SHADER_FORMAT.md

์‹ค์ œ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋ชจ๋“  ์…ฐ์ด๋”๋Š” ์›์‹œ ์…ฐ์ด๋” ์†Œ์Šค ์ฝ”๋“œ(GPU๊ฐ€ ์ปดํŒŒ์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—)์™€ ํŽธ์˜๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ๊ฐ’์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ๋‹ˆํผ์ž…๋‹ˆ๋‹ค. ์ด ๋Œ€๋žต์ ์ธ ์ œ์•ˆ์—๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์…ฐ์ด๋”๋ฅผ ๊ตฌ์ถ•ํ•œ๋‹ค๋Š” ๊ฐœ๋…์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉฐ GLSL ๋ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์ „๋‹ฌ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ RawShaderMaterial ์— ๋„ฃ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Three.js์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

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

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

@DelvarWorld ์ €๋Š” ํ‘œ์ค€ํ™”๋œ ์‰์ด๋” ๊ทธ๋ž˜ํ”„ ๋…ธ๋“œ ์„ธํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/OpenMaterialGraph/OpenMaterialGraph

๋…ธ๋“œ ์‚ฌ์–‘์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

https://github.com/OpenMaterialGraph/OpenMaterialGraph/tree/master/spec/nodes

๋ฏธ๋‹ˆ๋ฉ€๋ฆฌ์ŠคํŠธ BSDF ์‚ฌ์–‘์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

https://github.com/OpenMaterialGraph/OpenMaterialGraph/tree/master/spec/bsdfs

์ด๊ฒƒ์€ ๋ฌผ๋ฆฌ์  ๊ธฐ๋ฐ˜ ๋ Œ๋”๋ง์„ ์ง€ํ–ฅํ•ฉ๋‹ˆ๋‹ค.

์ œ ๋Š๋‚Œ์€ Raw ์…ฐ์ด๋”๋ณด๋‹ค ๋†’์€ ์ˆ˜์ค€์ด์ง€๋งŒ Phong ์…ฐ์ด๋”๋ณด๋‹ค ๋‚ฎ์€ ์ˆ˜์ค€์ธ ThreeJS์šฉ ์…ฐ์ด๋”์˜ ์…ธ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ธฐ๋ณธ ์…ฐ์ด๋”๋Š” ๋ชจํ”„ ํƒ€๊ฒŸ, ๋ผˆ๋Œ€ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ํŠน์ • ์กฐ๋ช… ๊ตฌ์„ฑํ‘œ ์…ฐ์ด๋”(Basic, Lambert, Phong, Standard)๊ฐ€ ํ•ด๋‹น ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๋ฌต์‹œ์  โ€‹โ€‹ํ…œํ”Œ๋ฆฟ ์…ฐ์ด๋”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(๊ฐ ์…ฐ์ด๋”์— ๋™์ผํ•œ ๋‚ด์šฉ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค) -- ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ์–ด๋””์— ์—ฐ๊ฒฐํ•ด์•ผ ํ•˜๋Š”์ง€ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์กฐ๋ช… ๊ตฌ์„ฑํ‘œ(ํ, ๋žจ๋ฒ„ํŠธ, ๊ธฐ๋ณธ ๋˜๋Š” ๋‹ค์ค‘ ๋ ˆ์ด์–ด)๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๊ณ  ์ผ๋ฐ˜ ๋…ธ๋“œ์ธ ์กฐ๋ช… ๊ตฌ์„ฑํ‘œ์— ์†์„ฑ์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@bhouston ์˜ค ๋ฉ‹์ง€๋„ค์š”. ์ค‘๋ณต๋˜๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์ด ๋งŽ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๊ฐ’, ํ‘œ์‹œ ์ด๋ฆ„, ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์„ค๋ช… ๋“ฑ ๋‹น์‹ ์ด ์ œ์•ˆํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ํ˜•์‹์„ ๋”ํ•˜์‹ญ์‹œ์˜ค.

ํ˜•์‹ ์…ฐ์ด๋” ํ˜•์‹์€ ๋งŽ์€ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ lib์™€ ํ•จ๊ป˜ ์‚ด์•„์•ผ ํ•˜๋ฏ€๋กœ ๋” ์‰ฝ๊ฒŒ ๋ฐœ์ „ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. three.js๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ๊ทธ๋Ÿฐ ๊ฒƒ์ด ์ด๋ฏธ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด ํŽธ์ง‘์ž์—๊ฒŒ ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

*ํŽธ์ง‘ ์•„๋งˆ three.js์— ์‚ฌ์–‘์ด ์žˆ์œผ๋ฉด ๋‹ค๋ฅธ ๋ Œ๋”๋ง ํŒŒ์ดํ”„์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋ชฉ์ ์„ ๋‹ฌ์„ฑํ•˜์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Three๋Š” ์ž์ฒด ์…ฐ์ด๋”๋ฅผ ์ž์ฒด ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์ถ•ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ ๋‹น์žฅ์€ Three์˜ ์ฝ”์–ด๋ณด๋‹ค ๋‚˜์—๊ฒŒ ๋” ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

NodeMaterial(*Flow)์ด ์‹œ๊ฐ์  ์–ธ์–ด์ธ ๊ฒฝ์šฐ THREE.NodeGL.prototype.generate ๋‚ด์—์„œ ์ˆ˜์ •ํ•˜๋ฉด ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋™์ผํ•œ ์žฌ์งˆ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. NodeBuilder๋Š” ์ด์— ๋Œ€ํ•œ ๋ฌธ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋…ธ๋“œ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ค‘๊ฐœ์ž์ž…๋‹ˆ๋‹ค.

NodeMaterial "raw"์˜ ์˜ˆ๋ฅผ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์—ฌ๋Ÿฌ ๋ฒ„๊ทธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/sunag/sea3d/blob/gh-pages/Labs/Three.JS-NodeMaterial/index.html#L179
https://github.com/sunag/sea3d/blob/gh-pages/Labs/Three.JS-NodeMaterial/node/NodeMaterial.js#L9

์ž…์ž๊ฐ€ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ด๊ฒƒ์„ ๋ฐœ์ „์‹œํ‚ค๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. NodePass for Multi-Pass ๋ฐ NodeMaterialD PR ํ›„ ๋ฉฐ์น  ์•ˆ์— ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜์š”?

๋Ÿฐํƒ€์ž„ ์…ฐ์ด๋” ๋Œ€์‹  THREE.ShaderFrogLoader๋ฅผ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

"Flow"์—์„œ ๋…ธ๋“œ๋ฅผ ์„œ๋กœ ์œ„๋กœ ๋Œ ๋•Œ ์ปค๋„ฅํ„ฐ๊ฐ€ ์ตœ์ƒ์œ„ ์ˆ˜์ค€์œผ๋กœ ํŒ์—…๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@MasterJames ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‚˜๋Š” ๊ทธ๊ฒƒ์„๋ณด๊ณ  ๊ฑฐ ์•ผ.

:+1:

์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์ฃผ ๋งˆ๋ฌด๋ฆฌ ํ•˜์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. :๋•€_๋ฏธ์†Œ:
http://sunag.github.io/sea3d/Labs/Three.JS-NodeMaterial/webgl_materials_nodes.html

์ƒ๊ฐ?

@์ˆ˜๋‚™ +1 :- )

+1!

์ •๋ง ๋Œ€๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ๋ฆฐ ๋ณ€์œ„๋ณด๋‹ค๋Š” ์‹๋ฌผ + ๋ฒฝ ํ…์Šค์ฒ˜๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. :) ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ์•„๋ฆ„๋‹ต์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ๋ฆฐ ๋ณ€์œ„๋ณด๋‹ค๋Š” ์‹๋ฌผ + ๋ฒฝ ํ…์Šค์ฒ˜๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

'๋ ˆ์ด์–ด' ์˜ˆ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์šฐ๋ฆฌ๋ฅผ ์œ„ํ•ด ๋” ๋งŽ์€ ์˜ˆ๋ฅผ ๊ฒŒ์‹œ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค

GPU ์†Œํ”„ํŠธ ๋ฐ”๋””
soft-body

๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ์˜ ๋น„๊ต๋ฅผ ์œ„ํ•ด Shader Frog ๊ทธ๋ž˜ํ”„ ํŽธ์ง‘๊ธฐ๊ฐ€ ์ด์ œ ์ž‘๋™ ์ค‘์ด๋ฉฐ "ํƒ€์ด์–ด ๊ฑท์–ด์ฐจ๊ธฐ" ๋‹จ๊ณ„์— ์žˆ์Šต๋‹ˆ๋‹ค. Three.js ์ฝ”์–ด๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์ ์„ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

screen shot 2015-12-08 at 1 48 24 pm

... ๋ฐ˜์‚ฌ ์…ฐ์ด๋”๋กœ ๊ณฑํ•ฉ๋‹ˆ๋‹ค ...

screen shot 2015-12-08 at 1 49 39 pm

...์…ฐ์ด๋” ๊ทธ๋ž˜ํ”„ ์‚ฌ์šฉ...

screen shot 2015-12-08 at 1 50 40 pm

๊ทธ๋ฆฌ๊ณ  ํƒ€๋‹ค! ๋ฐ˜์‚ฌ ๋ฆผ ์…ฐ์ด๋” .

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค๋ฅธ ์…ฐ์ด๋” ๋“ฑ์„

screen shot 2015-12-08 at 1 56 03 pm

์ด ํ”„๋กœ์„ธ์Šค์— ํ•„์š”ํ•œ ์œ ์ผํ•œ "๋…ธ๋“œ ์œ ํ˜•"์€ GLSL๊ณผ ๊ฑฐ์˜ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ธ ๋‹ค์ค‘ ๋…ธ๋“œ(ShaderFrog์— ๋‹ค๋ฅธ ๋…ธ๋“œ๊ฐ€ ์žˆ์Œ)์ž…๋‹ˆ๋‹ค. ShaderFrog๋Š” ๋ชจ๋“  ์…ฐ์ด๋”์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋…ธ๋“œ ์œ ํ˜•์ด ๋ฌดํ•œํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณ ๊ธ‰ ๊ธฐ์ˆ  ์ ‘๊ทผ โ€‹โ€‹๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด Three.js ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ๊ด€๊ณ„์—†์ด ์ด๋Ÿฌํ•œ ์กฐ์ž‘์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

ShaderFrog๋Š” ๋ฌด๋ฃŒ๋กœ Three.js์— ๋Œ€ํ•œ ์ตœ๊ณ  ์ˆ˜์ค€์˜ ๋‚ด๋ณด๋‚ด๊ธฐ ์ง€์›์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Three.js ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋‘ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Sea3D๋Š” ShaderFrog์™€ ๊ฐ™์€ ํƒ€์‚ฌ ์ œํ’ˆ์ž…๋‹ˆ๋‹ค. ํƒ€์‚ฌ ์ œํ’ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ Three์˜ ํ•ต์‹ฌ์— ๋„ฃ๋Š” ๊ฒƒ์€ ๋ถˆ๊ณต์ •ํ•œ ์ด์ ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ ์ •์น˜์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@DelvarWorld ์ €๋Š” ๋…ธ๋“œ ๊ธฐ๋ฐ˜ ์…ฐ์ด๋” ๊ตฌ์„ฑ ์ถ”์ƒํ™”๋ฅผ ํƒ€์‚ฌ ํŠน์ • ๊ธฐ์ˆ ๋กœ ๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๋” ๋งŽ์€ ๊ฒฝ์Ÿ์ž๊ฐ€ ๋…ธ๋“œ ๊ธฐ๋ฐ˜ ์…ฐ์ด๋” ๊ธฐ์ˆ ์— ์ฐธ์—ฌํ•˜๊ณ  ์„œ๋กœ์˜ ์ž‘์—…์—์„œ ๋” ๋งŽ์€ ์ด์ (๋” ๋งŽ์€ ๋…ธ๋“œ, ์ตœ์ ํ™”๋œ ๊ตฌ์„ฑ ๋“ฑ)์˜ ์ด์ ์„ ๋ชจ๋‘ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ฎ์€ ์ˆ˜์ค€์€ ์•„๋‹ˆ์ง€๋งŒ ๋†’์€ ์ˆ˜์ค€(Blender 3D์™€ ๊ฐ™์€ ๋„๊ตฌ)์—์„œ ์…ฐ์ด๋”๋ฅผ ์ดํ•ดํ•˜๋Š” ์ €์™€ ๊ฐ™์€ ๊ทธ๋ž˜ํ”ฝ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋กœ์„œ ๋…ธ๋“œ ๊ธฐ๋ฐ˜ ์ถ”์ƒํ™”๋Š” 3D ๋ชจ๋ธ๋ง ์ง€์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์…ฐ์ด๋”์™€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด PBR์— ๋Œ€ํ•œ ๋…ธ๋“œ ์„ค์ •์„ ์ดํ•ดํ•˜์ง€๋งŒ GLSL๋กœ ์ž‘์„ฑํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์‹ ์˜ ๋„์›€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@DelvarWorld ์–ด๋ฉ”์ด์ง•. ๋‚˜๋Š” ์ƒˆ๋กœ์šด ํŽธ์ง‘์ž๋ฅผ ์‚ฌ๋ž‘ํ•œ๋‹ค.

@DelvarWorld +1 ์•„์ฃผ ์ข‹์•„์š”! : - )

๊ฐ์‚ฌ ํ•ด์š”! :)

๋…ธ๋“œ ๊ธฐ๋ฐ˜ ์…ฐ์ด๋” ๊ตฌ์„ฑ ์ถ”์ƒํ™”๋ฅผ ํƒ€์‚ฌ ํŠน์ • ๊ธฐ์ˆ ๋กœ ๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด PBR์— ๋Œ€ํ•œ ๋…ธ๋“œ ์„ค์ •์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

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

@DelvarWorld ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ดํ•ดํ•˜๋Š” ํ•œ ShaderFrog๋Š” ์—ฌ์ „ํžˆ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๊ณ„์† GraphMaterial์„ ๋Šฅ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GraphMaterial์˜ ์˜ˆ์ œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ํƒ€์‚ฌ ์†”๋ฃจ์…˜/์—๋””ํ„ฐ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ํ•„์š” ์—†์ด ์ž‘๋™ ๋ฐฉ์‹์˜ ๋‹จ์ˆœ์„ฑ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”ฝ ๊ฐœ๋ฐœ์ž๋กœ์„œ ์ €๋Š” ๋น ๋ฅด๊ฒŒ ๊ฐ๋™์„ ์ฃผ๋Š” ์žฌ๋ฃŒ๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด ThreeJS์˜ ์ ์ ˆํ•œ ๊ด€์‹ฌ์‚ฌ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

NodeMaterial๊ณผ Flow๋Š” ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ดˆ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Flow์™€ ShaderFrog๋Š” ๋‘˜ ๋‹ค ํ˜„์žฌ ๋น„๊ณต๊ฐœ ์†Œ์Šค์— ์žˆ๋Š” ํƒ€์‚ฌ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. (์ฃผ๋กœ ์•„ํ‹ฐ์ŠคํŠธ๋Š” ์ด์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.) otherside NodeMaterial์€ Three.JS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ ์˜คํ”ˆ ์†Œ์Šค ์…ฐ์ด๋” ํŽธ์ง‘๊ธฐ์ž…๋‹ˆ๋‹ค. ShaderFrog๊ฐ€ ์›ํ•˜๋Š” ๊ฒฝ์šฐ NodeMaterial์„ ๋„˜์–ด์„ค ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ @richardanaya ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. Flow๊ฐ€ ๋‹จ์ˆœํžˆ ๋จธํ‹ฐ๋ฆฌ์–ผ ์—๋””ํ„ฐ์ผ ํ•„์š”๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•ž์œผ๋กœ๋„ ํ‰์†Œ์ฒ˜๋Ÿผ ShaderFrog๊ฐ€ ํฌ๊ฒŒ ๊ฐœ์„ ๋˜๊ธฐ๋ฅผ ์ง„์‹ฌ์œผ๋กœ ๋ฐ”๋ž๋‹ˆ๋‹ค.

wip: ๊ฐ€์„ฑ ๋ณด๋กœ๋…ธ์ด
http://sunag.github.io/sea3d/Labs/Three.JS-NodeMaterial/webgl_materials_nodes.html
caustic

@sunag ์˜ค๋Š˜ ๋ฐค ์†Œ์Šค ์ฝ”๋“œ๋ฅผ

  • ํ•˜๋ฃจ๋นจ๋ฆฌ PR์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)
  • ํ‘œ์ค€ ์†์„ฑ(uv, uv2, normal, position ๋“ฑ)์ด ์•„๋‹Œ ์ž„์˜์˜ ์†์„ฑ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฉ‹์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์…ฐ์ด๋”๊ฐ€ ์ ‘์„  vec4, 2๊ฐœ ์ด์ƒ์˜ uv ๋ฐ ์—ฌ๋Ÿฌ ์ƒ‰์ƒ์˜ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์†์„ฑ. ๋”ฐ๋ผ์„œ ๋‚˜๋Š” needsPosition์„ ์š”์ฒญ๋œ ์†์„ฑ ๋ฐฐ์—ด ๋“ฑ์œผ๋กœ ์ผ๋ฐ˜ํ™”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ NodeMaterial, BRDF(Phong, Standard ๋“ฑ), ํ…์Šค์ฒ˜ ๋…ธ๋“œ(NodeCubeTexture, NodeTexture), ์ ‘๊ทผ์ž(?) ๋…ธ๋“œ(NodePosition, NodeNormal), ์ˆ˜ํ•™ ๋…ธ๋“œ(NodeOperator ๋“ฑ)๋กœ ๋…ธ๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ), ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋…ธ๋“œ(NodeSwitch, ...), ์ถ”๊ฐ€(?)(NodeVelocity, ...) ๋งŽ์€ ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • Projection, View ๋ฐ World ํ–‰๋ ฌ์— ๋Œ€ํ•œ ํ–‰๋ ฌ ์ ‘๊ทผ์ž๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋‹ค์Œ ์—ฐ์‚ฐ์ž ์ค‘ ์ผ๋ถ€๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. % ^ & << >> ~ |
  • ํด๋ž˜์Šค๊ฐ€ ๋„ˆ๋ฌด ์ž‘์„ ๋•Œ NodePhongMaterial์—์„œ ๊ฐ’์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ NodeMaterial๊ณผ ๊ฒฐํ•ฉ๋œ NodePhong ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋‚˜๋Š” ์—ฌ์ „ํžˆ ๊ทธ ์ด๋ฆ„์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์ง€๋งŒ GraphMaterial์€ ๋งŽ์ด ๋Š๋‚๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ๋” ๋งŽ์€ ์ž์—ฐ, ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ๊ณผ ํ•จ๊ป˜ ์‚ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)
  • ๋‚˜๋Š” NodeTimer -> NodeTime...์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  ์‹ถ์ง€๋งŒ ๋‹ค์‹œ ๊ฐœ์ธ ์ทจํ–ฅ์ž…๋‹ˆ๋‹ค.
  • NodeMath#, NodeOperator์—์„œ ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ๋งŽ์€ ๋ณ€์ˆ˜ ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜๋กœ ๊ฒฐํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. NodeViewPosition, NodeWorldPosition, NodeViewNormal, NodeTransformedNormal, NodeTransformedPosition, NodeProjectPosition...
  • NodeMath#, NodeOperator์— ๋Œ€ํ•œ ์„ ํƒ์  ์ธ์ˆ˜ ์ง‘ํ•ฉ์ด ๋ชฉ๋ก์ด ๋  ์ˆ˜ ์žˆ๋Š” ํ˜•์‹์œผ๋กœ ๋˜์–ด ๋“œ๋กญ๋‹ค์šด ์ƒ์ž๋ฅผ ์‰ฝ๊ฒŒ ์ฑ„์šธ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ํด๋ž˜์Šค์— ๋Œ€๋ฌธ์ž๋กœ ํ‘œ์‹œ๋œ ๋ฉค๋ฒ„์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹๋ณ„ํ•˜๊ธฐ๊ฐ€ ์กฐ๊ธˆ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ฝ”๋”ฉ์— ์—ฌ์ „ํžˆ ํŽธ๋ฆฌํ•œ ์ข‹์€ ์†”๋ฃจ์…˜์ด ์žˆ๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค์˜ ๊ตฌ์„ฑ์›์œผ๋กœ ์ •์˜ํ•œ ํ›„ ๋ชฉ๋ก์œผ๋กœ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ๋ชฉ๋ก์„ ์ถ”๊ฐ€ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
  • NodeTransformedNormal, NodeTransformedPosition์€ ์ฝ”๋“œ๋ฅผ ๋ณด์ง€ ์•Š๊ณ ๋Š” ๋ฌด์—‡์ธ์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์„ธ๊ณ„ ๊ณต๊ฐ„, ๋ณด๊ธฐ ๊ณต๊ฐ„, ๊ฐ์ฒด ๊ณต๊ฐ„์— ์žˆ์Šต๋‹ˆ๊นŒ? "๋ณ€ํ™˜๋œ"์€ ํ–‰๋ ฌ์„ ๊ณฑํ•œ ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š” ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ์šฉ์–ด์ž…๋‹ˆ๋‹ค. ์ด์ œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค....
  • NodeUV ๋ฐ NodeColor๊ฐ€ ๊ฐ๊ฐ 2 ๋ฐ 1 ์ฑ„๋„๋กœ ์ œํ•œ๋˜์ง€ ์•Š๊ณ  ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ•œ๋ฒˆ ์ €๋Š” ์ด๊ฒƒ๋“ค์ด ์ผ๋ฐ˜ํ™”๋˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ํŠน์ • ์ฑ„๋„ ์„ธํŠธ์— ํ•˜๋“œ ์ฝ”๋”ฉ๋˜๋Š” ๋Œ€์‹  ๋ฌธ์ž์—ด์ด๋‚˜ ์—ฌ๋Ÿฌ ์‚ฌ์ „ ์„ค์ • ์ค‘ ํ•˜๋‚˜๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋ณ€์ˆ˜์—๋Š” ์—ฌ์ „ํžˆ ์ „์šฉ ์ฝ”๋“œ ๊ฒฝ๋กœ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ์ด๋ฆ„์— ๋Œ€ํ•ด์„œ๋Š” ์ผ๋ฐ˜ ๊ฒฝ๋กœ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ํ”ผ๋“œ๋ฐฑ:

  • ํ•˜๋‚˜ ์ด์ƒ์˜ BRDF, ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‘ ๊ฐœ์˜ Standard BRDF๊ฐ€ ์žˆ๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ์‚ฌ์ด์—์„œ ์—๋„ˆ์ง€ ๋ณด์กด์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. PR์„ ๋ฐ›์œผ๋ฉด ์ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์‹œ์Šคํ…œ์„ ๋” ์ผ๋ฐ˜์ ์ด๊ณ  ๋” ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@buston ์™€์šฐ! ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์š”์ฒญ ์†์„ฑ, ํด๋” ๊ตฌ์„ฑ, NodeTime, NodePosition, NodeNormal, NodeView๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. +3 ์˜ˆ์ œ๋„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฐ์‚ฐ์ž์™€ ํ–‰๋ ฌ์—์„œ integer ๋ฐ matrix ๋ณ€ํ™˜๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด float / vectors#์—์„œ์™€ ๊ฐ™์ด ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•œ ์ž‘์—…์ด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.. :sweat_smile:

๋‚ด์ผ์€ ํ™๋ณด๋ฅผ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„์ง ๋ช‡ ๊ฐ€์ง€๋ฅผ ๊ฒ€ํ† ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@์ˆ˜๋‚™ :

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ฒ„๊ทธ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

addGui( 'metalnessA', roughnessA.number, function( val ) {

                        roughnessA.number = val;

                    }, false, 0, 1 );

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ฒ„๊ทธ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”!

๋ฐฉ๊ธˆ ์˜ˆ์ œ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์—ฌ PBR ๋…ธ๋“œ ๊ทธ๋ž˜ํ”„ <3

<3
๋งˆ์ง€๋ง‰ ๊ฐœ์ •ํŒ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ
https://github.com/sunag/sea3d/commit/a2e3813b53902331e91dbc0f6bae0136a384ad0c

๋ฉ‹์ง€๋‹ค!

ํ›„์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์ด ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์  ์žฅ, ์•„๋ฆ„๋‹ค์›Œ!

NodeMaterial ๋ฒ„์ „ 5 + LightNode

http://sunag.github.io/sea3d/Labs/Three.JS-NodeMaterial/webgl_materials_nodes.html

ํ”ผ๋ถ€
nodematerial-rev5-skin

ํˆฐ ์‰์ด๋”ฉ
nodematerial-rev5-toon

++ color-adjustment ๋ฐ plush ์˜ˆ.

๋‹ˆ์ด์Šค!

subsurface scattering :๋•€_๋ฏธ์†Œ:

์ด๊ฒƒ์€ ํ–ฅํ›„ ์—…๋ฐ์ดํŠธ์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ข…์˜ ์…ฐ์ด๋”์ž…๋‹ˆ๋‹ค.

http://sunag.github.io/sea3d/Labs/Three.JS-NodeMaterial/webgl_materials_nodes.html

sss-img1
sss-img2

๐Ÿ˜ฎ!

๋ฉ‹์ง„ NodeMaterial์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

๋ช‡ ๊ฐ€์ง€ ์˜๊ฒฌ/๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ›„ํ–‰ ๊ณต๋ฐฑ์€ ํ•จ์ˆ˜ ๋…ธ๋“œ๋ฅผ ๋Š์Šต๋‹ˆ๋‹ค.
var n1 = new THREE.FunctionNode(" float mul_2_float(float x) { return x*2.0; }"); // problem
var n2 = new THREE.FunctionNode("float mul_2_float(float x) { return x*2.0; }"); // ok
  • ํ•จ์ˆ˜ ๋…ธ๋“œ์˜ int ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฌธ์ œ

float ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ์ž‘์—… ์˜ˆ:

var floatFuncNode= new THREE.FunctionNode("float mul_2_float(float x) { return x*2.0; }");

var funcCallNode = new THREE.FunctionCallNode(floatFuncNode);
funcCallNode.inputs.x = new THREE.FloatNode(0.2);

var colorResNode = new THREE.OperatorNode(new THREE.ColorNode(0x00ff00),
    funcCallNode, THREE.OperatorNode.MUL);

var mat = new THREE.PhongNodeMaterial();
mat.color = colorResNode;

int ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ๊นจ์ง„ ์˜ˆ:

var intFuncNode= new THREE.FunctionNode("float mul_2_int(int x) { return float(x)*2.0; }");

var funcCallNode = new THREE.FunctionCallNode(intFuncNode);
funcCallNode.inputs.x = new THREE.IntNode(1);

var colorResNode = new THREE.OperatorNode(new THREE.ColorNode(0x00ff00),
    funcCallNode, THREE.OperatorNode.MUL);

var mat = new THREE.PhongNodeMaterial();
mat.color = colorResNode;
  • ์ œ์•ˆ: FunctionCallNode ์ƒ์„ฑ์ž์—์„œ ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ „๋‹ฌ
//current:
var funcCallNode = new THREE.FunctionCallNode(floatFuncNode);
funcCallNode.inputs.param1 = new THREE.FloatNode(1);
funcCallNode.inputs.param2 = new THREE.ColorNode(0x0f0f0f);

// proposed:
var funcCallNode = new THREE.FunctionCallNode(floatFuncNode, 
    { param1: new THREE.FloatNode(1), param2: new THREE.ColorNode(0x0f0f0f) } );

// and, i think suitable in some cases: 
var funcCallNode = new THREE.FunctionCallNode(floatFuncNode, 
    [ new THREE.FloatNode(1), new THREE.ColorNode(0x0f0f0f) ] );
  • PhongNodeMaterial์€ ๋ฒ”ํ”„ ๋งต๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๊นŒ?

๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์‚ฌํ•ญ:

  • "์›์‹œ" NodeMaterial์˜ ์กฐ๊ฐ ์…ฐ์ด๋”์—์„œ PositionNode.LOCAL ๋ฌธ์ œ:
var material = new THREE.NodeMaterial(
        new THREE.RawNode( new THREE.PositionNode( THREE.PositionNode.PROJECTION ) ),
        new THREE.RawNode( new THREE.PositionNode( THREE.PositionNode.LOCAL ) )
    );

๊ฒฐ๊ณผ ์…ฐ์ด๋”:

varying vec3 vPosition;
void main(){
gl_Position = (projectionMatrix * modelViewMatrix * vec4( position, 1.0 ));
vPosition = transformed;
}
varying vec3 vPosition;
void main(){
gl_FragColor = vec4(vPosition,0.0);
}

์•„๋งˆ๋„ "๋ณ€ํ™˜๋œ" ๊ธฐ๋Šฅ์€ Phong/Standart ๋…ธ๋“œ ์žฌ๋ฃŒ์—์„œ NodeMaterial๋กœ ์˜ฎ๊ฒจ์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ConstNode ์‚ฌ์šฉ
    var material = new THREE.NodeMaterial(
        new THREE.RawNode( 
            new THREE.OperatorNode(
                new THREE.PositionNode( THREE.PositionNode.PROJECTION ),
                new THREE.ConstNode("float TWO = 2.0;"),
                THREE.OperatorNode.MUL)
            ),
        new THREE.RawNode( new THREE.ColorNode( 0xff0000 ) )
    );

์ด ๊ฒฝ์šฐ ๊ฒฐ๊ณผ ์…ฐ์ด๋”์—๋Š”
gl_Position = ((projectionMatrix * modelViewMatrix * vec4( ์œ„์น˜, 1.0 ))*TWO);
๊ทธ๋Ÿฌ๋‚˜ TWO ์ƒ์ˆ˜๋Š” ์„ ์–ธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด ์‹ค์ˆ˜์ธ๊ฐ€ ๋ฒ„๊ทธ์ธ๊ฐ€?
๋˜ํ•œ ConstNode๋Š” ์„ธ๋ฏธ์ฝœ๋ก ์„ ๊ตฌ๋ถ„ํ•˜๋ฏ€๋กœ "float TWO = 2.0"์€ ๊ตฌ๋ฌธ ๋ถ„์„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@dimarudol ๊ฐ์‚ฌ

๊ทธ๋Ÿฌ๋‚˜ TWO ์ƒ์ˆ˜๋Š” ์„ ์–ธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด ์‹ค์ˆ˜์ธ๊ฐ€ ๋ฒ„๊ทธ์ธ๊ฐ€?

๋‚˜๋Š” ์ด ์‚ฌ์šฉ ๋ฐฉ๋ฒ•๊ณผ ์˜ˆ๋ฅผ ๋“ค์–ด material.include( node ) ๋Œ€ํ•ด ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹น์‹œ ์ „์—ญ ์ƒ์ˆ˜๋ฅผ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

var TWO = new THREE.ConstNode("float TWO = 2.0;");
THREE.NodeLib.add( TWO ); // global

 var material = new THREE.NodeMaterial(
        new THREE.RawNode( 
            new THREE.OperatorNode(
                new THREE.PositionNode( THREE.PositionNode.PROJECTION ),
                TWO,
                THREE.OperatorNode.MUL)
            ),
        new THREE.RawNode( new THREE.ColorNode( 0xff0000 ) )
    );

@sunag ์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” Sea3d Flow๋ฅผ ๊ฐ€์ง€๊ณ  ๋†€์•˜๋Š”๋ฐ ๊ฝค ๋ฉ‹์ ธ ๋ณด์ž…๋‹ˆ๋‹ค. ์–ด๋”˜๊ฐ€์— ๊ณต์‹ ์ €์žฅ์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ๋ฌป๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.
๋ฌธ์•ˆ ์ธ์‚ฌ.

์•ˆ๋…•ํ•˜์„ธ์š” @rraallvv , ์•„์ง ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋ฏธ ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์†Œ์‹์„ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค.

@sunag ๊ฐ์‚ฌ

์•ˆ๋…•ํ•˜์„ธ์š” @sunag์ž…๋‹ˆ๋‹ค ! ์ •๋ง ์ž˜ํ–ˆ์–ด!
์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ๋…ธ๋“œ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์ง€๋งŒ ์ •์  ์ƒ‰์ƒ๋‹น(๋ฐ ์ •์  ๋ถ€๋™ ์†Œ์ˆ˜์  ๊ฐ’๋‹น ์‚ฌ์šฉ์ž ์ •์˜)๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ๋…ธ๋“œ ์‹œ์Šคํ…œ์—์„œ๋Š” ์ „์ฒด ๋ฉ”์‹œ์— colorNode ๋ฐ floatNode๋งŒ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. .. THREE.BufferAttribute๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ bufferColorNode์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

์˜ˆ๋ฅผ ๋“ค์–ด ์ด ์žฅ๋ฉด์ด ์žˆ์Šต๋‹ˆ๋‹ค.

screenshot from 2016-08-31 16 27 06

๊ฐ ์ •์ ์—๋Š” ๊ณ ์œ ํ•œ ์ƒ‰์ƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. THREE.BufferAttribute ๋ฐ THREE.ShaderMaterial์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ฝ”๋“œ์—๋Š” ์ด์— ์ƒ์‘ํ•˜๋Š” ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
`์†Œ์žฌ = new THREE.StandardNodeMaterial();
let texColorMap = new THREE.TextureNode( new THREE.TextureLoader().load("colorMap.jpg"));
let customData = new THREE.BufferFloatNode(new Float32Array(...), "data"); // ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์†์„ฑ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

let colorMap = new THREE.FunctionNode([
"vec3 colorMap(sampler2D texColorMap, float ๋ฐ์ดํ„ฐ){",
" return vec3(texture2D(texColorMap, customFunc(data)));", // customFunc๋Š” ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ผ vec2๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
"}"
].์กฐ์ธ("n"));

let colorMapCall = ์ƒˆ๋กœ์šด THREE.FunctionCallNode(colorMap);
colorMapCall.inputs.texColorMap = texColorMap;

material.color = colorMapCall;
material.build();`

๊ทธ๋Ÿฐ๋ฐ FunctionNode์— sampler2D ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค...

๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š” :)

@martinRenou ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ํ , ์•„๋งˆ๋„ ์ง€๊ธˆ์ฒ˜๋Ÿผ:

bufferGeometry.addAttribute( 'color', new THREE.BufferAttribute( colors, 4 ) );
...
colorMapCall.inputs.data = new THREE.ColorsNode(); // send color.x to float slot

๋…ธ๋“œ์— ๋™์  ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ ์†์„ฑ์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์€ ์•„์ง ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค... ์•„๋งˆ๋„ THREE.BufferAttributeNode ...

@sunag ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค :)
๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๊ดœ์ฐฎ์œผ์‹œ๋‹ค๋ฉด THREE.BufferAttributeNode์—์„œ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  1. THREE.FunctionNode์— ๊ด€ํ•ด์„œ๋Š” ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด colorMap์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์— sampler2D๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”ฝ์…€ ์ƒ‰์ƒ์€ texture2D()๋กœ ๊ณ„์‚ฐ๋˜๊ณ  texture2D()์˜ ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋‚ด ์‚ฌ์šฉ์ž ์ง€์ • ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด ์˜จ๋„).
    vec3 ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•„์ด๋””์–ด๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์นœ์ˆ™ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด์ง€๋งŒ FunctionNode๋Š” sampler2D ๋งค๊ฐœ๋ณ€์ˆ˜๋„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?
  2. ๊ฒŒ๋‹ค๊ฐ€ THREE.FunctionNode๋Š” ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”์—๋งŒ ์“ฐ์ง€๋งŒ ๋ฒ„ํ…์Šค ์…ฐ์ด๋”์—๋„ ์“ธ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์ง€ ์•Š์„๊นŒ์š”?

์ด๊ฒƒ์€ ์ƒ‰์ƒ์ด ๋ฐ์ดํ„ฐ (์˜จ๋„, ์••๋ ฅ ...) ๋นจ๊ฐ„์ƒ‰ -> ๊ณ ์˜จ, ํŒŒ๋ž€์ƒ‰ -> ์ €์˜จ์— ํ•ด๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— IsoColor๋ผ๊ณ ํ•˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.
screenshot from 2016-09-01 17 29 58

  1. THREE.IsoColorNode(๋‚ด ๋‹ค์ด์–ด๊ทธ๋žจ์˜ FunctionNode๋ฅผ ๋Œ€์ฒดํ•จ) ๋ฐ ๊ณผํ•™์  ์‹œ๊ฐํ™”์— ๋งค์šฐ ํฅ๋ฏธ๋กœ์šด ๊ธฐํƒ€ ๋…ธ๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๊นŒ? @mrdoob ์—ฌ๋Ÿฌ๋ถ„๋„ ๊ด€์‹ฌ์ด ์žˆ์œผ์‹ ๊ฐ€์š”?

THREE.FunctionNode์— ๊ด€ํ•ด์„œ๋Š” ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด colorMap์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์— sampler2D๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”ฝ์…€ ์ƒ‰์ƒ์€ texture2D()๋กœ ๊ณ„์‚ฐ๋˜๊ณ  texture2D()์˜ ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋‚ด ์‚ฌ์šฉ์ž ์ง€์ • ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด ์˜จ๋„). vec3 ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•„์ด๋””์–ด๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์นœ์ˆ™ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด์ง€๋งŒ FunctionNode๋Š” sampler2D ๋งค๊ฐœ๋ณ€์ˆ˜๋„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ง€๊ธˆ ๋‹น์‹ ์˜ ํ•„์š”๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค! @dimarudol ์˜ ์ด๊ฒƒ๊ณผ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ๋ฉ”๋ชจ์— ๋Œ€ํ•œ PR์„ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค ...

๊ฒŒ๋‹ค๊ฐ€ THREE.FunctionNode๋Š” ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”์—๋งŒ ์“ฐ์ง€๋งŒ ๋ฒ„ํ…์Šค ์…ฐ์ด๋”์—๋„ ์“ธ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์ง€ ์•Š์„๊นŒ์š”?

๋‚˜๋Š” ์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋” ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • sampler2D ๋Š” triangle-blur ์˜ˆ์‹œ์— ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž ์ •์˜ BufferAttribute ๋Š” custom-attribute ์˜ˆ์‹œ์— ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์ž‘๋™ํ•˜์ง€๋งŒ ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์„ธ๋ จ๋œ ์ฝ”๋“œ๋ฅผ ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค ...

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

์šฐ์™€ ! ์ •๋ง ์ž˜ ํ•˜์…จ์Šต๋‹ˆ๋‹ค. ์ €์—๊ฒŒ๋„ ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค :์Šค๋งˆ์ผ:

๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

์•ˆ๋…•ํ•˜์„ธ์š” @sunag ,

์ง€๊ธˆ์€ ๋งค๊ฐœ๋ณ€์ˆ˜(์ƒ‰์ƒ, ์•ŒํŒŒ...)๋กœ ์žฌ์งˆ์— ๋ณด๋‚ด์•ผ ํ•˜๋ฏ€๋กœ "void" ์œ ํ˜•์˜ FunctionNode๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํด๋ฆฝ ํ‰๋ฉด FunctionNode๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์…ฐ์ด๋” ๋ถ€๋ถ„์„ ์ž‘์„ฑํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

void clipPlane(vec4 plane){
 if(dot(position, plane.xyz) > plane.w) discard;
}

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

var clipPlane = new FunctionNode([
"void clipPlane(vec 4 plane){",
" if (dot(position, plane.xyz) > plane.w) discard;",
"}"].join("\n"));
var clipPlaneCall = new FunctionCallNode(clipPlane);
clipPlaneCall.inputs.plane = myVec4Node;

var threshold = new FunctionNode([
"void threshold(float upperBound, float lowerBound, float data){",
" if(data < lowerBound) discard;",
" if(data > upperBound) discard;",
"}"].join("\n"));
var thresholdCall = new FunctionCallNode(threshold);
thresholdCall.inputs.upperBound = myFloatNode1;
thresholdCall.inputs.lowerBound = myFloatNode2;
thresholdCall.inputs.data = myAttributeNode;

var myMaterial = new StandardNodeMaterial();
myMaterial.color = ...
myMaterial.alpha = ...

// voidFunctions is not a good name I'm not inspired...
myMaterial.voidFunctions = [clipPlaneCall, thresholdCall];

์ข€ ๋” "๋””์ž์ธ"์ ์ธ ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด ํ…์Šค์ฒ˜๋กœ ์ฐป์ฃผ์ „์ž์— ๊ตฌ๋ฉ์„ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด:
wood-hole-texture
๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

var holes = new FunctionNode([
"void holes(vec3 texColor){",
" if (/*texColor too much dark*/) discard;",
"}"].join("\n"));
var holesCall = new FunctionCallNode(holes);
holesCall.inputs.texColor = new TextureNode(LoadTexture("holes-text.jpg"));

var myMaterial = new StandardNodeMaterial();
myMaterial.voidFunctions = [holesCall];
myMaterial.side = THREE.DoubleSide;

๋˜ ๋‹ค๋ฅธ ์ ์€ ์…ฐ์ด๋”์—์„œ ํ•จ์ˆ˜์˜ ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€ํ™˜์„ฑ์ด ์•„๋‹Œ ํ•จ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด ๊ฒฐ๊ณผ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค...

์ด ์˜ˆ๋ฅผ ๋ณด์ž:

var transparencyPlane = new FunctionNode([
"float transparencyPlane(vec 4 plane){",
" if (dot(position, plane.xyz) > plane.w) return 0.5.;",
" return 1.;",
"}"].join("\n"));
var transparencyPlaneCall = new FunctionCallNode(transparencyPlane);
transparencyPlaneCall.inputs.plane = myVec4Node;

var displacement = new FunctionNode([
"vec3 displacement(vec3 vector){",
" return position + vector;",
"}"].join("\n"));
var displacementCall = new FunctionCallNode(displacement);
displacementCall.inputs.vector = myVec3Node;

var myMaterial = new StandardNodeMaterial();
myMaterial.transform = displacementCall;
myMaterial.alpha = transparencyPlaneCall;

ํ•œ ์ ์ด ํˆฌ๋ช… ํ‰๋ฉด ๋’ค์— ์žˆ๊ณ  ๋ณ€์œ„๋กœ ์ธํ•ด ๋ฒ—์–ด๋‚˜๋ฉด "transparencyPlaneCall"์ด "displacementCall" ์ „์— ํ˜ธ์ถœ๋œ ๊ฒฝ์šฐ alpha = 1., ํ˜ธ์ถœ๋œ ๊ฒฝ์šฐ alpha = 0.5 ์ดํ›„์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ์ˆœ์„œ๋ฅผ ์„ค์ •ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค... ๋ฌด์Šจ ๋ง์ธ์ง€ ์•„์‹ญ๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š” @martinRenou

ํ , ๋Œ€๋žต void ํ•จ์ˆ˜๋Š” ์Šฌ๋กฏ์—์„œ ์‚ฌ์šฉํ•  ProxyNode ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ˆœ์„œ๋ฅผ ๋”ฐ๋ฅด๊ฑฐ๋‚˜ ์ฝ”๋“œ์˜ ์‹œ์ž‘ ๋˜๋Š” ๋์—์„œ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— functionsStart ๋˜๋Š” functionsEnd ์Šฌ๋กฏ...

alpha ๊ฐ€ 0์ธ ๊ฒฝ์šฐ alpha ์Šฌ๋กฏ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ๊ธฐ๋ฉ๋‹ˆ๋‹ค.
https://github.com/mrdoob/three.js/blob/dev/examples/js/nodes/materials/PhongNode.js#L180

๊ทธ๋ž˜์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ์ˆœ์„œ๋ฅผ ์„ค์ •ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค ...

์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
https://github.com/mrdoob/three.js/blob/dev/examples/js/nodes/materials/PhongNode.js#L122

ํ•จ์ˆ˜ ์ˆœ์„œ๋Š” ๊ฐ„๋‹จํ•œ dependencies ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋˜๋ฉฐ FunctionCall ๋ฅผ ์ด์ „ ์Šฌ๋กฏ์— ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด color ๋Š” ์ฒซ ๋ฒˆ์งธ specular ์ž…๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ๋Š” fragment ~ transparencyPlaneCall ๋ฐ vertex ~ displacementCall ๋‘ ๊ฐ€์ง€ ์…ฐ์ด๋” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

๋ณ€์ˆ˜( varying ๋ฐ ๋กœ์ปฌ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅ์ด ์•„๋‹ˆ๋ผ const๋งŒ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ VarNode ...

์•ŒํŒŒ๊ฐ€ 0์ธ ๊ฒฝ์šฐ ์•ŒํŒŒ ์Šฌ๋กฏ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ๊ธฐ๋ฉ๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, ๊ทธ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

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

์‚ฌ์‹ค ์ €๋Š” ํ”ฝ์…€์„ ๋ฒ„๋ฆฌ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋จผ์ € ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ธฐ๋Šฅ ์งํ›„์— ์•ŒํŒŒ๋ฅผ ๋ฒ„๋ฆฌ๋ฉด ์•ŒํŒŒ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ๋Š” ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ์…ฐ์ด๋” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. fragment์—์„œ transparentPlaneCall๋กœ, ์ •์ ์—์„œ displacementCall๋กœ.

์˜ค๋ฅธ์ชฝ ! ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์€ ์ข‹์€ ์˜ˆ๊ฐ€ ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์‹ค์ˆ˜.

์™„๋ฃŒ r6 - #9636

๋ฉ‹์žˆ๋Š” ! ๋‹ต๋ณ€ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ž…๋ ฅ์ด ์•„๋‹Œ ํ™•์žฅ์„ ์œ„ํ•ด ๋ณ€์ˆ˜(๊ฐ€๋ณ€ ๋ฐ ์ง€์—ญ)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  const๋งŒ ๋งค์šฐ ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ VarNode...

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

@์ˆ˜๋‚™
์ •์  ์…ฐ์ด๋”์—์„œ FunctionNode์™€ ํ•จ๊ป˜ AttributeNode๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ

var customData = new THREE.AttributeNode("data", "float");

var myFunc = new THREE.FunctionNode([
 "vec3 myFunc(float data){",
 " return vec3(data, 0., 0.);"
 "}"].join("\n"));
var myFuncCall = new THREE.FunctionCallNode(myFunc);
myFuncCall.inputs.data = customData;

material.transform = myFuncCall;

์…ฐ์ด๋”๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค.

...
varying float nVdata;
attribute float data;
...
float myFunc(float data){
 return return vec3(data, 0., 0.);
}

void main(){
...
transformed = myFunc(nVdata); // We use nVdata but it is not initialized
...
nVdata = data;
...
}

๊ฐ„๋‹จํ•œ ์ˆ˜์ •์€ nVdata๋ฅผ ๋ฐ์ดํ„ฐ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ?

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

์‘! varying ๋ฅผ VarNode ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ„ํ…์Šค/ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”์™€์˜ ๋” ๋‚˜์€ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์ด ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด์ œ keywords ๊ธฐ๋Šฅ๊ณผ ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค.

์ตœ์†Œํ•œ์˜ varying ์˜ˆ์ œ๋ฅผ ์ž‘์„ฑํ–ˆ์ง€๋งŒ void function ์†”๋ฃจ์…˜์€ ์•„์ง ์—†์Šต๋‹ˆ๋‹ค.

์ •์  ์…ฐ์ด๋”์—์„œ FunctionNode์™€ ํ•จ๊ป˜ AttributeNode๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์ •๋จ - https://github.com/mrdoob/three.js/pull/9681

@sunag ๋‹˜ ์•ˆ๋…•ํ•˜์„ธ์š”, ๋‹ค์–‘ํ•œ ์˜ˆ์‹œ๋ฅผ mtl.transform ๋‹ค์–‘ํ•œ ๋ณ€์ˆ˜ ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์ด ์ด์ƒํ•˜๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค... void ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด ์ด๊ฒƒ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?
๊ทธ๋Ÿฌ๋‚˜ ํ‚ค์›Œ๋“œ๊ฐ€ :smiley:

์‚ฌ์‹ค, mtl.varyings (mtl.varyings๋Š” ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค)์— ์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. mtl.varyings.push(myVar) . ๊ฐ™์€ ์•„์ด๋””์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ mtl.vertexFunctions.push(myVertexFunctionCall) ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ mtl.fragmentFunctions mtl.vertexFunctions.push(myVertexFunctionCall) ์™€ ๊ฐ™์ด ์ •์  ๋ฐ ์กฐ๊ฐ ์…ฐ์ด๋”์— ํ•จ์ˆ˜๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์‹์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ๋ณ€ํ™”์— ๋Œ€ํ•ด ๋งŽ์€ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ ํšจ๊ณผ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋Š” void ํ•จ์ˆ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

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

@trusktr ๋ฌผ๋ก  ์–ผ๋งˆ๋‚˜ ๋” ๋งŽ์€ ๋…ธ๋“œ๊ฐ€ ๋นŒ๋“œ ์‹œ๊ฐ„์— ๋” ๋งŽ์€ CPU๋ฅผ ์†Œ๋น„ํ•˜๊ณ  ๋Ÿฐํƒ€์ž„์— GPU๋ฅผ ์†Œ๋น„ํ•˜๋Š”์ง€ ์ œํ•œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ๋Š” ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ๊ฐ’์— ๋”ฐ๋ผ ์กฐ์ •๋˜๋ฉฐ, ์˜ˆ๋ฅผ ๋“ค์–ด float ์—์„œ vec2 ๋˜๋Š” vec3 ๋กœ์˜ ๋ณ€ํ™˜์€ ์ž๋™์ด๋ฉฐ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ๋‘ ๋ฒˆ ์ด์ƒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์บ์‹œ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ( TempNode ).

์Šคํฌ๋ฆฐ์ƒท์—์„œ ๊ฐ ๋…ธ๋“œ๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์˜ˆ: PositionNode ํ‘œ์‹œ:
https://github.com/mrdoob/three.js/blob/789efa65bafe022e178c7e93e0985a7607a54403/examples/js/nodes/accessors/PositionNode.js#L5

@mrdoob @sunag NodeMaterial ์ฝ”๋“œ์˜ ํ˜„์žฌ ์ƒํƒœ์™€ ์ด ์ฝ”๋“œ๊ฐ€ three.js ๋กœ๋“œ๋งต์— ์–ด๋–ป๊ฒŒ ๋ถ€ํ•ฉํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์˜๊ฒฌ์„ ์ œ์‹œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ด๋ก ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€์— ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • glTF ์‚ฌ์–‘/๊ด‘ํƒ PBR ์žฌ๋ฃŒ๋ฅผ NodeStandardSGMaterial๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • ๋งต๋ณ„ UV ์„ธํŠธ ๋ฐ ๋ณ€ํ™˜ ์ง€์›
  • ์ธ์Šคํ„ด์‹ฑ์œผ๋กœ ๋นŒํŠธ์ธ ๋จธํ‹ฐ๋ฆฌ์–ผ ์‚ฌ์šฉ ๊ฐ„์†Œํ™”

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

NodeMaterial์— ๋Œ€ํ•œ ์žฅ๊ธฐ ๊ณ„ํš์„ ์•Œ๊ณ  ์–ด๋–ค ๊ธฐ๋Šฅ์ด ๊ด€๋ จ์ด ์žˆ๋Š”์ง€(๋˜๋Š” ๊ด€๋ จ์ด ์—†๋Š”์ง€) ์ถ”์ธกํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค... ๋” ๋งŽ์€ ๊ฐœ๋ฐœ์ด ํ•„์š”ํ•œ๊ฐ€์š”? ๋‹ค๋ฅธ ๊ธฐ์—ฌ์ž๊ฐ€ ๋„์šธ ์ˆ˜ ์žˆ๋Š” ์ผ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@sunag ๋„ค, ์ด ์‹œ์ ์—์„œ ์ถ”๊ฐ€ ๊ณ„ํš์ด ์žˆ๋Š”์ง€ ์ €๋„ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด๋ก ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€์— ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • glTF ์‚ฌ์–‘/๊ด‘ํƒ PBR ์žฌ๋ฃŒ๋ฅผ NodeStandardSGMaterial๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • ๋งต๋ณ„ UV ์„ธํŠธ ๋ฐ ๋ณ€ํ™˜ ์ง€์›
  • ์ธ์Šคํ„ด์‹ฑ์œผ๋กœ ๋นŒํŠธ์ธ ๋จธํ‹ฐ๋ฆฌ์–ผ ์‚ฌ์šฉ ๊ฐ„์†Œํ™”

์ด๋Ÿฌํ•œ ํŠน์ • ๋ฌธ์ œ์—๋Š” ์ด์ œ ํ•ต์‹ฌ์„ ์ˆ˜์ •ํ•  ํ•„์š” ์—†์ด ๊ธฐ์กด API๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธ์Šคํ„ด์Šคํ™”:
https://github.com/mrdoob/three.js/pull/10750 (์™„์ „ํžˆ ๋ฐœ์ „ํ•˜๊ณ  ์ฝ”์–ด๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€๋งŒ ์›์ˆญ์ด ํŒจ์น˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Œ)
https://github.com/mrdoob/three.js/pull/14166 (onBeforeCompile์„ ํ†ตํ•œ ๊ฐ„๋‹จํ•œ ์žฌ๋ฃŒ ํ™•์žฅ)
https://github.com/mrdoob/three.js/pull/14012 (mokey-patching์„ ํ†ตํ•œ ๊ฐ„๋‹จํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™•์žฅ)

๋งต๋ณ„ UV ์„ธํŠธ
https://github.com/mrdoob/three.js/pull/14174

spec-gloss ์ž์ฒด ํด๋ž˜์Šค
https://github.com/mrdoob/three.js/pull/14099

์•„๋งˆ๋„ NodeMaterial ๋ฅผ ํ•ต์‹ฌ์œผ๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ๊ธด๋ฐ•๊ฐ์„ ๋œ์–ด์ฃผ๋Š” ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :).

์ด ์ฃผ์ œ๋ฅผ ๋”ฐ๋ฅด๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด https://github.com/mrdoob/three.js/pull/14149 ์—์„œ ์ง„ํ–‰ ์ค‘์ธ ํ† ๋ก ์ด

#14149์—์„œ ์Šค๋ ˆ๋“œ ๊ฒฐํ•ฉ:

tl;dr โ€” NodeMaterial์€ ๋จธํ‹ฐ๋ฆฌ์–ผ ์‹œ์Šคํ…œ์„ ์œ„ํ•œ ๋งค์šฐ ์œ ๋งํ•œ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. NodeMaterial ์ฑ„ํƒ์ด ํ˜„์žฌ ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๋กœ ์ œํ•œ๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • ๋งŽ์€ ๊ฐœ๋ณ„ ํŒŒ์ผ์„ ํฌํ•จํ•˜๋Š” ๋งˆ์ฐฐ
  • ๋น„์ฃผ์–ผ ์—๋””ํ„ฐ๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค
  • ๋น„๊ต์  ์ ์€ ์˜ˆ, ๋ฌธ์„œ

NodeMaterial์ด src/ ์— ์žˆ์–ด์•ผ ํ•˜๋Š” ์‹œ๊ธฐ/์—ฌ๋ถ€์— ๋Œ€ํ•œ ์งˆ๋ฌธ์€ @mrdoob ๋ฐ @sunag ์— ๋‚จ๊ฒจ๋‘ ๊ฒ ์ง€๋งŒ (์ ์–ด๋„) ์œ„์˜ ์„ธ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜์•„๊ฐ€์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด NodeMaterial์„ ํ˜„์žฌ ์žฌ๋ฃŒ ์‹œ์Šคํ…œ์˜ ๋Œ€์•ˆ์œผ๋กœ ๋ณด๊ณ  ์žˆ๋Š”์ง€ ์•„๋‹ˆ๋ฉด ์™„์ „ํ•œ ๋Œ€์ฒดํ’ˆ์œผ๋กœ ๋ณด๋Š”์ง€ ์•„๋Š” ๊ฒƒ๋„ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.



์ž„๊ณ„๋Ÿ‰์€ GLTFLoader ์ดํ•ด ๊ด€๊ณ„์ž์— ์˜ํ•ด ํ˜•์„ฑ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ, ๋‚ด (์ฃผ๊ด€์ ) ๊ด€์ฐฐ์€ ๋ถ€์ ์ ˆํ•˜๊ฒŒ ๋ฌธ์„œํ™”๋œ onBeforeRender(๋ช‡ ๊ฐ€์ง€ ์˜ˆ)์™€ ํ›จ์”ฌ ๋œ ๋ฌธ์„œํ™”๋œ onBeforeCompile(ํ•œ ๊ฐ€์ง€ ์˜ˆ) ๋•Œ๋ฌธ์— ํ•„์š”๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@pailhead ์ €๋Š” ๊ฐœ๋ฐœ์ž์ด๊ธฐ๋„ ํ•œ A-Frame์˜ ์›Œํฌํ”Œ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด GLTFLoader๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ํ˜•์‹์„ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋” ์œ ์šฉํ•œ ์žฌ๋ฃŒ ์‹œ์Šคํ…œ์ด ๋ชฉํ‘œ๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ ์ž๋ฃŒ๋ฅผ ํ†ตํ•ฉ(๋˜๋Š” ํ†ตํ•ฉํ•˜์ง€ ์•Š์Œ)ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์€ three.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ตœ์ข… ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์žฅ์ (๊ธฐ๋Šฅ, ์œ ์—ฐ์„ฑ, ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด API)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

onBeforeCompile ๋ฐ onBeforeRender ํ›„ํฌ๊ฐ€ ๋ฌดํ•œํžˆ ์œ ์—ฐํ•˜๋‹ค๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์…ฐ์ด๋”๋ฅผ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„์—๋Š” ์‹ค์งˆ์ ์ธ ์ œํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‘˜ ๋‹ค ๊ธฐ๋ณธ ์žฌ๋ฃŒ API๋กœ ์œ ์‚ฌํ•˜๊ฒŒ ๊ฒฐํ•จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋น„๊ต์  ๋‹จ์ˆœํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด์„œ๋„ WebGL ๊ตฌ๋ฌธ์„ Material API์— ๊ฐ•์ œ ์ ์šฉ
  2. ์ฝ”์–ด ๋จธํ‹ฐ๋ฆฌ์–ผ ์…ฐ์ด๋”์˜ ๋ฌธ์ž์—ด ์กฐ์ž‘์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋ฉฐ, ์ฝ”์–ด ๋จธํ‹ฐ๋ฆฌ์–ผ ๋ณ€๊ฒฝ์€ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋” ์–ด๋ ต๊ณ  ๊นจ์ง€๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
  3. ์˜ˆ์ˆ ๊ฐ€๋“ค์—๊ฒŒ ๋œ ๋‹ค๊ฐ€๊ฐ€๊ธฐ
  4. ์‹ค์งˆ์ ์œผ๋กœ ์ง๋ ฌํ™” ๋ถˆ๊ฐ€๋Šฅ

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(์˜ˆ: #14206)๋Š” ํ™•์‹คํžˆ ์‚ฌ์šฉ์ž์˜ ๊ด€์ ์—์„œ ์ด๊ฒƒ์„ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋จธํ‹ฐ๋ฆฌ์–ผ์˜ ํ–ฅํ›„ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์ด ๊ธฐ์กด ๋จธํ‹ฐ๋ฆฌ์–ผ ์…ฐ์ด๋” ์œ„์— ์ ์  ๋” ๋ณต์žกํ•ด์ง€๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค๋ฉด, ์ œ ์ƒ๊ฐ์—๋Š” ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅ์„ฑ์˜ ์œ„ํ—˜์ž…๋‹ˆ๋‹ค.

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

  1. ์œ ์—ฐํ•˜๊ณ  ๊ตฌ์„ฑ ๊ฐ€๋Šฅ
  2. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ผ๋ฐ˜ ์…ฐ์ด๋”์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋‚ด๋ถ€ WebGL ์…ฐ์ด๋”์—์„œ ์ถ”์ƒํ™” ๊ณ„์ธต์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  3. ์•„ํ‹ฐ์ŠคํŠธ์™€ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์žฌ๋ฃŒ ํ‘œํ˜„
  4. ์ ์–ด๋„ ์–ด๋Š ์ •๋„ ์ง๋ ฌํ™” ๊ฐ€๋Šฅ(๋‹ค๋ฅธ ํ˜•์‹์œผ๋กœ์˜ ๋ณ€ํ™˜์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์–ด๋ ต์ง€๋งŒ)

์ด๊ฒƒ์€ ์•„๋งˆ๋„ onBeforeCompile ๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๋Š” ๋ง์ฒ˜๋Ÿผ ๋“ค๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์˜๋„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ณ„์† ์œ ์ง€๋˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ๊ธฐ์˜๊ฒŒ ์ƒ๊ฐํ•˜๋ฉฐ ์˜ˆ์ œ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ A-Frame ๋˜๋Š” three.js ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ฒฝ์šฐ์— ์ง€์‹œํ•˜๊ณ  ์‹ถ์€ API๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค๋ฅธ 3D ๋„๊ตฌ์˜ ์žฌ๋ฃŒ ์‹œ์Šคํ…œ๊ณผ ์ž˜ ๋น„๊ต๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • ๋งŽ์€ ๊ฐœ๋ณ„ ํŒŒ์ผ์„ ํฌํ•จํ•˜๋Š” ๋งˆ์ฐฐ

์ด๊ฒƒ์€ ๋งˆ์ฐฐ์ด ์žˆ์–ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋„๊ตฌ๋ฅผ ๋นŒ๋“œํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ์ผ์ข…์˜ ์„ค๋ฌธ์กฐ์‚ฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. html ํŒŒ์ผ์—์„œ js ํŒŒ์ผ์„ ์ˆ˜๋™์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ 2018๋…„์— ์‹ค์ œ๋กœ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์•„๋‹ˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์ˆซ์ž ์ด๋ฉฐ

์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์ˆ˜๋™์œผ๋กœ ํฌํ•จํ•  ๋•Œ ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ์ง€ ๊ฑฑ์ •ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํŠธ๋ฆฌ ์‰์ดํ‚น๊ณผ ์ œ๋Œ€๋กœ import/export ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ ๋” ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์˜€์Šต๋‹ˆ๋‹ค.

  • ๋น„์ฃผ์–ผ ์—๋””ํ„ฐ๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค
  • ๋น„๊ต์  ์ ์€ ์˜ˆ, ๋ฌธ์„œ

๋‚˜๋Š” ์ด๊ฒƒ์ด ํ•ต์‹ฌ์ด ๋˜๊ธฐ ์ „์— ์ด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚˜์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ŠคํŽ˜ํ˜๋Ÿฌ ๊ธ€๋กœ์Šค ๋จธํ‹ฐ๋ฆฌ์–ผ์€ GLTFLoader ์™€ ๊ฒฐํ•ฉ๋˜์ง€ ์•Š์€ ์˜ˆ์‹œ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. /src ๋˜๋Š” /examples ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ๊ด€๋ จ์ด ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@donmccurdy

onBeforeCompile ๋ฐ onBeforeRender ํ›„ํฌ๊ฐ€ ๋ฌดํ•œํžˆ ์œ ์—ฐํ•˜๋‹ค๋Š” ๊ฒƒ์€ ๋งž์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์…ฐ์ด๋”๋ฅผ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„์—๋Š” ์‹ค์งˆ์ ์ธ ์ œํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค.

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

onBeforeCompile ์—๋Š” ํ™•์‹คํžˆ ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉฐ ์ด๋ฆ„์ด ์ž˜๋ชป ์ง€์ •๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋งฅ๋ฝ์—์„œ ์ง€์ ํ•  ์ข‹์€ ์ ์€ ์ตœ๊ทผ PR #14214์ž…๋‹ˆ๋‹ค. ์‚ฌ๋ผ์ง„ ๊ฒƒ์„ ๋ณด์ž๋งˆ์ž( build() ์ฐฌ์„ฑ needsUpdate ) ๊ฑฐ๊ธฐ์—์„œ onBeforeCompile ๋ฅผ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. onBeforeParse ํ–ˆ๋Š”๋ฐ #include <foo> ๋ฌธ์„ ๋ฐ”๊พธ์ง€ ์•Š์œผ๋ฉด ์ด ํ•จ์ˆ˜ ์ดํ›„์™€ ์‹ค์ œ ์ปดํŒŒ์ผ ์ „์— ์—ฌ์ „ํžˆ ๊ตฌ๋ฌธ ๋ถ„์„๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด PR์—์„œ๋Š” onWillRefreshMaterial ๋ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋ ค๊ณ  ํ•˜๋Š” ์ฒ ํ•™์€ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ฝœ๋ฐฑ์ด ๋” ์„ธ๋ถ„ํ™”๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์ด ๋” ๋งŽ์•„์•ผ ํ•˜๋ฉฐ ์ด๋ฆ„์„ ์ง€์ •ํ•  ๋•Œ ์„ธ์‹ฌํ•œ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

#14214๋Š” NodeMaterial ๊ฐ€ ํ•ต์‹ฌ์— ์žˆ์„ ํ•„์š”๊ฐ€ ์—†๋Š” ์ด์œ ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ข‹์€ ์˜ˆ์ž…๋‹ˆ๋‹ค. ์ ์–ด๋„ /renderer ์–ด๋–ค ๊ฒƒ๊ณผ๋„ ๊ฒฐํ•ฉ๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

  1. ๋น„๊ต์  ๋‹จ์ˆœํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด์„œ๋„ WebGL ๊ตฌ๋ฌธ์„ Material API์— ๊ฐ•์ œ ์ ์šฉ

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

๋™์  ์ง€๋„๋ฅผ ์›ํ•˜๋ฉด material.map ๋˜๋Š” 'material.color' ๊ฐ€ NodeTexture , GLSLTexture , TextureTexture ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

myMaterial.color = new SomeNodeGraph() //outputs vec4 in the end

myMaterial.color = new GLSLInput() // inputs various documented variables, outputs some vec4

myMaterial.color = new THREE.Color()

myMaterial.color = new CustomColorGradientTopBottom() // dunno if its Node, GLSL, regular color whatever, i just know it's compatible with the slot
  1. ์ฝ”์–ด ๋จธํ‹ฐ๋ฆฌ์–ผ ์…ฐ์ด๋”์˜ ๋ฌธ์ž์—ด ์กฐ์ž‘์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋ฉฐ, ์ฝ”์–ด ๋จธํ‹ฐ๋ฆฌ์–ผ ๋ณ€๊ฒฝ์€ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋” ์–ด๋ ต๊ณ  ๊นจ์ง€๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋‚ด ์š”์ ์€ ์ด๊ฒƒ์ด onBeforeCompile ๋กœ ์ด๋ฏธ ์–ด๋Š ์ •๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์„ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์–ด๋ ต๊ณ  ์ทจ์•ฝํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋ฏธ ๋‚ด ์ง์—… ์ƒํ™œ์—์„œ ์ด๊ฒƒ์— ๋Œ€ํ•ด ์†์„ ๋ป—์ณค๊ณ  ๊ทธ๊ฒƒ์— ์˜์กดํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์–ผ๋งˆ๋‚˜ ์—ฐ์•ฝํ•œ์ง€, ๋งŽ์€ ์ŠคํŠธ๋ ˆ์Šค๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค :(

์ง€์ ํ•˜์‹  #14206 ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” 3๋…„ ๋™์•ˆ ์ž์ฒด์ ์œผ๋กœ ์ค‘๋‹จ๋œ ์ด PR ๋•Œ๋ฌธ์— 1๋…„ ์ด์ƒ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ฃผ๊ด€์ ์ธ ๋Š๋‚Œ์€ #14206์ด ์ด๋Ÿฌํ•œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ณ  ๋œ ์ง€๋ฃจํ•˜๊ณ  ๋œ ์ทจ์•ฝํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŒฌํ…€ ์†์„ฑ์ด ์ •์˜๋˜์ง€ ์•Š๋Š” ํ•œ ์ ˆ๋Œ€์ ์œผ๋กœ ์•„๋ฌด ์˜ํ–ฅ๋„ ๋ฏธ์น˜์ง€ ์•Š๋Š” 30์ค„์˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์—๊ฒŒ ์ด๋ฏธ onBeforeCompile ์˜ ํ˜•ํƒœ๋กœ ๋งค๋‹ฌ๋ฆด ๋ฐง์ค„์ด ์ฃผ์–ด์ง„๋‹ค๋ฉด ์ข€ ๋” ์ธ๊ฐ„์ ์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ? :์›ƒ๋‹ค:

๊ฒฐ๊ตญ, ๋‚˜๋Š” ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ์ทจ์•ฝ ์ˆ˜์ค€๊ณผ ๊ทธ๋ ‡์ง€ ์•Š์€ ์ˆ˜์ค€์„ ์Šค์Šค๋กœ ๊ฒฐ์ •ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  1. ์˜ˆ์ˆ ๊ฐ€๋“ค์—๊ฒŒ ๋œ ๋‹ค๊ฐ€๊ฐ€๊ธฐ

์ด๊ฒƒ์ด ์•„ํ‹ฐ์ŠคํŠธ๊ฐ€ ์‹œ๊ฐ์  ๋„๊ตฌ์™€ ๊ทธ๋ž˜ํ”„๋ฅผ ์ €์žฅํ•  ํ˜•์‹์„ ๊ฐ€์ ธ์•ผ ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. "๊ตฌ์šด" GLSL์ด๋‚˜ ๋Ÿฐํƒ€์ž„์— NodeMaterial ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„ํ‹ฐ์ŠคํŠธ๋Š” ์…ฐ์ด๋”๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ  ์—”์ง€๋‹ˆ์–ด๋Š” ๋กœ๋”ฉ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์…ฐ์ด๋”๋ฅผ "์ปดํŒŒ์ผ"ํ•˜๋„๋ก ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜ผ์ž ์ž‘์—…ํ•˜๋Š” ์•„ํ‹ฐ์ŠคํŠธ๋Š” ์–ด๋–ค ์ด์œ ๋กœ ๋” ์‰ฝ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๊ทธ๋ž˜ํ”„๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค("์ปดํŒŒ์ผ"์—๋Š” ๋” ๋งŽ์€ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค).

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

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

  1. ์‹ค์งˆ์ ์œผ๋กœ ์ง๋ ฌํ™” ๋ถˆ๊ฐ€๋Šฅ

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

"materialFoo": {
  "color":"#ff0000",
  "specularMap": "some_path.jpg",
  "glossiness": "0.5"
}

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

์žฌ: ์ง๋ ฌํ™”

๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ• ๊นŒ์š”?

https://github.com/mrdoob/three.js/blob/dev/src/materials/Material.js#L160

customSerializer( data )

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ

SpecularGlossMaterial.prototype.toJSON = ()=>{
  Material.prototype.call(this, undefined, data =>{
    if ( this.roughness !== undefined ) data.roughness = this.roughness;
  })
}

specularMap ๋Š” ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ์ง๋ ฌํ™”๋ฉ๋‹ˆ๋‹ค.
https://github.com/mrdoob/three.js/blob/dev/src/materials/Material.js#L213

ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ์ข€ ์ด์ƒํ•˜๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. Material ํด๋ž˜์Šค๋Š” ๋ณด์ด๋Š” ๋ชจ๋“  ๋‚ด์žฅ ์žฌ๋ฃŒ์˜ ๋‚ด๋ถ€๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@donmccurdy ์ด ํ† ๋ก ์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ PR #14206์—์„œ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์˜คํ”„๋ผ์ธ์œผ๋กœ ๋ฒ ์ด ์ง€์—ญ ์–ด๋””์—์„œ๋‚˜ ๋งฅ์ฃผ๋‚˜ ์ปคํ”ผ๋ฅผ ๋งˆ์‹œ๋ฉฐ ์ž‘์—… ์„ธ์…˜์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.slightly_smiling_face:

์—ฌ๋Ÿฌ ํŒŒ์ผ์ด ๋งˆ์ฐฐ์ด _์—†์–ด์•ผ_ ํ•˜๊ณ  NodeMaterial์„ src/ ์— ๋„ฃ๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ์ธ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๋ฐ ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. NodeMaterial์ด ์•„์ง ๋งŽ์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ช‡ ๊ฐ€์ง€ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ผ ๋ฟ์ด๋ฉฐ ์ด๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  src/ ์— NodeMaterial ์„ ๋„ฃ๊ฑฐ๋‚˜ examples/js ๋˜๋Š” ๋ณ„๋„์˜ ๋นŒ๋“œ ์ถœ๋ ฅ์œผ๋กœ ์ฑ„ํƒ์„ ์ถ”์ง„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋” ๋งŽ์€ ๋ฌธ์„œ๊ฐ€ ์ „์ œ ์กฐ๊ฑด์ด ๋  ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ํ™•์‹คํžˆ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

src/ ์—์„œ ์ดํ•ด๋˜๊ธฐ ์ „์— ๋ช‡ ๊ฐ€์ง€ ๋” ํ•„์š”ํ•œ ๊ฒƒ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ๋ฐฉํ–ฅ์œผ๋กœ NodeMaterial ์— ๋Œ€ํ•ด ๋‚™๊ด€์ ์ž…๋‹ˆ๋‹ค. ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ, ํŠนํžˆ WebGL2 ๋ฐ (์ตœ์ข…์ ์œผ๋กœ) WebGPU ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜์•„๊ฐ€๋ฉด์„œ onBeforeCompile ๋ฐ ๋ฌธ์ž์—ด ์กฐ์ž‘์„ ๋จธํ‹ฐ๋ฆฌ์–ผ ์‹œ์Šคํ…œ์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ๋กœ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋งค์šฐ ๊ฑฑ์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋‘ ๊ฐ€์ง€ ์„ ํƒ์ด ์œ ์ผํ•œ ์„ ํƒ์ด๋ผ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ (๋‘˜ ์ค‘) ์ด๊ฒƒ์ด ๋‚ด ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ํ™•์‚ฐ ํ…์Šค์ฒ˜์— ๊ณฑํ•˜๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ๋ณ€ ํ์ƒ‰ ํ…์Šค์ฒ˜๋ฅผ ๋„ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ์ด๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:

const aoNode = new OperatorNode(
        new Math1Node( aoTexture, Math1Node.INVERT ),
        aoScale,
        OperatorNode.MUL
    );
material.ao = aoNode;

์ด๊ฒƒ์€ ๋‚ด AO ํ…์Šค์ฒ˜์ž…๋‹ˆ๋‹ค.
ao sx

๋ถˆํ–‰ํžˆ๋„ ๋‚ด ๋ชจ๋ธ์—์„œ ์ฃผ๋ณ€ ํ์ƒ‰์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ•  ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
์ด๊ฒƒ์ด ๋‚ด ์งˆ๋ฌธ์„ ๊ฒŒ์‹œํ•  ์˜ฌ๋ฐ”๋ฅธ ์žฅ์†Œ์ด๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”!

๊ธฐ์กด ๋…ธ๋“œ ๊ธฐ๋ฐ˜ ๋„๊ตฌ์—์„œ threejs์˜ ์žฌ๋ฃŒ๋กœ ๋งคํ•‘ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ ์ ˆํ•œ ๋ฌธ์„œ์™€ ํ•จ๊ป˜ src/์—์„œ NodeMaterial์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@IARI

๊ธฐ์กด ๋…ธ๋“œ ๊ธฐ๋ฐ˜ ๋„๊ตฌ๋ฅผ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@donmccurdy

๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค :)

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

๋จธํ‹ฐ๋ฆฌ์–ผ ์‹œ์Šคํ…œ์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒฝ๋กœ๋กœ onBeforeCompile ๋ฐ ๋ฌธ์ž์—ด ์กฐ์ž‘์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋งค์šฐ ๊ฑฑ์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

onBeforeCompile ๋Š” ๋”์ฐํ•ฉ๋‹ˆ๋‹ค. ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ด๋Ÿฌํ•œ ์Šค๋ ˆ๋“œ์— ๊ด€๋ จ๋œ ์œ ์ผํ•œ ์ด์œ ๋Š” onBeforeCompile ์˜ ๋ฌธ์ž์—ด ์กฐ์ž‘๋ณด๋‹ค ์šฐ์ˆ˜ํ•œ #13198์„ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ three.js์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ํŒจํ„ด์ด ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. @bhouston ์ด ์ด๋Ÿฌํ•œ ์ž‘์—… ์ค‘ ์ผ๋ถ€๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํฌํฌ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์ด

์ฑ„๋„๋‹น uv ๋ณ€ํ™˜์˜ ๊ฒฝ์šฐ ์ด๋ฅผ ์˜ˆ์ œ ๋˜๋Š” npm ๋ชจ๋“ˆ๋กœ ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งค์ฃผ 3๋ช…์ด ๋‹ค์šด๋ฐ›๋Š”๋‹ค๋ฉด ์•„๋งˆ ํ•ต์‹ฌ์— ์žˆ์–ด์„œ๋Š” ์•ˆ๋  ๋‚ด์šฉ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 20,000๋ช…์ด ๋‹ค์šด๋กœ๋“œํ–ˆ๋‹ค๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ three.js๊ฐ€ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„๋˜์—ˆ์–ด์•ผ ํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

onBeforeCompile ๋Š” ๋…ธ๋“œ ๋จธํ‹ฐ๋ฆฌ์–ผ( https://github.com/mrdoob/three.js/pull/14214 )์— ์ค‘์š”ํ•  ๊ฒƒ ๊ฐ™์œผ๋ฏ€๋กœ ๋ฌธ์ž์—ด ์กฐ์ž‘์—๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค .

์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  onBeforeCompile ๋ฐ NodeMaterial ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ ์˜ต์…˜์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. onBeforeCompile ๋ณด๋‹ค ํ›จ์”ฌ ํŽธ๋ฆฌํ•˜๊ณ  NodeMaterial ๋ณด๋‹ค ํ›จ์”ฌ ์ž‘์Šต๋‹ˆ๋‹ค.

์ตœ๊ทผ ์˜ˆ:
https://github.com/mrdoob/three.js/pull/14206

์˜ค๋ž˜๋œ ํ† ๋ก :
https://github.com/mrdoob/three.js/pull/13198

@pailhead ์šฐ์„  ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ์ ์ธ Blender Cycles Node์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
Unity ์…ฐ์ด๋”๊ทธ๋ž˜ํ”„๋ฅผ ๊ฐ€์ง€๊ณ  ๋…ธ๋Š” ๊ฒƒ๋„ ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@claudioviola material.shadow ํ•˜๊ฑฐ๋‚˜ ํ™•์‚ฐ material.color = diffuse * oclusion ๊ณฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ์ƒ‰์€ ๊ฐ„์ ‘๊ด‘, AmbientLight , HemisphereLight ...

@IARI

ShaderGraph๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด Unity 7.5 ๊ธฐ๊ฐ€๋ฅผ ๋‹ค์šด๋กœ๋“œ ์ค‘์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”„ ์ž‘์„ฑ์„ ์œ„ํ•œ ๋…๋ฆฝ ์‹คํ–‰ํ˜• ๋„๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š”์ด ๋„ˆ๋ฌด ๊ทธ๋ž˜ํ”„๋ฅผ ์ €์žฅ ์ข…๋ฅ˜์˜ ํŒŒ์ผ์˜ ๋ฌด์—‡์„๋ณด๊ณ  ์‹ถ์–ดํ•˜๊ณ , ์–ด๋–ป๊ฒŒ three.js๋ฅผ๊นŒ์ง€ ์ „์†กํ•  ๊ฒƒ์ด๋‹ค NodeMaterial ์—์„œ /src .

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

์ด๊ฒƒ์€ ์„œ๋‘๋ฅด์ง€ ์•Š์•˜๊ณ  ๊ฐ•์š”๋˜์ง€๋„ ์•Š์•˜์Šต๋‹ˆ๋‹ค. Sunag๋Š” ๋ช‡ ๋…„ ์ „์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ด๊ฒƒ์ด ํ•„์š”ํ•˜๊ณ  ๋‹ค๋ฅธ ๋Œ€์•ˆ์ด ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ(์˜ˆ: ๋ณ‘ํ•ฉ) ์ด ๊ฒฝ๋กœ๋ฅผ ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์ฃผ์š” ๋„๊ตฌ์ธ 3DS Max, UE4, Blender, Unity, Maya, Sketchfab์€ ์…ฐ์ด๋” ๊ทธ๋ž˜ํ”„๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด์™€ ๊ด€๋ จํ•˜์—ฌ three.js๊ฐ€ ์˜๊ตฌ์ ์ธ ๋ถˆ์ด์ต์„ ๋ฐ›์•„์•ผ ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์€ three.js์—๊ฒŒ ๋ถˆ๊ณตํ‰ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

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

์ €๋Š” ์šฐ๋ฆฌ๊ฐ€ ์•ž์œผ๋กœ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  PhoneMaterial, StandardMaterial ๋“ฑ์˜ API๋ฅผ ๊ณ„์† ์ง€์›ํ•˜์—ฌ three.js ํ”„๋กœ์ ํŠธ์˜ 95%๋ฅผ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๋„๋ก ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์ฑ…์ž„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋‹จ์ˆœํ™”๋œ ์ง์„  ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์Šต๋‹ˆ๋‹ค.

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

๊ตถ์ฃผ๋ฆฐ 3D ์•„ํ‹ฐ์ŠคํŠธ๋กœ ์ƒ๊ณ„๋ฅผ ๊พธ๋ ธ์„ ๋•Œ ๋‚˜๋Š” ๋…ธ๋“œ ๊ธฐ๋ฐ˜์˜ ๋ชจ๋“  ๊ฒƒ์„ ์ข‹์•„ํ–ˆ์Šต๋‹ˆ๋‹ค. Nuke๋Š” ๋‚ด๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ์ž‘๊ณก๊ฐ€์˜€๊ณ , ๊ทธ๋Ÿฐ ๋„๊ตฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ํŠนํžˆ #14231์˜ ์ฐจ๋‹จ์„ ํ•ด์ œํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ์Šค์Šค๋กœ ํ•™์Šต ํ”Œ๋žซํผ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋ฐฉํ•ด๊ฐ€๋˜๋ฉด ๊ฒŒ์‹œ๋ฅผ ์ค‘๋‹จํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

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

๊ทธ ์™ธ์—๋Š” ๋‚ด ๋จธ๋ฆฌ ๊ผญ๋Œ€๊ธฐ์—์„œ ๋…๋ฆฝํ˜• ๋„๊ตฌ๋ฅผ ๋ชจ๋ฅด์ง€๋งŒ ๋น ๋ฅธ Google ๊ฒ€์ƒ‰์œผ๋กœ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€๊ฐ€ ๋‚˜์™”์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ 2015๋…„ @mrdoob ์˜ ํŠธ์œ„ํ„ฐ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์ฐพ์€ threejs ๋…ธ๋“œ์šฉ ๋„๊ตฌ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๋œ ์ ์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ์™œ ....

๊ทธ ๋„๊ตฌ๊ฐ€ ์—ฌ๊ธฐ์—์„œ ์ฐธ์กฐ๋œ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์•„๋ฌด ๊ฒƒ๋„ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋งํฌ๋Š” ํ›Œ๋ฅญํ•ด ๋ณด์ด์ง€๋งŒ ์ถœ๋ ฅ์€ GLSL๊ณผ ๋น„๊ตํ•  ๋•Œ ๋งค์šฐ ์—‰์„ฑํ•˜๊ณ  ๊ฐ€๋…์„ฑ์ด ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. NodeMeterial ๋˜๋Š” ShaderMaterial ๋ฅผ ๋‹ค์‹œ ์กฐ๋ฆฝํ•˜๋Š” ๋ฐ ์ด๋ฏธ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

Unity๋ฅผ ์‚ดํŽด๋ณด์•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์…ฐ์ด๋” ๊ทธ๋ž˜ํ”„ ๋„๊ตฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ๊ณ ,

Btw ๋‚ด๊ฐ€ ์–ด๋–ป๊ฒŒ๋“  ์ด๊ฒƒ์„ ์ฐจ๋‹จํ–ˆ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ์ฐจ๋‹จ์„ ํ•ด์ œํ•˜์‹ญ์‹œ์˜ค. PR์€ 2015๋…„๋ถ€ํ„ฐ์ด๋ฉฐ, ์ €๋Š” 8์ผ ์ „์— ์ฒ˜์Œ ์‘๋‹ตํ–ˆ์Šต๋‹ˆ๋‹ค.

(์ด๊ฑด ์ข€ ์ฃผ์ œ๋„˜์–ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค..)
@pailhead Unity ์…ฐ์ด๋”๊ทธ๋ž˜ํ”„์šฉ: ๊ฒฝ๋Ÿ‰ ๋ Œ๋” ํŒŒ์ดํ”„๋ผ์ธ ํ…œํ”Œ๋ฆฟ์œผ๋กœ Unity ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Unity ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ฅผ ์—ด๊ณ  ์ตœ์‹  ๋ฒ„์ „์˜ Render-pipelines.light ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
๋‹ค์Œ์€ ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์ •ํ•  ๋•Œ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. https://youtu.be/Ar9eIn4z6XE?t=98

Sea3D Flow ์žฌ์งˆ ๋…ธ๋“œ ํŽธ์ง‘๊ธฐ(http://sea3d.poonya.com/flow/)๋Š” NodeMaterial ์„ ์ž‘์„ฑํ•œ ๋™์ผํ•œ ์‚ฌ๋žŒ์ธ @sunag๊ฐ€ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

@sunag ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
๊ฐ„์ ‘๊ด‘์„ ์–ด๋–ป๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ Œ๋”๋Ÿฌ์˜ ๊ฐ’์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ์–ด๋–ป๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

Sea3D Flow ๋จธํ‹ฐ๋ฆฌ์–ผ ๋…ธ๋“œ ์—๋””ํ„ฐ๋Š” three.js ์—๋””ํ„ฐ์™€ ๋™์ผํ•œ ๋…๋ฆฝ ์‹คํ–‰ํ˜•์ด ๋  ๊ฒƒ์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ผ๋ถ€๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๊นŒ? ์—ฌ์ „ํžˆ Sea3D ๋˜๋Š” three.js์™€ ๊ด€๋ จ๋œ ๋‹ค๋ฅธ ์ด๋ฆ„์ด ์ง€์ •๋ฉ๋‹ˆ๊นŒ? three.js ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋น„์ฃผ์–ผ ํŽธ์ง‘๊ธฐ๋ฅผ ์ถœ์‹œํ•ด ์ฃผ์‹  @sunag ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฌธ์ œ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์ „ํ˜€ ์—†์Šต๋‹ˆ๋‹ค.

@IARI

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

2016๋…„์˜ ์ด ๊ธ€์€ ์ „ํ˜€ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. Shader Frog๋ฅผ ๋ณด๋Š” ๊ฒƒ์€ ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด vim ๋Œ€ emacs ๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” Sublime Text๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜๊ณ  ๋‹น์‹ ์€ ๋‹ค๋ฅธ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ํ•œ ์‚ฌ๋žŒ์€ ์…ฐ์ด๋” ๊ฐœ๊ตฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ์€ three.js์˜ Sea3D ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

Shader Frog๊ฐ€ ์…ฐ์ด๋”๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฐฉ์‹์„ ์ข‹์•„ํ•˜์ง€๋งŒ Sea3D์™€ ๊ฐ™์€ ์˜คํ”ˆ ์†Œ์Šค๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

๋‹ค์Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํƒ€์‚ฌ ์ œํ’ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ Three์˜ ํ•ต์‹ฌ์— ๋„ฃ๋Š” ๊ฒƒ์€ ๋ถˆ๊ณต์ •ํ•œ ์ด์ ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ ์ •์น˜์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

@๋ณด์Šคํ„ด
NodeMaterial ์ด ์ฐฉ๋ฅ™ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ PR์„ ์ฐจ๋‹จ ํ•ด์ œํ•˜๊ณ  ์ผ์ƒ์œผ๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์— ๋‹ค๋ฅธ ๋ชฉ์†Œ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ์ฐจ๋‹จํ•˜๋ ค๊ณ  ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@pailhead ๋Š” ์ด ํ˜„์žฌ ์‹œ์ ์—์„œ NodeMaterials๋ฅผ ์ฝ”์–ด๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฒฉ๋ฆฌ๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์ €๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ํ•œ ๊ฐœ์ธ์—๊ฒŒ๋งŒ ๋งก๊ฒจ์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

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

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

์›นํŒฉ ๊ฐ™์€ ๊ฑธ ์‚ฌ์šฉํ•˜์‹œ๋‚˜์š”?

์–ด๋ฆฌ์„์€ ๋ฐฐ์—ด

.html ํŒŒ์ผ๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์–ด๋ฆฌ์„์€ ์ผ์ž…๋‹ˆ๋‹ค. ์›นํŒฉ์œผ๋กœ ์ž‘์—…ํ•˜๊ณ  ์ตœ์‹  JS ๊ตฌ๋ฌธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ GLSL์„ .glsl, .vs, .fs ํŒŒ์ผ๋กœ ์œ ์ง€ํ•˜๊ณ  ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ ๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

shader.fs:

void main(){
  gl_FragColor = vec4(1.);
} 

javascript (์—„๋งˆ ๋ด, ๋ฉ์ฒญํ•œ ๋ฐฐ์—ด์€ ์—†์–ด)

import mShader from './shader.fs'

๋‚ด ๊ด€์‹ฌ์‚ฌ๋Š” ๋‹น์‹ ์ด ๋ฌด์–ธ๊ฐ€๋ฅผ ์ฝ”๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ผ ํšจ๊ณผ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๊ตฌ์ฒด์ ์œผ๋กœ ๋ฌป๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์‹ ์˜ ํ•„์š”์— ๋งŽ์€ ๊ฐ€์น˜๋ฅผ ๋ณด์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. NodeMaterial ๋Š” ์ˆ˜์ฒœ ๊ฐœ์˜ "์ด ํšจ๊ณผ๋ฅผ ์–ด๋–ป๊ฒŒ ์Œ์˜ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ?" ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋ฌธ์„ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๋‹ต๋ณ€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”, ๋ฃจํฌ!

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

@IARI

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ฒŒ์‹œ๋ฌผ์— ๋ฌผ์Œํ‘œ๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์•„ ๊ท€ํ•˜์˜ ์งˆ๋ฌธ์„ ๋†“์ณค์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํ™•์‹คํžˆ ๊ฐœ์ธ์ ์ธ ์ฝ”๋”ฉ ์„ ํ˜ธ๋„์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์•„๋‹ˆ๋ผ, ๋‹ค๋ฅด๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ "์ด ์…ฐ์ด๋”๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?"๋ผ๋Š” ์งˆ๋ฌธ์ด ์Ÿ์•„์ง€๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ๊ฑฑ์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „์—๋Š” ์ด ๋ง‰๋Œ€๊ฐ€ ๊ฝค ๋†’์•˜์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ i don't know glsl ๋˜๋Š” "๋ฌธ์ž์—ด์˜ ์–ด๋ฆฌ์„์€ ๋ฐฐ์—ด"์„ ๋ณด๊ณ  ํฌ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋” ๋‚ฎ์œผ๋ฉด ๋ชจ๋‘๊ฐ€ ์…ฐ์ด๋”๋ฅผ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์˜ ์งˆ๋ฌธ์„ ์ฐพ์ง€ ๋ชปํ–ˆ์ง€๋งŒ ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€:

NodeMaterial๋กœ ToonShader๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋‚˜์š”?

์–ด๋–ค ๊ฒฝ์šฐ์— ๋‹ต์ด ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

NodeMaterial์ด ์ผ๋ถ€ ์ถ”์ƒํ™”๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
NodeMaterial์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํ† ๋ก ์„ ๋‚˜๋ˆ„๋ฉด ๋„์›€์ด ๋ ๊นŒ์š”? ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๋จผ ์˜›๋‚ (2015๋…„)๋กœ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒŒ์‹œ๋ฌผ์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค. NodeMaterial์€ /examples์— ์žˆ์œผ๋ฏ€๋กœ ์ด๋กœ๋ถ€ํ„ฐ ํˆฐ ์…ฐ์ด๋”๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ์—ด๊ฑฐ๋‚˜ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์— ๋Œ€ํ•ด ๊ตฌ์ฒด์ ์œผ๋กœ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‚˜๋จธ์ง€ ๋Œ€ํ™”๋Š” ์ƒˆ ๋ฌธ์ œ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

์ด ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์—๋Š” ํฌ๋Ÿผ์ด slack๋ณด๋‹ค ๋‚˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@pailhead , ์ด ์ „์ฒด ํ† ๋ก ์ด ์ƒ์‚ฐ์ ์ด์ง€ ์•Š๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ๊ณ  ๋‹น๋ฉดํ•œ ์‹ค์ œ ๋ฌธ์ œ์— ์ดˆ์ ์„ ๋งž์ถ˜ ์ƒˆ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@๋ณด์Šคํ„ด

์—ฌ๋Ÿฌ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

  • ๋…ธ๋“œ ๋จธํ‹ฐ๋ฆฌ์–ผ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ๋‹ค๋ฅธ ๊ด€๋ จ ๋ฐ ๊ด€๋ จ ์—†๋Š” PR์ด ์ฐจ๋‹จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์…ฐ์ด๋”๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ๋“ค์ด ํŠน์ • ์…ฐ์ด๋” ํšจ๊ณผ๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•

NodeMaterial๋กœ ToonShader๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋‚˜์š”?
์–ด๋–ค ๊ฒฝ์šฐ์— ๋‹ต์ด ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
NodeMaterial์ด ์ผ๋ถ€ ์ถ”์ƒํ™”๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
NodeMaterial์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ใ…‹ ใ…‹ ใ…‹. @bhouston์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค... ์ด๊ฒƒ์€ ๋‹จ์ง€ ๋†๋‹ด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งํ•˜๊ธฐ ์ „์— webgl_materials_nodes ์˜ˆ์ œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ?

์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด FunctionNode ์‚ฌ์šฉํ•˜๋Š” ํ‘œํ˜„์‹์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

toon

@sunag ์ €๋ฅผ ์˜คํ•ดํ•˜์‹  ๊ฒƒ ๊ฐ™์•„์š”. ์ด๊ฒƒ์ด ํ˜„์žฌ /examples ์žˆ๊ณ  /src ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์ด๊ฒƒ์ด ์ผ๋“ฑ ์‹œ๋ฏผ์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ์ด์œ ๊ฐ€ ๊ถ๊ธˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” 2015๋…„ @AndrewRayCode์— ์˜ํ•ด ์ œ๊ธฐ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ๋ฌธ์ œ๊ฐ€ 2015๋…„์œผ๋กœ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€ ๋‹ค์–‘ํ•œ ์ฃผ์ œ๋ฅผ ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ " whatever ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•"์„ ๋ฌป๋Š”๋‹ค๋ฉด ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ๋ผ๊ณ  ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด three.js์˜ ๋Œ€๋Œ€์ ์ธ ์ ๊ฒ€์ด ๋  ์˜ˆ์ •์ด๋ผ๋ฉด _(์ด๋ฅผ ์œ„ํ•ด ํŠน๋ณ„ํžˆ ๋‹จ์ผ์„ฑ์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋‹ค์†Œ ๋‘๋ ต์Šต๋‹ˆ๋‹ค)_ ๊ทธ๋Ÿฐ ์งˆ๋ฌธ์— ๋Œ€ํ•ด ์—ฌ๊ธฐ github์— ์ „์šฉ ์ง„ํ–‰ ์ค‘์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. - usage of NodeMaterial . ๋ง๊ทธ๋Œ€๋กœ ๋žœ๋ค(#14232)์„ ์š”์ฒญํ•˜์‹œ๋Š” ๋ถ„๋“ค์ด ์ด ๊ธ€์„ ์ฐธ๊ณ ํ•˜์…”์„œ ์†Œํ†ต์ด ํํŠธ๋Ÿฌ์ง‘๋‹ˆ๋‹ค. :)

์ตœ๊ทผ์— ํˆฐ ์…ฐ์ด๋”๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ์ง€๋งŒ ์„ , ํŠนํžˆ @WestLangley ์˜ ๋šฑ๋šฑํ•œ ์„ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ "ํˆฐ" ์…ฐ์ด๋”๊ฐ€ ํ•„์š”ํ•˜๋”๋ผ๋„ ๊ด‘์‚ฐ์€ ์™„์ „ํžˆ ๋‹ฌ๋ผ์กŒ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋˜ํ•œ NodeMaterial ๋กœ ๋šฑ๋šฑํ•œ ๋ผ์ธ์„ ํฌํŒ…ํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ˆ„๊ฐ€ ์–ผ๋งˆ๋‚˜ ์˜ค๋ž˜ ๊ฑธ๋ฆด์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ๋ชจ๋‘ ์—ฌ๊ธฐ์— ๋ณต์žกํ•˜๊ฒŒ ์–ฝํžŒ ๋‹ค์–‘ํ•œ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด FunctionNode๋ฅผ ์‚ฌ์šฉํ•œ ํ‘œํ˜„์‹์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‚ด๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ˆญ๊ณ ํ•œ ํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ShaderMaterial ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. FunctionNode . ์‹œ๊ฐ ํšจ๊ณผ๋ฅผ ๋งŒ๋“ค๋ฉด ์‹œ๊ฐ ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์ง€๋งŒ ์ด๊ฒƒ์€ ์ œ ์ทจํ–ฅ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์—ฌ๊ธฐ ์žˆ๋Š” ์ด์œ ๋Š” ์ด๊ฒƒ์ด ๋‹ค๋ฅธ PR์„ ์ฐจ๋‹จํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค :) ๋‚˜๋Š” ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ์ฐฉ๋ฅ™ํ•˜๋Š” ๊ฒƒ์ด ์‹ค์ œ๋กœ 3๋ช…์˜ ์ตœ์„ ์˜ ์ด์ต์ด๋ผ๋Š” ๊ฒƒ์„ ์–ผ๋งˆ ์ „์— ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์ด ๋Œ€ํ™”์˜ ์—‰ํ‚ด์„ ํ’€๋ฉด ์•„๋งˆ๋„ ์ผ์„ ์„œ๋‘๋ฅด๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์—์„œ ๋‚˜๋Š” @bhouston์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

https://github.com/mrdoob/three.js/issues/14232 ์Šค๋ ˆ๋“œ์—์„œ ๋…ธ๋“œ ๊ธฐ๋ฐ˜ ์…ฐ์ด๋” ๊ตฌํ˜„์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ๊ฐ€๋‚œํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•˜์ง€๋งŒ ๋‚ด ์ƒ๊ฐ์—๋Š” ๊ตฌํ˜„์ด ์™„์ „ํžˆ ๋ถ€์ ์ ˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ œ๊ฐ€ ๋„ˆ๋ฌด ๋ถ€์ •์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์ด์œ ์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ๊ตฌ์ฒด์ ์ธ ์ด์œ ๋ฅผ ์ œ์‹œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ดํ•ด๋„

๋…ธ๋“œ ๋ฐ ๋‹ค์–‘ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์ผ๋ถ€ ์ฝ”๋“œ๋ฅผ ์ฝ์€ ํ›„์—๋Š” ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๋‹ค๊ณ  ํ™•์‹คํžˆ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ณ€์ˆ˜ ์ด๋ฆ„์€ ์„ค๋ช…์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋Œ“๊ธ€์ด ์ „ํ˜€ ์—†์Šต๋‹ˆ๋‹ค
  • ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด ๋ชจํ˜ธํ•˜๊ฑฐ๋‚˜ ์™„์ „ํžˆ ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. (์˜ˆ: "๋นŒ๋“œ" ๋ฐฉ๋ฒ•์ด ๋ฌด์—‡์„ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ? - ์ถ”์ธก)

์ฝ”๋“œ ๊ตฌ์กฐ๊ฐ€ ์ •๋ง ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์Šค๋‹ˆํŽซ์„ ๊ณ ๋ คํ•˜์„ธ์š”.
https://github.com/mrdoob/three.js/blob/e2b49c017b2d1f37ab34317033a27df7b5a71d4d/examples/js/nodes/FunctionNode.js#L39 -L50

๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

return this.inputs.find(input => input.name === name);

"์ด๋จธ์ง• ์•„ํ‚คํ…์ฒ˜"

"๋…ธ๋“œ"๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ์ •์˜๋ฅผ ๋ฌป๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ "๋…ธ๋“œ" ์‚ฌ์ด์— ๊ณตํ†ต์ ์ด ๊ฑฐ์˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ชจํ˜ธํ•œ ๊ฐœ๋…์ธ ๊ฒƒ ๊ฐ™์•„์„œ Node.js์ฒ˜๋Ÿผ ๊ฝฅ๊ฝฅ๊ฑฐ๋ฆฌ๋ฉด ๋•ํƒ€์ดํ•‘์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. Node.js์ž…๋‹ˆ๋‹ค.

์šฐ๋ ค์˜ ๋ถ„๋ฆฌ

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

  • ๊ทธ๋ž˜ํ”„ ์ž‘์„ฑ
  • ํ™•์ธ
  • ์ค‘๊ฐ„ ํ‘œํ˜„ ์ž‘์„ฑ
  • ์ตœ์ ํ™”
  • GLSL๋กœ ์ปดํŒŒ์ผ

๊ทธ๊ฒƒ์€ ํ˜„์žฌ ์ฝ”๋“œ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค .

๊ฒฐ๋ก 

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

@Usnul ์šฐ๋ฆฌ๋Š” Three.JS์—์„œ "return this.inputs.find(input => input.name === name);"

๊ทธ ์ด์œ ๋Š” "=>"๊ฐ€ ๊ฐ ์ž…๋ ฅ์—์„œ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. for-loop ๋˜๋Š” while-loop์— ๋น„ํ•ด JavaScript์—์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ๋งค์šฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ ์ฝœ๋ฐฑ ์ง€ํ–ฅ ์ฝ”๋“œ ๋Œ€์‹  ๋ช…์‹œ์  ๋ฃจํ”„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋” ์žฅํ™ฉํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Three..JS๋Š” ๋ชจ๋‘ ์ด์™€ ๊ฐ™์œผ๋ฉฐ ์˜๋„์ ์ž…๋‹ˆ๋‹ค.

@Usnul , ๊ท€ํ•˜์˜ ๋””์ž์ธ ๋ฌธ์ œ๋Š” ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ผ๋ถ€ ๋ฆฌํŒฉํ† ๋ง์„ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋ชจ๋‘๊ฐ€ ๋‹น์‹ ์˜ ๋””์ž์ธ ์ž…๋ ฅ๊ณผ ๊ธฐ์—ฌ์— ๊ฐ์‚ฌํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. :)

๊ทธ ์ด์œ ๋Š” "=>"๊ฐ€ ๊ฐ ์ž…๋ ฅ์—์„œ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. for-loop ๋˜๋Š” while-loop์— ๋น„ํ•ด JavaScript์—์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ๋งค์šฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ ์ฝœ๋ฐฑ ์ง€ํ–ฅ ์ฝ”๋“œ ๋Œ€์‹  ๋ช…์‹œ์  ๋ฃจํ”„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋” ์žฅํ™ฉํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Three..JS๋Š” ๋ชจ๋‘ ์ด์™€ ๊ฐ™์œผ๋ฉฐ ์˜๋„์ ์ž…๋‹ˆ๋‹ค.

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

for(var i=0, count=array.length; i<count; i++){
    var element = array[i];
    ...
}

๋˜๋Š” ๋‹ค์Œ ํ˜•์‹์˜ 50์ค„ ๊ธธ์ด์˜ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

function complex(a){
  if(a){
      //do a ton of stuff
      ...
      return result;
  }
}

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

function complex(a){
  if(!a){
      //omg! not A?!11 
      return;
  }
  //do a ton of stuff
  ...
  return result;
}

@Usnul ์ด๋Ÿฌํ•œ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฆฌํŒฉํ† ๋ง์€ ์‰ฌ์›Œ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งž๋‚˜์š”? ์ €๋Š” Code Complete์˜ ์—ด๋ ฌํ•œ ์ง€์ง€์ž์ž…๋‹ˆ๋‹ค. ๊ทธ ์ฑ…์€ ์ €์—๊ฒŒ ๋งŽ์€ ์˜ํ–ฅ์„ ๋ฏธ์ณค์Šต๋‹ˆ๋‹ค.

@usnul ์ด๊ฒƒ์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์œผ๋ฉด ์ž์œ ๋กญ๊ฒŒ ๋ฆฌํŒฉํ† ๋งํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ์•„๋‹Œ์ง€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ ์œ„์— ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ œ ์ดํ•ด์ž…๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด ์˜ˆ์ œ(๋˜๋Š” ๋‹ค๋ฅธ ์ €์žฅ์†Œ)์— ์žˆ๋Š” ๋™์•ˆ ๊ตด์ ˆ ๊ธฐ๊ฐ€ ๋ฐœ์ƒ ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ์˜ฎ๊ฒจ์•ผ ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค .

@IARI

๋‚˜๋Š” ์ •๋ง๋กœ glsl์„ ์ž˜ ์•Œ์ง€ ๋ชปํ•˜๋ฉฐ , ๋˜ํ•œ ๊ทธ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ ํ‘œํ˜„์„ ์šฉ์„œ ํ•˜์‹ญ์‹œ์˜ค . ์“ฐ๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ณจ์น˜ ์•„ํ”ˆ ์ผ์ž…๋‹ˆ๋‹ค .

๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ์•„๋Š” ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ๋…ธ๋“œ๋Š” ์ง„์ •์œผ๋กœ ์šฐ์•„ํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋ฐฉ์‹์œผ๋กœ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ GLSL์„ ์•„์ฃผ ์ž˜ ์•ˆ๋‹ค๊ณ  ์ฃผ์žฅํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ๋ฐ”๋กœ๋Š” @usnul ์ด ์—ฌ๊ธฐ์— ์“ด ๋‚ด์šฉ๊ณผ @AndrewRayCode ๊ฐ€ ์ด์ „์— ์“ด ๋‚ด์šฉ์— ๋Œ€๋ถ€๋ถ„ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. GLSL์— ๋น„ํ•ด ๋…ธ๋“œ๊ฐ€ .

GLSL์„ ๋ชจ๋ฅธ๋‹ค๋ฉด ๋‹ค๋ฅธ ๊ฒƒ๊ณผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์–ด๋ ค์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜๊ฐ€ ์ง์ ‘ ์ž‘์„ฑํ•œ ๊ฒƒ์ฒ˜๋Ÿผ, ์šฐ๋ฆฌ๊ฐ€ judge on what you know ์ด๊ณ  ๊ท€ํ•˜๊ฐ€ ์ง์ ‘ you don't know glsl ๋ผ๊ณ  ๋งํ•œ ๊ฒฝ์šฐ ๊ท€ํ•˜์˜ ์ž…๋ ฅ์€ ๋ฉด์ฑ… ์กฐํ•ญ์œผ๋กœ ๋ฐ›์•„๋“ค์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. :)

๋‚ด๊ฐ€ ๋งํ•œ ๊ฒƒ์ฒ˜๋Ÿผ :

์ผ๋ณธ์€ ์ด ์ง€๊ตฌ์ƒ์—์„œ ๊ฐ€์žฅ ๋‚˜์œ ๊ณณ์ด์ง€๋งŒ... ์‹ค์ œ๋กœ ์ผ๋ณธ์— ๊ฐ€๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค."

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด ๋ชจํ˜ธํ•˜๊ฑฐ๋‚˜ ์™„์ „ํžˆ ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. (์˜ˆ: "๋นŒ๋“œ" ๋ฐฉ๋ฒ•์ด ๋ฌด์—‡์„ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ? - ์ถ”์ธก)

์™€, ์ด๊ฒŒ ๋ฐ‘์— ShaderMaterial ์ธ์ค„๋„ ๋ชฐ๋ž๋„ค์š”. ๋‚ด ์ƒ๊ฐ์— ์ด๊ฒƒ์€ THREE.WebGLRenderer ๊ฐ€ ์…ฐ์ด๋” ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

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

@pailhead ๊ทธ๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” ์‚ฌ๋ฌผ ์‚ฌ์ด์— ์ค‘๊ฐ„ ์ˆ˜์ค€์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์™œ์ด ์•Œ๋žŒ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. @mrdoob ์€ ํ›Œ๋ฅญํ•œ ์†”๋ฃจ์…˜์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฒƒ์„ ํ•ฉ๋ณ‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. NodeMaterial ๋ชจ๋“  ํ›Œ๋ฅญํ•œ PR, ๊ฐœ์„  ์‚ฌํ•ญ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ ํ•ต์‹ฌ์ ์ธ ํ†ตํ•ฉ์ด ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋” ๋งŽ์€ ์ž‘์—…์„ ํ†ตํ•ด ๊ฐœ์„ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@sunag ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ํŠน๋ณ„ํžˆ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ๊ณ  ๋ฌธ์„œ๋ฅผ ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ธฐ๊บผ์ด ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@sunag ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ํŠน๋ณ„ํžˆ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ๊ณ  ๋ฌธ์„œ๋ฅผ ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ธฐ๊บผ์ด ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํ›Œ๋ฅญํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ‹€๋ฆผ์—†์ด ๋งŽ์€ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ ๊ธฐ๋ฐ˜์˜ ๋จธํ‹ฐ๋ฆฌ์–ผ ์‹œ์Šคํ…œ์ด ๋†€๋ž๊ฒŒ ๋ณด์ด๊ณ  ํ‘œํ˜„๋ ฅ์ด ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด ์žฌ๋ฃŒ ์‹œ์Šคํ…œ์—์„œ ์ฝ”์–ด์˜ ๋…ธ๋“œ ๊ธฐ๋ฐ˜ ์žฌ๋ฃŒ ์‹œ์Šคํ…œ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ „ํ™˜ํ•ฉ๋‹ˆ๊นŒ? ๋‘ ์‹œ์Šคํ…œ์„ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ธ๊ฐ€ ์•„๋‹ˆ๋ฉด ๊ธฐ์กด ์‹œ์Šคํ…œ์„ ๋…ธ๋“œ ํ•˜๋‚˜๋กœ ๊ต์ฒดํ•  ๊ฒƒ์ธ๊ฐ€?

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ๊ฐ€ ๋„ˆ๋ฌด ์ปค์„œ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ๋”ฐ๋ผ์žก์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค...

๋‘ ์‹œ์Šคํ…œ์„ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ธ๊ฐ€ ์•„๋‹ˆ๋ฉด ๊ธฐ์กด ์‹œ์Šคํ…œ์„ ๋…ธ๋“œ ํ•˜๋‚˜๋กœ ๊ต์ฒดํ•  ๊ฒƒ์ธ๊ฐ€?

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

๋‚ด ํ”„๋กœ์ ํŠธ์— shadowMap์„ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

MeshStandardNodeMaterial์„ ์‚ฌ์šฉํ•˜๋Š” 2๊ฐœ์˜ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ์™€ ๋ฐฉํ–ฅ ์กฐ๋ช…์ด ์žˆ๋Š” ์žฅ๋ฉด์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์Šค์œ„์น˜๋ฅผ ์ผฐ๋‹ค
castShadow = ๋น›์— ๋Œ€ํ•ด true
๋‘ ๊ฐ์ฒด ๋ชจ๋‘์— ๋Œ€ํ•ด castShadow ๋ฐ ReceivingShadow๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
shadowEnabled = ๋ Œ๋”๋Ÿฌ์˜ ๊ฒฝ์šฐ true

์™œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?
MeshStandardNodeMaterial์˜ ๊ทธ๋ฆผ์ž ์†์„ฑ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์ด๊ฒƒ์ด ๋ชฉ์ ์ž…๋‹ˆ๊นŒ?

๋ˆ„๊ตฌ๋“ ์ง€ ๋‚˜๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
๊ฐ์‚ฌ ํ•ด์š”!

@ํด๋ผ์šฐ๋””์˜ค๋น„์˜ฌ๋ผ
์ง€์› ์งˆ๋ฌธ์€ stackoverflow ํฌ๋Ÿผ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

@sunag NodeMaterial ๊ฐ€ ์ถฉ๋ถ„ํžˆ ์•ˆ์ •์ ์ด์–ด์„œ TypeScript ์„ ์–ธ ํŒŒ์ผ ์ œ๊ณต์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— ์ฃผ์š” API ๋ณ€๊ฒฝ์„ ๊ณ„ํšํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ NodeMaterial ๊ฐ€ TS ์ง€์›์ด ์—†๋Š” ๋งˆ์ง€๋ง‰ ๋ชจ๋“ˆ ๊ทธ๋ฃน์ด๋ฏ€๋กœ ์ด ์ž‘์—…๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@sunag NodeMaterial์ด ์ถฉ๋ถ„ํžˆ ์•ˆ์ •์ ์ด์–ด์„œ TypeScript ์„ ์–ธ ํŒŒ์ผ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— ์ฃผ์š” API ๋ณ€๊ฒฝ์„ ๊ณ„ํšํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ NodeMaterial์ด TS๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋งˆ์ง€๋ง‰ ๋ชจ๋“ˆ ๊ทธ๋ฃน์ด๋ฏ€๋กœ ์ด ์ž‘์—…๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@Mugen87 ๋„ค, ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋ณด๋‹ค ์ถ”๊ฐ€ ์‚ฌํ•ญ์ด ๋” ๋งŽ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. TS ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค. ๐Ÿ‘

์ข‹์•„์š”, ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ TS ์ง€์›์ด ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค R017 ๐Ÿ™Œ

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