์๋ ํ์ธ์.
์ ๋ 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
๋๋ ํธ์ง๊ธฐ๋ฅผ ๋ง๋ค๊ณ ์๋๋ฐ, ํ์ฌ ์ด๊ฒ์ด ์ธํฐํ์ด์ค๊ฐ ๋ ๊ฒ์
๋๋ค. ์์์ ์๋ฒ ๋์ด๊ณ ๋ณํ์ ์ ์ ์์น์
๋๋ค.
deferred shading์์๋ ์ฌ์ฉํ ์ ์๋๋ก ์ ๊ฒฝ์ ์ฐ๊ณ ์์ต๋๋ค. ์ด์ ๋ฐ์ฌ ๋ฐ ๊ตด์ ์ ๋ ฅ์ ์์ฑํฉ๋๋ค.
PR, ์ ์, ํ ์คํธ ๋ฐ ๊ฐ์ ์ฌํญ์ ํ์ํฉ๋๋ค.+1:
ํฅ๋ฏธ๋ก์ด!
@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
์ด๊ฒ์ ๋ด๊ฐ ๋ง๋ค๊ณ ์๋ ๋์ดํฐ์ ๋๋ค. ์์ : ํ ์ค์ฒ์ ๋ฒํผ์ ๋๋๊ทธ ์ค ๋๋กญ์ด๋ฉฐ ํฌ๋กฌ์์๋ง ์๋ํฉ๋๋ค.
๋๋ผ์ด, ๋ฌผ๊ฑด! ์ด๋ฐ ์ธ์์! ๊ทธ๊ฒ์ ์๋ฆ๋ค์ด.
๋๋ ๊ธฐ์ฌํ ์ ์๋ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ๊ณต์ ํ ์ ์์ต๋๊น? ๊ณต๊ณต 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
๋ฆผ ์
ฐ์ด๋ ์์
์์ญ ๋ฐ์ฌ ์
๋๋ฌด ๋ฉ์ ธ์ @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
๐ ๋ก๋ฉ์ด ์๋๋ค์.
๋๋ ๊ทธ๊ฒ์ ์์ํ๊ธฐ ์ํด ์์ ์ ๋ฃ์ ๊ฒ์ ๋๋ค. ์ ์ ์๋๋ฉด ๋์ค์ 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 ํ์ผ๋ก ๋ด๋ณด๋ด๊ณ ๋ก๋ํ๋ ๊ฒ์ด ํด๊ฒฐ์ฑ ์ ๋๋ค. ์ธ๋ถ ๋ฐํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
์ด ๊ทธ๋ํ ํธ์ง๊ธฐ๋ ์์ค ์ฝ๋๋ฅผ ๋ถ์ํ์ฌ ์ ์ฒด ์
ฐ์ด๋์ ํจ๊ป ์๋ํ ์ ์์ต๋๋ค. ์ฆ, ํน์ ์
ฐ์ด๋ ๋
ธ๋ ์ ํ์ด ํ์ํ์ง ์์ต๋๋ค. ์ด 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 ์ํํธ ๋ฐ๋
๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์๊ณผ์ ๋น๊ต๋ฅผ ์ํด Shader Frog ๊ทธ๋ํ ํธ์ง๊ธฐ๊ฐ ์ด์ ์๋ ์ค์ด๋ฉฐ "ํ์ด์ด ๊ฑท์ด์ฐจ๊ธฐ" ๋จ๊ณ์ ์์ต๋๋ค. Three.js ์ฝ์ด๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์๋ค๋ ์ ์ ๊ฐ์กฐํ๊ณ ์ถ์ต๋๋ค.
ShaderFrog๋ ํ์ฌ ๊ธฐ์กด ๋ ธ๋ ํธ์ง๊ธฐ๋ณด๋ค ๋ ๊ฐ๋ ฅํฉ๋๋ค. ๋ชจ๋ ์ ฐ์ด๋๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ์ดํดํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ ํ ๋ฌดํ ๋ ธ๋ ์ ํ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ค๋ธ์ ํธ์ ๊ฐ์ฅ์๋ฆฌ์๋ง ๋ฐ์ฌ๋ฅผ ์ ์ฉํ๋ ค๋ฉด ์กฐ๊ฐ ๋ฐ ์ ์ ์ ฐ์ด๋๊ฐ ์๋ ์์ ํ ๋ ๋ฆฝํ ์ ฐ์ด๋์ธ ๊ธ๋ก์ฐ ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
... ๋ฐ์ฌ ์ ฐ์ด๋๋ก ๊ณฑํฉ๋๋ค ...
...์ ฐ์ด๋ ๊ทธ๋ํ ์ฌ์ฉ...
๊ทธ๋ฆฌ๊ณ ํ๋ค! ๋ฐ์ฌ ๋ฆผ ์ ฐ์ด๋ .
์๋ฅผ ๋ค์ด ๋ค๋ฅธ ์ ฐ์ด๋ ๋ฑ์
์ด ํ๋ก์ธ์ค์ ํ์ํ ์ ์ผํ "๋ ธ๋ ์ ํ"์ 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
@sunag ์ค๋ ๋ฐค ์์ค ์ฝ๋๋ฅผ
% ^ & << >> ~ |
์ถ๊ฐ ํผ๋๋ฐฑ:
@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 ๋ฒ์ 4 + NodePass
http://sunag.github.io/sea3d/Labs/Three.JS-NodeMaterial/webgl_postprocessing_nodes.html
๋ฉ์ง๋ค!
ํ์ฒ๋ฆฌ๋ฅผ ์ํด ๋ ธ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ์ํ๋ ค๊ณ ํ์ง๋ง ์ฒซ ๋ฒ์งธ ๋ถ๋ถ์ด ์๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์์ต๋๋ค. ์ ์ฅ, ์๋ฆ๋ค์!
NodeMaterial ๋ฒ์ 5 + LightNode
http://sunag.github.io/sea3d/Labs/Three.JS-NodeMaterial/webgl_materials_nodes.html
ํผ๋ถ
ํฐ ์์ด๋ฉ
++ color-adjustment
๋ฐ plush
์.
๋์ด์ค!
subsurface scattering
:๋_๋ฏธ์:
์ด๊ฒ์ ํฅํ ์ ๋ฐ์ดํธ์์ ์๋ํ ์ ์๋ ์ผ์ข ์ ์ ฐ์ด๋์ ๋๋ค.
http://sunag.github.io/sea3d/Labs/Three.JS-NodeMaterial/webgl_materials_nodes.html
๐ฎ!
๋ฉ์ง 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
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;
//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) ] );
๋ช ๊ฐ์ง ์ถ๊ฐ ์ฌํญ:
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๋ก ์ฎ๊ฒจ์ ธ์ผ ํฉ๋๋ค.
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์ ๊ฐ์ ๊ฒ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ์๊ฐํ์ญ๋๊น?
์๋ฅผ ๋ค์ด ์ด ์ฅ๋ฉด์ด ์์ต๋๋ค.
๊ฐ ์ ์ ์๋ ๊ณ ์ ํ ์์์ด ์์ต๋๋ค. 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์์ ์์
์ ์์ํ๊ฒ ์ต๋๋ค. ์ง๊ธ์ ์ฌ์ ํ โโ์ฝ๋๋ฅผ ์ฝ๊ณ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ ค๊ณ ํฉ๋๋ค.
์ด๊ฒ์ ์์์ด ๋ฐ์ดํฐ (์จ๋, ์๋ ฅ ...) ๋นจ๊ฐ์ -> ๊ณ ์จ, ํ๋์ -> ์ ์จ์ ํด๋นํ๊ธฐ ๋๋ฌธ์ IsoColor๋ผ๊ณ ํ๋ ์ฌ์ฉ ์ฌ๋ก์
๋๋ค.
THREE.FunctionNode์ ๊ดํด์๋ ๋ด๊ฐ ๋งํ๋ฏ์ด colorMap์ผ๋ก ์ฌ์ฉ๋๋ ๋งค๊ฐ๋ณ์์ sampler2D๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค. ํฝ์ ์์์ texture2D()๋ก ๊ณ์ฐ๋๊ณ texture2D()์ ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ๋ด ์ฌ์ฉ์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ์ฐ๋ฉ๋๋ค. (์๋ฅผ ๋ค์ด ์จ๋). vec3 ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ์์ด๋์ด๋ ์ฌ์ฉ์์๊ฒ ์น์ํ๊ธฐ ์ํ ๊ฒ์ด์ง๋ง FunctionNode๋ sampler2D ๋งค๊ฐ๋ณ์๋ ์ง์ํ ์ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๊น?
๋๋ ์ง๊ธ ๋น์ ์ ํ์๋ฅผ ์ดํดํฉ๋๋ค! @dimarudol ์ ์ด๊ฒ๊ณผ ๋ค๋ฅธ ์ฌ๋๋ค์ ๋ฉ๋ชจ์ ๋ํ PR์ ๋ง๋ค ๊ฒ์ ๋๋ค ...
๊ฒ๋ค๊ฐ THREE.FunctionNode๋ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋์๋ง ์ฐ์ง๋ง ๋ฒํ ์ค ์ ฐ์ด๋์๋ ์ธ ์ ์๋ค๋ฉด ์ข์ง ์์๊น์?
๋๋ ์ด๊ฒ์ ํ ์คํธํ์ง ์์์ง๋ง ๊ทธ๋ ๊ฒ ์๊ฐํฉ๋๋ค.
๋ ๊ฐ์ง ์๋ฅผ ๋ ์ถ๊ฐํ์ต๋๋ค.
sampler2D
๋ triangle-blur
์์์ ์์ต๋๋ค.BufferAttribute
๋ custom-attribute
์์์ ์์ต๋๋ค.๊ทธ๊ฒ์ ์๋ํ์ง๋ง ๋๋ ์ฌ์ ํ ์ธ๋ จ๋ ์ฝ๋๋ฅผ ์ค ๊ฒ์ ๋๋ค ...
์ฐ์ ! ์ ๋ง ์ ํ์ จ์ต๋๋ค. ์ ์๊ฒ๋ ํจ๊ณผ๊ฐ ์์ต๋๋ค :์ค๋ง์ผ:
๋ค์ ํ ๋ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
์๋ ํ์ธ์ @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];
์ข ๋ "๋์์ธ"์ ์ธ ์๋ฅผ ๋ค์ด, ์ด ํ
์ค์ฒ๋ก ์ฐป์ฃผ์ ์์ ๊ตฌ๋ฉ์ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด:
๋ค์๊ณผ ๊ฐ์ด ํ๊ณ ์ถ์ต๋๋ค.
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
...
์๋ฃ r6 - https://github.com/mrdoob/three.js/pull/9636
์ํ๊ฐ 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 ํจ์๊ฐ ๋ฉ๋๋ค.
NodeMaterialLoader https://github.com/mrdoob/three.js/pull/13070
๋ ธ๋๊ฐ ์๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ์์ ์คํฌ๋ฆฐ์ท์์์ ๊ฐ์ด ์ด 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 ๋ก๋๋งต์ ์ด๋ป๊ฒ ๋ถํฉํ๋์ง์ ๋ํด ์๊ฒฌ์ ์ ์ํ์๊ฒ ์ต๋๊น?
์ด๋ก ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ฌ๋ฌ ๊ฐ์ง์ ๋ ธ๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ชจ๋ ๋
ธ๋ ํ์ผ์ ๋ํด 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๋ก ์ ์ฌํ๊ฒ ๊ฒฐํจ์ด ์์ต๋๋ค.
๋ฐ์ฝ๋ ์ดํฐ(์: #14206)๋ ํ์คํ ์ฌ์ฉ์์ ๊ด์ ์์ ์ด๊ฒ์ ๊ฐ์ ํฉ๋๋ค. ํ์ง๋ง ๋จธํฐ๋ฆฌ์ผ์ ํฅํ ๊ธฐ๋ฅ ๊ฐ๋ฐ์ด ๊ธฐ์กด ๋จธํฐ๋ฆฌ์ผ ์ ฐ์ด๋ ์์ ์ ์ ๋ ๋ณต์กํด์ง๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค๋ฉด, ์ ์๊ฐ์๋ ์ ์ง๋ณด์ ๊ฐ๋ฅ์ฑ์ ์ํ์ ๋๋ค.
๋ ธ๋ ์ฌ๋ฃ๋ ์๋ฒฝํ์ง ์์ง๋ง ๋ค๋ฅธ ๊ทธ๋ํฝ ๋๊ตฌ์์ ๋๋ฆฌ ์ฑํ๋๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ์ฃผ์ ์ด์ ์ด ์์ต๋๋ค.
์ด๊ฒ์ ์๋ง๋ 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
์ด๋ค ๊ฒ๊ณผ๋ ๊ฒฐํฉ๋์ง ์์์ผ๋ฉฐ ๋ฒ๋ค๋ก ์ ๊ณต๋์ง ์์์ต๋๋ค.
- ๋น๊ต์ ๋จ์ํ ๊ธฐ๋ฅ์ ๋ํด์๋ 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
- ์ฝ์ด ๋จธํฐ๋ฆฌ์ผ ์ ฐ์ด๋์ ๋ฌธ์์ด ์กฐ์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ฉฐ, ์ฝ์ด ๋จธํฐ๋ฆฌ์ผ ๋ณ๊ฒฝ์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ ์ด๋ ต๊ณ ๊นจ์ง๊ธฐ ์ฝ์ต๋๋ค.
๋ด ์์ ์ ์ด๊ฒ์ด onBeforeCompile
๋ก ์ด๋ฏธ ์ด๋ ์ ๋ ๊ฐ๋ฅํ์ง๋ง ์ด๋ฌํ ๋ณ๊ฒฝ์ ์ค๋ช
ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ์ด๋ ต๊ณ ์ทจ์ฝํ๊ฒ ๋ง๋ ๋ค๋ ๊ฒ์
๋๋ค. ๋๋ ์ด๋ฏธ ๋ด ์ง์
์ํ์์ ์ด๊ฒ์ ๋ํด ์์ ๋ป์ณค๊ณ ๊ทธ๊ฒ์ ์์กดํ๋ ๋ช ๊ฐ์ง ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ผ๋ง๋ ์ฐ์ฝํ์ง, ๋ง์ ์คํธ๋ ์ค๋ฅผ ์ ๋ฐํฉ๋๋ค :(
์ง์ ํ์ #14206 ๋ฐ์ฝ๋ ์ดํฐ๋ 3๋
๋์ ์์ฒด์ ์ผ๋ก ์ค๋จ๋ ์ด PR ๋๋ฌธ์ 1๋
์ด์ ์ค๋จ๋์์ต๋๋ค. ๋ด ์ฃผ๊ด์ ์ธ ๋๋์ #14206์ด ์ด๋ฌํ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๊ฐ๋ฅํ๊ณ ๋ ์ง๋ฃจํ๊ณ ๋ ์ทจ์ฝํ๊ฒ ๋ง๋ ๋ค๋ ๊ฒ์
๋๋ค. ์ด๋ฌํ ํฌํ
์์ฑ์ด ์ ์๋์ง ์๋ ํ ์ ๋์ ์ผ๋ก ์๋ฌด ์ํฅ๋ ๋ฏธ์น์ง ์๋ 30์ค์ ์ฝ๋์
๋๋ค. ์ฐ๋ฆฌ์๊ฒ ์ด๋ฏธ onBeforeCompile
์ ํํ๋ก ๋งค๋ฌ๋ฆด ๋ฐง์ค์ด ์ฃผ์ด์ง๋ค๋ฉด ์ข ๋ ์ธ๊ฐ์ ์ผ๋ก ๋ง๋ค์ง ์๊ฒ ์ต๋๊น? :์๋ค:
๊ฒฐ๊ตญ, ๋๋ ํ์ฉ ๊ฐ๋ฅํ ์ทจ์ฝ ์์ค๊ณผ ๊ทธ๋ ์ง ์์ ์์ค์ ์ค์ค๋ก ๊ฒฐ์ ํ๊ณ ์ถ์ต๋๋ค.
- ์์ ๊ฐ๋ค์๊ฒ ๋ ๋ค๊ฐ๊ฐ๊ธฐ
์ด๊ฒ์ด ์ํฐ์คํธ๊ฐ ์๊ฐ์ ๋๊ตฌ์ ๊ทธ๋ํ๋ฅผ ์ ์ฅํ ํ์์ ๊ฐ์ ธ์ผ ํ๋ ์ด์ ์
๋๋ค. "๊ตฌ์ด" GLSL์ด๋ ๋ฐํ์์ NodeMaterial
๋ฅผ ๋น๋ํ๋ ๊ฒ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์ฌ์ฉ์๊ฐ ์ ํํด์ผ ํฉ๋๋ค.
์ํฐ์คํธ๋ ์ ฐ์ด๋๋ฅผ ์์ฑํ ์ ์๊ณ ์์ง๋์ด๋ ๋ก๋ฉ ํ๋ก์ธ์ค๋ฅผ ์ต์ ํํ๊ธฐ ์ํด ์ ฐ์ด๋๋ฅผ "์ปดํ์ผ"ํ๋๋ก ์์ฒญํ ์ ์์ต๋๋ค. ํผ์ ์์ ํ๋ ์ํฐ์คํธ๋ ์ด๋ค ์ด์ ๋ก ๋ ์ฝ๋ค๊ณ ๊ฐ์ ํ๊ณ ๊ทธ๋ํ๋ฅผ ๋ก๋ํ ์ ์์ต๋๋ค("์ปดํ์ผ"์๋ ๋ ๋ง์ ๋ ธ๋ ฅ์ด ํ์ํฉ๋๋ค).
๋ํ ์ฌ๊ธฐ์์ ์์ ๊ฐ๋ ์ ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ๊ณ ๋ ค๋๋๊ฐ? ํ๊ท ์ ์ธ "์ํฐ์คํธ" ์ฌ์ฉ์์ ๋ชจ์ต, ์ ๋ํฐ๊ฐ ์๋ three.js๋ก ์์ ํ๋ ์ด์ ๋ฑ์ ํต๊ณ๊ฐ ์์ต๋๊น? ์ด๋ค ์ข ๋ฅ์ ํ์ดํ๋ผ์ธ์ ๋๊น? ๊ด๋ จ ์์ง๋์ด๊ฐ ์์ต๋๊น? ์ผ๋ถ ๊ธฐ์ ๋๋ ํ ๋ฆฌ์์ ์ฑํํ๋ ๋ฐฉ์์ผ๋ก three.js์ ํต์ ํ๋ ๋ ๋ฆฝ ์คํํ ๋๊ตฌ๊ฐ ์๋ ์ด์ ๊ฐ ๋ฌด์์ ๋๊น? ์ฃผ๋น 40,000 npm ๋ค์ด๋ก๋๋ ์ํฐ์คํธ๊ฐ ์๋๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค. ์ด๋ฌํ ์ข ๋ฅ์ ์ค์น๊ฐ ์ผ๋ถ ๋น๋ ๋๊ตฌ์์ ์ฌ์ฉ๋๊ณ ์์ผ๋ฉฐ ์๋์ผ๋ก ๊ฐ์ ธ์ฌ ๊ฐ๋ฅ์ฑ์ด ๊ฑฐ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
์ด๊ฒ๊ณผ ํฌ์ธํธ 2 ๋ชจ๋์์ ์ ์ฌ์ฉ ์ฌ๋ก์๋ ์ํฐ์คํธ๊ฐ ์๊ณ ์ผ๋ฐ์ ์ผ๋ก ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ํฌํจ๋์ง ์์ต๋๋ค. ์ ๋ ๋ด์ฅ๋ ์ฌ๋ฃ ์์ ๊ตฌ์ถ๋ ์ฌ๋ฃ ์์คํ ์ ์ฑ์ฅ์ํค๊ณ ์์ต๋๋ค. ๋๋ ์ ์ ์์ฑ, ๊น์ด ํ๋ง, ๋ค๋ฅธ ํด๋ฆฌํ ๋ฑ์ผ๋ก ๋ด ์์ ์ ์ผ๋ฐ์ ์ธ ์์ถ ํ๊ธฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ด๊ฐ ๊ด์ฌ ์๋ ๊ฒ์ ํด๋น ์ฝ๋๋ฅผ ์ฌ๋ด์์ ๊ตฌ์กฐํํ๊ณ ์์ ํด๋์ค์ ์์ ๋ด๋ถ ์์๋ฅผ ๋ ธ์ถํ๋ ๊ฒ์ ๋๋ค.
- ์ค์ง์ ์ผ๋ก ์ง๋ ฌํ ๋ถ๊ฐ๋ฅ
๋๋ ์ด๊ฒ์ ๋ํด ๋ง์ด ์์ง ๋ชปํ๋ฉฐ ์ด์ ์ ์ด ์ฃผ์ฅ์ ๋ค์ด๋ณธ ์ ์ด ์์ต๋๋ค. ๋๊ตฐ๊ฐ ๋์๊ฒ ๋ฌธ์ ๊ฐ ์๋ ๋ถ๋ถ์ ์ง์ ํ ์ ์๋ค๋ฉด ์ผ๋ถ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ณ ์ถ์ต๋๋ค. ๋ฌธ์ ์ ๋ํ ๋์ ๋งค์ฐ ์ ํ๋ ์ดํด(์๋ฌด๋ ์์)๋ก, ๋๋ ๋จ์ํ ์ฐ๊ธฐ์ ์ถฉ๋ถํ์ง ์์ ์ด์ ๋ฅผ ์ดํดํ์ง ๋ชปํฉ๋๋ค.
"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 ํ
์ค์ฒ์
๋๋ค.
๋ถํํ๋ ๋ด ๋ชจ๋ธ์์ ์ฃผ๋ณ ํ์์ ๋ณด์์ต๋๋ค.
๊ทธ๋ ๊ฒ ํ ์๊ฐ์ด ์์ต๋๊น?
์ด๊ฒ์ด ๋ด ์ง๋ฌธ์ ๊ฒ์ํ ์ฌ๋ฐ๋ฅธ ์ฅ์์ด๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๊ฐ์ฌ ํด์!
๊ธฐ์กด ๋ ธ๋ ๊ธฐ๋ฐ ๋๊ตฌ์์ 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 , ์ด ์ ์ฒด ํ ๋ก ์ด ์์ฐ์ ์ด์ง ์๊ฒ ๋์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ๋ซ๊ณ ๋น๋ฉดํ ์ค์ ๋ฌธ์ ์ ์ด์ ์ ๋ง์ถ ์ ๋ฌธ์ ๋ฅผ ๋ง๋ค ์๋ ์์ต๋๋ค.
@๋ณด์คํด
์ฌ๋ฌ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ๋ ๊ฒ์ ์ ์ธํ๊ณ ๋ ๋์ํฉ๋๋ค.
NodeMaterial๋ก ToonShader๋ฅผ ์ด๋ป๊ฒ ๋ง๋๋์?
์ด๋ค ๊ฒฝ์ฐ์ ๋ต์ด ๋ฌด์์ธ์ง ๊ถ๊ธํฉ๋๋ค.
NodeMaterial์ด ์ผ๋ถ ์ถ์ํ๋ฅผ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ ํ ์ ์์ต๋๋ค.
NodeMaterial์ ์ฌ์ฉํ์ฌ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
ใ
ใ
ใ
. @bhouston์ ๋์ํฉ๋๋ค... ์ด๊ฒ์ ๋จ์ง ๋๋ด์ผ ์ ์์ต๋๋ค. ๋งํ๊ธฐ ์ ์ webgl_materials_nodes
์์ ๋ฅผ ๋ณผ ์ ์์์ต๋๊น?
์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด FunctionNode
์ฌ์ฉํ๋ ํํ์์ ์ฐธ์กฐํ์ญ์์ค.
@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๋ ์ค์ ๋ก ๋ณด์กฐ ๊ตฌ์กฐ์ธ ๊ฒ์ผ๋ก ๋ฐํ์ก๊ธฐ ๋๋ฌธ์ ๋
ธ๋๋ฅผ ์์ฑํ๊ฑฐ๋ ๊ตฌ์ฑํ๋ ๊ณต์ฅ์
๋๋ค. ๋ด๊ฐ ๋งํ ์ ์๋ ํ ์ฌ๊ธฐ์์ ์ํํ ์๋นํ ๋๋ ทํ ์์
์ด ์์ต๋๋ค.
๊ทธ๊ฒ์ ํ์ฌ ์ฝ๋์์ ์ฐพ์ ์ ์๋ ๊ฒ์ด ์๋๋๋ค .
์ข์ ๋ฌธ์์ ์ฃผ์์ด ์์ผ๋ฉด ์ด ๊ตฌํ์ด ์์ ํ ๋ถ์ ์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฐ ๊ฒ๋ค์ด ์ ์๋ฆฌ์ ์์ผ๋ฉด ์คํ๊ฒํฐ ์ฝ๋์ ๋์์ธ ๋ถ์กฑ์ ๋ฌธ์ ์ ๋๋ค. ์ฆ, ๋๋ ๊ทธ๊ฒ์ด ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ ๋งค์ฐ ์ ์ฉํ ๊ฐ๋ ์ ์์ ๊ตฌํ์ด๋ผ๋ ๊ฒ์ ์ธ์ ํฉ๋๋ค.
@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
๐
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ข์์, ๋ค์ ๋ฆด๋ฆฌ์ค์์ TS ์ง์์ด ์ค๋น๋์์ต๋๋ค
R017
๐