π» material μ΄λ?
Material
μ 물체μ μκ°μ νΉμ±(μμ, κ΄ν, λ°μ¬, λΆν¬λͺ
λ λ±)μ κ²°μ μ§λ μν μ ν©λλ€.
π» material μ μ’ λ₯
three.js
μλ μ¬λ¬μ’
λ₯μ material
μ΄ μμΌλ©°, κ°κ°μ material
λ€μ Material
ν΄λμ€λ₯Ό μμλ°μ΅λλ€. λ°λΌμ material
λΌλ¦¬ 곡ν΅λ μμ±μ΄ μ‘΄μ¬ν©λλ€.
Material
μ μμ±μ μ§μ ν λμ λ°©λ²μ λκ°μ§ μμ΅λλ€. 첫λ²μ§Έλ μμ±μμ μμ±κ°μ λ겨주λ λ°©λ²μ΄κ³ ,
1
2
3
// ...μλ΅...
const material = new MeshBasicMaterial({ map: texture, color: "red" });
// ...μλ΅...
λλ²μ§Έλ setter
λ₯Ό ν΅ν΄ material
μμ± νμ λ°κΎΈλ κ²μ
λλ€.
1
2
3
4
5
// ...μλ΅...
const material = new MeshBasicMaterial();
material.map = texture;
material.color.set("red");
// ...μλ΅...
νκ°μ§ μ£Όμν μ μ setter
λ₯Ό ν΅ν΄ μμ λ³κ²½ν κ²½μ°, λ¨μ ν λΉμ΄ μλ λ©μλλ₯Ό μ¬μ©νλ€λ μ μ
λλ€. μ΄λ color
μμ±μ΄ THREE.Color
νμμ΄κΈ°λλ¬Έμ λ¬Έμμ΄λ±μ ν λΉν μ μκΈ° λλ¬Έμ
λλ€.
π¨βπ» MeshBasicMaterial
MeshBasicMaterial
μ κ°μ₯ λ¨μνκ³ κ°λ¨ν λ°©μμΌλ‘ 물체μ μΈνμ κ²°μ νλ material
μ
λλ€.
MeshBasicMaterial
μ λͺκ°μ§ μμ±λ€μ λ€μκ³Ό κ°μ΅λλ€.
π map
map
μμ±μ geometry
μ texture
λ₯Ό μ€μ ν΄μ£Όλ μ΅μ
μ
λλ€.
1
2
3
4
5
6
7
8
9
10
11
12
// ...μλ΅...
const textureLoader = new THREE.TextureLoader();
const texture = textureLoader.load("image-path");
const planeGeometry = new THREE.PlaneGeometry(1, 1);
const material = new THREE.MeshBasicMaterial();
material.map = texture;
const mesh = new THREE.Mesh(planeGeometry, material);
// ...μλ΅...
μ μ½λλ MeshBasicMaterial
μ texture
λ₯Ό μ μ©ν ν, PlaneGeometry
νλ©΄μ μ
ν μ½λμ
λλ€.
texture
λ₯Ό Albedo
λ‘ μ€μ ν ν μ€νν΄λ³΄λ©΄ μλμ κ°μ κ²°κ³Όκ° λμ΅λλ€.
π color
Material
μ μμμ μ€μ νλ μ΅μ
μ΄λ©° MeshBasicMaterial
μ κΈ°λ³Έ μμμ ν°μμ
λλ€.
1
2
3
4
5
// ...μλ΅...
const material = new THREE.MeshBasicMaterial();
material.color.set("red");
material.color = new THREE.Color("blue");
// ...μλ΅...
π wireframe
Wireframe
λ λλ§ μ¬λΆλ₯Ό κ²°μ νλ μμ±μ
λλ€.
1
2
3
// ...μλ΅...
material.wireframe = true;
// ...μλ΅...
π opacity
ν¬λͺ
λλ₯Ό κ²°μ νλ μμ±μΌλ‘ 0.0
~ 1.0
μ¬μ΄μ κ°μ κ°μ§λ©°, 0.0
μ κ·Όμ¬ν κ°μΌμλ‘ ν¬λͺ
ν΄μ§λλ€.
νκ°μ§ μ£Όμν μ μ transparent
μμ±μ true
λ‘ μ€μ νμ§ μμΌλ©΄ ν΄λΉ κ°μ΄ μ μ©λμ§ μμ΅λλ€.
1
2
3
4
5
6
// ...μλ΅...
const material = new THREE.MeshBasicMaterial();
material.color.set("yellow");
material.transparent = true;
material.opacity = 0.5;
// ...μλ΅...
μλλ μ μ½λλ₯Ό μ μ©ν κ²°κ³Όμ
λλ€. PlaneGeometry
μ ν¬λͺ
λκ° μ μ©λμ΄, λ€μ μλ BoxGeometry
κ° λ³΄μ΄λκ²μ μ μ μμ΅λλ€.
π alphaMap
Opacity texture
λ₯Ό μ€μ ν μ μλ μ΅μ
μ
λλ€.
ν΄λΉ μ΅μ
μ μ¬μ©νλ €λ©΄, opacity
μ΅μ
κ³Ό λ§μ°¬κ°μ§λ‘ transparent
λ₯Ό true
μ€μ ν΄ μ£Όμ΄μΌ ν©λλ€.
1
2
3
4
5
6
7
8
9
// ...μλ΅...
const albedoTexture = textureLoader.load("image-path");
const opacityTexture = textureLoader.load("image-path");
const material = new THREE.MeshBasicMaterial();
material.transparent = true;
material.map = albedoTexture;
material.alphaMap = opacityTexture;
// ...μλ΅...
texture
μμ μ΄ν΄λ³΄μλ―μ΄ opacity texture
μ ν°μμ 보μ΄λ λΆλΆμ κ²μμμ 보μ΄μ§ μλ λΆλΆμ μλ―Έν©λλ€. λ°λΌμ μ μ΄λ―Έμ§μ μ μΌ μΌμͺ½μ opacity texture
λ₯Ό PlaneGeometry
μ μ μ©νκ²λλ©΄ κ²μμ λΆλΆμ 보μ΄μ§ μμμ μ μ μμ΅λλ€(κ°μ΄λ° μ¬μ§). λν albedo texture
μ ν¨κ» μ μ©ν΄λ κ°μ₯μ리μ κ²μμ λΆλΆμ ν¬λͺ
νκ² μ²λ¦¬λ©λλ€(μ€λ₯Έμͺ½ μ¬μ§).
π side
μ΄λ λ©΄μ λ λλ§ ν μ§λ₯Ό κ²°μ νλ μ΅μ
μ
λλ€.
THREE.FrontSide
, THREE.BaskSide
, THREE.DoubleSide
μΈκ°μ κ°μ μ€μ ν μ μμΌλ©°, κ°κ° mesh
μ μλ©΄, λ·λ©΄, μλ©΄μ material
μ΄ μ μ©λ©λλ€. κΈ°λ³Έκ°μ THREE.FrontSide
μ
λλ€.
μ£Όμν μ μ THREE.DoubleSide
μΌ κ²½μ° λ©΄μ κ·Έλ €μ§λ μΌκ°νμ΄ λλ°°κ° λλ€λ κ²μ
λλ€.
π¨βπ» MeshNormalMaterial
MeshNormalMaterial
λ geometry
μ λ²μ (normal
)μ 보μ¬μ€λλ€.
μ¬κΈ°μ λ²μ μ΄λ, νΉμ μΌκ°νμ΄λ ν½μ
λ€μ΄ ν₯νλ λ°©ν₯μ μλ―Ένλ©° x
μΆμ λΉ¨κ°, y
μΆμ μ΄λ‘, z
μΆμ νλμμΌλ‘ ννν©λλ€. μ΄ λ λ²μ μ λ°©ν₯μ camera
μ μλμ μ
λλ€. μ¦ λ²μ 벑ν°μ λ°©ν₯μ΄ camera
μκ°μμ μ΄λλ₯Ό ν₯νκ³ μλμ§μ λ°λΌ λ¬λΌμ§λ€λ μλ―Έμ
λλ€. MeshNormalMaterial
μ λ³΄ν΅ λ²μ 벑ν°λ₯Ό λλ²κΉ
νκΈ° μν΄ λ§μ΄ μ¬μ©ν©λλ€.
1
2
3
// ...μλ΅...
const material = new THREE.MeshNormalMaterial();
// ...μλ΅...
κ° μ μ λ€μ λ²μ 벑ν°λ€μ΄ κ°λ¦¬ν€λ λ°©ν₯μ λ°λΌ μμμ΄ ννλλ©°, μ΄ μμλ€μ΄ μμ¬ μμ κ°μ κ²°κ³Όκ° λμ΅λλ€.
π flatShading
true
λ‘ μ€μ ν κ²½μ° flat shading
μΌλ‘ λ©΄μ λ λ¬λ§νκ² λ©λλ€.
1
2
3
// ...μλ΅...
material.flatShading = true;
// ...μλ΅...
true
λ‘ μ€μ ν κ²½μ°, νλμ λ©΄μ΄λ μΌκ°νμ μ μ λ€μ λͺ¨λ κ°μ λ²μ 벑ν°λ₯Ό κ°μ§κ² λκ³ μ΄λ λ©΄μ νννκ² λ§λλ κ²°κ³Όλ₯Ό λ³κ²λ©λλ€.
π¨βπ» MeshMatcapMaterial
MeshMatcapMaterial
μ MatCap(Material Capture β LitSphere) texture
μ μν΄ μ μλλ material
μ
λλ€. μ¬κΈ°μ MatCap texture
λ, κ΄μ, λ°μ¬μ κ°μ μ 보λ₯Ό ν¬ν¨νκ³ μλ texture
λ₯Ό λ§ν©λλ€.
MatCap texture
λ₯Ό mesh
μ μ μ©νκ² λλ©΄, camera
μ μλμ μΈ λ²μ 벑ν°μ λ°©ν₯μ λ°λΌ texture
λ‘ λΆν° μμ κ°μ Έμ€κ² λ©λλ€. λν texture
μ κ΄μκ³Ό λ°μ¬μ λν μ λ³΄κ° μκΈ°λλ¬Έμ, κ΄μμ λ°λ‘ μΆκ°ν΄μ£Όμ§ μμλ κ΄μμ λΉμΉκ² κ°μ ν¨κ³Όλ₯Ό μ€λλ€. μ΄λ μ€μ κ΄μμ μΆκ°ν κ² λ³΄λ€ μ±λ₯μμ μ΄μ μ΄ μμ΅λλ€.
νμ§λ§, μ€μ λ‘ κ΄μμ μΆκ°ν κ²μ μλκΈ° λλ¬Έμ, camera
μ λ°©ν₯κ³Ό 무κ΄νκ² νμ κ΄μμ μν ν¨κ³Όκ° νμ κ°λ€λ λ¨μ μ΄ μμ΅λλ€.
μλλ MatCap texture
μ μ΄λ₯Ό μ μ©ν mesh
μ μ΄λ―Έμ§μ
λλ€.
κ΄μμ μΆκ°νμ§ μμλλ°, κ΄μμ λΉμΆ ν¨κ³Όκ° μ μ©λ κ²μ λ³Ό μ μμ΅λλ€.
π map
MatCap texture
λ₯Ό μ§μ νλ μμ±μ
λλ€.
1
2
3
4
// ...μλ΅...
const material = new THREE.MeshMatcapMaterial();
material.matcap = matcapTexture;
// ...μλ΅...
π¨βπ» MeshDepthMaterial
MeshDepthMaterial
μ κ° ν½μ
μ κΉμ΄(depth)λ₯Ό λ λλ§ν©λλ€.
camera
μ κ°κΉμΈμλ‘, ν°μμΌλ‘ λ λλ§λλ©° λ©μ΄μ§μλ‘ κ²μμμΌλ‘ λ λλ§λ©λλ€.
1
2
3
// ...μλ΅...
const material = new THREE.MeshDepthMaterial();
// ...μλ΅...
μλλ MeshDepthMaterial
μ μ μ©ν κ²°κ³Όμ
λλ€.
π¨βπ» MeshLambertMaterial
MeshLambertMaterial
μ κ΄μμ λ°μνλ material
λ‘ κ΄νμ΄λ λ°μ¬μ (specular highlights - λ¬Όμ²΄κ° μ‘°λͺ
μ λ°μ λ, λνλλ λ°μ μ )μ΄ μλ 물체λ₯Ό ννν λ μ¬μ©λ©λλ€.
MeshLambertMaterial
μ λ°μ¬μ¨μ κ³μ°νκΈ° μν΄ λΉλ¬Όλ¦¬μ κΈ°λ°μ λ¨λ²μμ λͺ¨λΈ(non-physically based Lambertian model)μ μ¬μ©νλλ°, μ΄λ κ°κ³΅λμ§ μμ λ무λ λκ³Ό κ°μ νλ©΄μ ννν μ μμ§λ§, κ΄νμ΄ λλ νλ©΄μ νννμ§ λͺ»ν©λλ€. λν ν΄λΉ material
μ μ μ μμλ§ κ΄μμ κ³μ°ν©λλ€.
μ΄λ° νΉμ§λ€ λλ¬Έμ MeshLambertMaterial
μ κ΄μμ λ°μνλ λ€λ₯Έ material
λ€ λ³΄λ€ μ±λ₯λ©΄μμ λ°μ΄λ©λλ€.
1
2
3
4
5
6
7
8
9
10
// ...μλ΅...
const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);
scene.add(ambientLight);
const pointLight = new THREE.PointLight(0xffffff, 0.5);
pointLight.position.set(2, 3, 4);
scene.add(pointLight);
const material = new MeshLamberMaterial();
// ...μλ΅...
μ μ½λλ MeshLambertMaterial
μ μμ±νλ μ½λμ
λλ€.
MeshLambertMaterial
μ΄ κ΄μμ λ°μνλ material
μ΄κΈ° λλ¬Έμ, μμ κ°μ΄ κ΄μμ μΆκ°ν΄ μ£Όμ΄μΌ μ¬μ©ν μ μμ΅λλ€.
μλλ μ μ½λλ₯Ό μ€νμν¨ κ²°κ³Όλ‘, μ‘°λͺ μ μν΄ μκΈ΄ λ°μ¬μ μ΄λ κ΄νμ κ΄μ°°ν μ μμ΅λλ€.
π¨βπ» MeshPhongMaterial
κ΄μμ λ°μνλ material
λ‘, κ΄νμ΄λ λ°μ¬μ μ ννν΄μΌ ν λ μ¬μ©ν©λλ€.
MeshPhongMaterial
μ λ°μ¬μ¨μ κ³μ°νκΈ° μν΄ λΉλ¬Όλ¦¬μ κΈ°λ°μ Blinn-Phong
λͺ¨λΈμ μ¬μ©ν©λλ€. μ΄ λͺ¨λΈμ λ¨λ²μμ λͺ¨λΈκ³Ό λ¬λ¦¬, κ΄νμ΄ λλ νλ©΄μ ννν μ μμ΅λλ€. λν λͺ¨λ ν½μ
μμ κ΄μμ κ³μ°ν©λλ€.
π shininess
λ°μ¬μ (Specular highlights)μ΄ μΌλ§λ λΉλ μ§λ₯Ό κ²°μ νλ μμ±μ
λλ€.
λμμλ‘ λμ± λΉλκ²λλ©°, κΈ°λ³Έκ°μ 30 μ
λλ€.
1
2
3
4
// ...μλ΅...
const material = new THREE.MeshPhongMaterial();
material.shininess = 100;
// ...μλ΅...
μ μ΄λ―Έμ§λ κ°κ° shininess
μμ±μ 20, 100μΌλ‘ μ€μ ν κ²°κ³Ό μ
λλ€. 100μΌλ‘ μ€μ ν κ²½μ°κ° λ°μ¬μ μ΄ λ λΉλλ κ²μ λ³Ό μ μμ΅λλ€.
π specular
λ°μ¬μ μ μμ μ§μ νλ μ€μ μ
λλ€. κΈ°λ³Έκ°μ 0x111111
μ
λλ€.
1
2
3
4
5
// ...μλ΅...
const material = new THREE.MeshPhongMaterial();
material.shininess = 100;
material.specular = new THREE.Color("green");
// ...μλ΅...
μ μ½λλ₯Ό μ€νμν¨ κ²°κ³Όλ μλμ κ°μ΅λλ€.
π¨βπ» MeshToonMaterial
MeshToonMaterial
μ κ·ΈλΌλμΈνΈ 맡μ μ¬μ©νλ material
μ
λλ€.
ν¬ν€μ κ·ΈλΌλμΈνΈκ° κΈ°λ³ΈμΌλ‘ μ§μ λμ΄ μμ΄ μΉ΄ν°μ λλμ μ€λλ€. κ·ΈλΌλμΈνΈλ μ§μ μ€μ ν΄ μ€ μλ μμ΅λλ€.
1
2
3
// ...μλ΅...
const material = new THREE.MeshToonMaterial();
// ...μλ΅...
μ μ΄λ―Έμ§λ κΈ°λ³Έ κ·ΈλΌλμΈνΈκ° μ μ©λ MeshToonMaterial
μ
λλ€.
π gradientMap
MeshToonMaterial
μ κ·ΈλΌλμΈνΈλ₯Ό μ§μ ν΄ μ€ μ μλ μμ±μ
λλ€.
gradientMap
μ μ§μ ν΄μ€ λ μ£Όμν μ μ, magFilter
μ minFilter
λ₯Ό THREE.NearestFilter
λ‘ μ§μ ν΄ μ£Όμ΄μΌ νλ€λ κ²μ
λλ€.
1
2
3
4
5
6
7
8
// ...μλ΅...
gradientTexture.magFilter = THREE.NearestFilter;
gradientTexture.minFilter = THREE.NearestFilter;
gradientTexture.generateMipmaps = false;
const material = new MeshToonMaterial();
material.gradientMap = gradientTexture;
// ...μλ΅...
π¨βπ» MeshStandardMaterial
PBR
(Physically Based Rendering) μ κΈ°λ°μΌλ‘ ν material
λ‘, μμ μ΄ν΄λ³Έ material
λ€κ³Ό λ¬λ¦¬ μ‘°λͺ
κ³Ό μνΈμμ©νλ λ°©μμ ν¨μ¬ λ μ ννκ² ννν©λλ€ (νμ€ μΈκ³μ κ±°μ λΉμ·νκ² νν).
π roughness
Material
μ κ±°μΉ κΈ°(roughness)λ₯Ό νννλ μμ±μ
λλ€.
0.0
μΌ κ²½μ° νλ©΄μ΄ λ§€λλ¬μμ Έ κ±°μΈμ²λΌ λ°μ¬κ° μΌμ΄λλ©°, 1.0
μΌ κ²½μ° νλ©΄μ΄ μλμ μΌλ‘ κ±°μΉ μ΄μ Έ λ°μ¬κ° λ°μνμ§ μμ΅λλ€ (fully diffuse). κΈ°λ³Έκ°μ 1.0
μ
λλ€.
1
2
3
4
5
// ...μλ΅...
const material = new THREE.MeshStandardMaterial();
material.map = colorTexture;
material.roughness = 0;
// ...μλ΅...
μ κ²°κ³Όμμ roughness
κ° 0 μΈκ²μ΄ 1 λ³΄λ€ νλ©΄μ΄ λ§€λλ¬μ΄κ²μ μ μ μμΌλ©°, λ°μ¬μ λ μκ²Όμμ λ³Ό μ μμ΅λλ€.
π metalness
Material
μ κΈμμ±(metalness)μ νννλ μμ±μ
λλ€.
κΈμμ±μ λμ§ μλ material
μ 0.0
μ΄λ©°, κΈμμ±μ λλ material
μ 1.0
κ°μ κ°μ§λλ€. κΈ°λ³Έκ°μ 0.0
μ
λλ€.
π roughnessMap
Rough texture
λ₯Ό μ€μ ν μ μλ μμ±μ
λλ€.
λ§μ½ ν΄λΉ μμ±μ κ°μ΄ μ€μ λμλ€λ©΄, roughness
μμ±μ κΈ°λ³Έκ°μΌλ‘ μ€μ ν΄μΌ ν©λλ€. κ·Έλ μ§ μμΌλ©΄ κ°μ΄ λ°°κ° λ©λλ€.
1
2
3
4
// ...μλ΅...
const material = new THREE.MeshStandardMaterial();
material.roughnessMap = roughnessTexture;
// ...μλ΅...
π metalnessMap
Metalness texture
λ₯Ό μ€μ ν μ μλ μμ±μ
λλ€.
roughnessMap
κ³Ό λ§μ°¬κ°μ§λ‘, ν΄λΉ μμ±μ΄ μ€μ λμλ€λ©΄ metalness
μμ±μ κΈ°λ³Έκ°μΌλ‘ μ€μ ν΄μΌν©λλ€.
1
2
3
4
// ...μλ΅...
const material = new THREE.MeshStandardMaterial();
material.metalnessMap = metalnessTexture;
// ...μλ΅...
π aoMap
Ambient Occlusion texture
λ₯Ό μ μ©ν μ μλ μμ±μΌλ‘, texture
μμ μ΄λμ΄ λΆλΆμ κ·Έλ¦Όμλ₯Ό μΆκ°ν©λλ€.
1
2
3
4
// ...μλ΅...
const material = new THREE.MeshStandardMaterial();
material.aoMap = ambientOcclusionTexture;
// ...μλ΅...
μ κ·Έλ¦Όμ Ambient Occlusion texture
λ₯Ό μ μ©νκΈ° μ κ³Ό νμ μ΄λ―Έμ§ μ
λλ€.
μ μ©νκΈ° μ κ³Ό λΉκ΅νμ λ, texture
μ μ΄λμ΄ λΆλΆμ ν΄λΉνλ λΆλΆμ΄ mesh
μμ λ μ΄λμ μ‘μμ λ³Ό μ μμ΅λλ€.
π aoMapIntensity
aoMap
μμ μμν¨κ³Όλ₯Ό μΌλ§λ μ€κ²μΈμ§ μ€μ ν μ μλ μμ±μ
λλ€.
κΈ°λ³Έκ°μ 1
μ΄λ©°, 0
μΌλ‘ μ€μ ν μ ν¨κ³Όμ μ©μ΄ λμ§ μμ΅λλ€.
π displacementMap
Displacement Texture
λ₯Ό μ€μ νλ μμ±μ
λλ€.
1
2
3
4
// ...μλ΅...
const material = new THREE.MeshStandardMaterial();
material.displacementMap = displacementTexture;
// ...μλ΅...
μ μ΄λ―Έμ§λ μΌμͺ½μ Displacement texture
λ₯Ό μ€λ₯Έμͺ½μ SphereGeometry
μ μ μ©ν κ²°κ³Όμ
λλ€.
Displacement texture
μ μ€μ μ μ©λ κ²°κ³Όκ° λ€λ₯Έ κ²μ λ³Ό μ μλλ°, μ΄λ displacement texture
μ νΉμ§λλ¬Έμ κ·Έλ μ΅λλ€. texture
μμ μ΄ν΄λ³΄μλ―μ΄, ν΄λΉ texture
λ geometry
μ λ©΄λ€μ λλμ ν΄λΉ μ μ λ€μ λμ΄μ λ°λΌ λ³κ²½ν©λλ€. λ°λΌμ segment
κ° λμ μλ‘ μ κ΅ν΄μ§λλ€.
μλλ new THREE.SphereGeometry(1, 1000, 1000)
λ‘ segment
λ₯Ό μ¦κ°μν¨ ν μ μ©μν¨ κ²°κ³Όμ
λλ€.
π displacementScale
displacementMap
μ΄ mesh
μ μν₯μ λΌμΉλ μ λλ₯Ό μ§μ νλ μ΅μ
μ
λλ€.
κΈ°λ³Έκ°μ 1
μ΄λ©°, 0
μΌλ‘ μ€μ μ ν¨κ³Όκ° μ μ©λμ§ μμ΅λλ€.
π normalMap
Normal Texture
λ₯Ό μ μ©νλ μμ±μ
λλ€.
π alphaMap
Opacity texture
λ₯Ό μ€μ ν μ μλ μ΅μ
μ
λλ€.
π¨βπ» MeshPhysicalMaterial
MeshPhysicalMaterial
μ MeshStandardMaterial
κ³Ό κΈ°λ³Έμ μΌλ‘ κ°μ§λ§, clearcoat
μ΅μ
μΌλ‘ νλ©΄μ μ½ν
μΈκΈ°λ₯Ό μ€μ νκ³ clearcoatRoughness
λ‘ μ½ν
μ κ±°μΉ κΈ°λ₯Ό μ€μ νλ€λ μ μ΄ λ€λ¦
λλ€.
π¨βπ» PointsMaterial
Points
κ° κΈ°λ³ΈμΌλ‘ μ¬μ©νλ material
μ
λλ€.
π¨βπ» ShaderMaterial, RawShaderMaterial
Material
μ 컀μ€ν
ν λ μ¬μ©ν©λλ€.
ShaderMaterial
μ κ²½μ° three.js
μ shader
μμ€ν
μ μ¬μ©νμ§λ§, RawShaderMaterial
μ κ²½μ° κ·Έλ μ§ μλ€λ μ°¨μ΄μ μ΄ μμ΅λλ€.