ν™ˆ three.js material μ‚΄νŽ΄λ³΄κΈ°
포슀트
μ·¨μ†Œ

three.js material μ‚΄νŽ΄λ³΄κΈ°

πŸ’» 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-texture-plane

πŸ–Š 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 κ°€ λ³΄μ΄λŠ”κ²ƒμ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

basic-material-opacity-1

πŸ–Š 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;
// ...μƒλž΅...

opacity-texture-plane

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();
// ...μƒλž΅...

normal-material-1

각 μ •μ λ“€μ˜ 법선 벑터듀이 κ°€λ¦¬ν‚€λŠ” λ°©ν–₯에 따라 색상이 ν‘œν˜„λ˜λ©°, 이 색상듀이 μ„žμ—¬ μœ„μ™€ 같은 κ²°κ³Όκ°€ λ‚˜μ˜΅λ‹ˆλ‹€.

πŸ–Š flatShading

true 둜 μ„€μ •ν•  경우 flat shading 으둜 면을 λ ŒλŸ¬λ§ν•˜κ²Œ λ©λ‹ˆλ‹€.

1
2
3
// ...μƒλž΅...
material.flatShading = true;
// ...μƒλž΅...

true 둜 μ„€μ •ν•  경우, ν•˜λ‚˜μ˜ λ©΄μ΄λ‚˜ μ‚Όκ°ν˜•μ˜ 정점듀은 λͺ¨λ‘ 같은 법선 벑터λ₯Ό κ°€μ§€κ²Œ 되고 μ΄λŠ” 면을 ν‰ν‰ν•˜κ²Œ λ§Œλ“œλŠ” κ²°κ³Όλ₯Ό λ‚³κ²Œλ©λ‹ˆλ‹€.

normal-material-2

πŸ‘¨β€πŸ’» MeshMatcapMaterial

MeshMatcapMaterial 은 MatCap(Material Capture ⇔ LitSphere) texture 에 μ˜ν•΄ μ •μ˜λ˜λŠ” material μž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ MatCap texture λž€, 광원, λ°˜μ‚¬μ™€ 같은 정보λ₯Ό ν¬ν•¨ν•˜κ³  μžˆλŠ” texture λ₯Ό λ§ν•©λ‹ˆλ‹€.

MatCap texture λ₯Ό mesh 에 μ μš©ν•˜κ²Œ 되면, camera 에 μƒλŒ€μ μΈ 법선 λ²‘ν„°μ˜ λ°©ν–₯에 따라 texture 둜 λΆ€ν„° 색을 κ°€μ Έμ˜€κ²Œ λ©λ‹ˆλ‹€. λ˜ν•œ texture 에 광원과 λ°˜μ‚¬μ— λŒ€ν•œ 정보가 μžˆκΈ°λ•Œλ¬Έμ—, 광원을 λ”°λ‘œ 좔가해주지 μ•Šμ•„λ„ 광원에 λΉ„μΉœκ²ƒ 같은 효과λ₯Ό μ€λ‹ˆλ‹€. μ΄λŠ” μ‹€μ œ 광원을 μΆ”κ°€ν•œ 것 보닀 μ„±λŠ₯μƒμ˜ 이점이 μžˆμŠ΅λ‹ˆλ‹€.
ν•˜μ§€λ§Œ, μ‹€μ œλ‘œ 광원을 μΆ”κ°€ν•œ 것은 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ—, camera 의 λ°©ν–₯κ³Ό λ¬΄κ΄€ν•˜κ²Œ 항상 광원에 μ˜ν•œ νš¨κ³Όκ°€ 항상 κ°™λ‹€λŠ” 단점이 μžˆμŠ΅λ‹ˆλ‹€.

μ•„λž˜λŠ” MatCap texture 와 이λ₯Ό μ μš©ν•œ mesh 의 μ΄λ―Έμ§€μž…λ‹ˆλ‹€.

matcap-texture-box
광원을 μΆ”κ°€ν•˜μ§€ μ•Šμ•˜λŠ”λ°, 광원을 λΉ„μΆ˜ νš¨κ³Όκ°€ 적용된 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ–Š 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 을 μ μš©ν•œ κ²°κ³Όμž…λ‹ˆλ‹€.

depth-material-box-1

πŸ‘¨β€πŸ’» 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 이기 λ•Œλ¬Έμ—, μœ„μ™€ 같이 광원을 μΆ”κ°€ν•΄ μ£Όμ–΄μ•Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ•„λž˜λŠ” μœ„ μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œν‚¨ 결과둜, μ‘°λͺ…에 μ˜ν•΄ 생긴 λ°˜μ‚¬μ μ΄λ‚˜ 광택을 κ΄€μ°°ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

lambert-material-1

πŸ‘¨β€πŸ’» MeshPhongMaterial

광원에 λ°˜μ‘ν•˜λŠ” material 둜, κ΄‘νƒμ΄λ‚˜ λ°˜μ‚¬μ μ„ ν‘œν˜„ν•΄μ•Ό ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.
MeshPhongMaterial 은 λ°˜μ‚¬μœ¨μ„ κ³„μ‚°ν•˜κΈ° μœ„ν•΄ 비물리적 기반의 Blinn-Phong λͺ¨λΈμ„ μ‚¬μš©ν•©λ‹ˆλ‹€. 이 λͺ¨λΈμ€ λž¨λ²„μ‹œμ•ˆ λͺ¨λΈκ³Ό 달리, 광택이 λ‚˜λŠ” ν‘œλ©΄μ„ ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ λͺ¨λ“  ν”½μ…€μ—μ„œ 광원을 κ³„μ‚°ν•©λ‹ˆλ‹€.

πŸ–Š shininess

λ°˜μ‚¬μ (Specular highlights)이 μ–Όλ§ˆλ‚˜ 빛날지λ₯Ό κ²°μ •ν•˜λŠ” μ†μ„±μž…λ‹ˆλ‹€.
λ†’μ„μˆ˜λ‘ λ”μš± λΉ›λ‚˜κ²Œλ˜λ©°, 기본값은 30 μž…λ‹ˆλ‹€.

1
2
3
4
// ...μƒλž΅...
const material = new THREE.MeshPhongMaterial();
material.shininess = 100;
// ...μƒλž΅...

lambert-material-sphere-1

μœ„ μ΄λ―Έμ§€λŠ” 각각 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");
// ...μƒλž΅...

μœ„ μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œν‚¨ κ²°κ³ΌλŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

lambert-material-sphere-2

πŸ‘¨β€πŸ’» MeshToonMaterial

MeshToonMaterial 은 κ·ΈλΌλ””μ–ΈνŠΈ 맡을 μ‚¬μš©ν•˜λŠ” material μž…λ‹ˆλ‹€.
νˆ¬ν†€μ˜ κ·ΈλΌλ””μ–ΈνŠΈκ°€ 기본으둜 μ§€μ •λ˜μ–΄ μžˆμ–΄ 카툰의 λŠλ‚Œμ„ μ€λ‹ˆλ‹€. κ·ΈλΌλ””μ–ΈνŠΈλŠ” 직접 μ„€μ •ν•΄ 쀄 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

1
2
3
// ...μƒλž΅...
const material = new THREE.MeshToonMaterial();
// ...μƒλž΅...

toon-material-sphere-1

μœ„ μ΄λ―Έμ§€λŠ” κΈ°λ³Έ κ·ΈλΌλ””μ–ΈνŠΈκ°€ 적용된 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;
// ...μƒλž΅...

standard-material-roughness-1

μœ„ κ²°κ³Όμ—μ„œ roughness κ°€ 0 인것이 1 보닀 ν‘œλ©΄μ΄ λ§€λ„λŸ¬μš΄κ²ƒμ„ μ•Œ 수 있으며, λ°˜μ‚¬μ λ„ μƒκ²ΌμŒμ„ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ–Š metalness

Material 의 κΈˆμ†μ„±(metalness)을 ν‘œν˜„ν•˜λŠ” μ†μ„±μž…λ‹ˆλ‹€.
κΈˆμ†μ„±μ„ 띄지 μ•ŠλŠ” material 은 0.0 이며, κΈˆμ†μ„±μ„ λ„λŠ” material 은 1.0 값을 κ°€μ§‘λ‹ˆλ‹€. 기본값은 0.0 μž…λ‹ˆλ‹€.

standard-material-metalness-1

πŸ–Š 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;
// ...μƒλž΅...

standard-material-aomap-1

μœ„ 그림은 Ambient Occlusion texture λ₯Ό μ μš©ν•˜κΈ° μ „κ³Ό ν›„μ˜ 이미지 μž…λ‹ˆλ‹€.
μ μš©ν•˜κΈ° μ „κ³Ό λΉ„κ΅ν–ˆμ„ λ•Œ, texture 의 μ–΄λ‘μš΄ 뢀뢄에 ν•΄λ‹Ήν•˜λŠ” 뢀뢄이 mesh μ—μ„œ 더 μ–΄λ‘μ›Œ μ‘ŒμŒμ„ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ–Š aoMapIntensity

aoMap μ—μ„œ 음영효과λ₯Ό μ–Όλ§ˆλ‚˜ 쀄것인지 μ„€μ •ν•  수 μžˆλŠ” μ†μ„±μž…λ‹ˆλ‹€.
기본값은 1 이며, 0 으둜 μ„€μ •ν•  μ‹œ 효과적용이 λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

πŸ–Š displacementMap

Displacement Texture λ₯Ό μ„€μ •ν•˜λŠ” μ†μ„±μž…λ‹ˆλ‹€.

1
2
3
4
// ...μƒλž΅...
const material = new THREE.MeshStandardMaterial();
material.displacementMap = displacementTexture;
// ...μƒλž΅...

standard-material-displacement-1

μœ„ μ΄λ―Έμ§€λŠ” μ™Όμͺ½μ˜ Displacement texture λ₯Ό 였λ₯Έμͺ½μ˜ SphereGeometry 에 μ μš©ν•œ κ²°κ³Όμž…λ‹ˆλ‹€.
Displacement texture 와 μ‹€μ œ 적용된 κ²°κ³Όκ°€ λ‹€λ₯Έ 것을 λ³Ό 수 μžˆλŠ”λ°, μ΄λŠ” displacement texture 의 νŠΉμ§•λ•Œλ¬Έμ— κ·Έλ ‡μŠ΅λ‹ˆλ‹€. texture μ—μ„œ μ‚΄νŽ΄λ³΄μ•˜λ“―μ΄, ν•΄λ‹Ή texture λŠ” geometry 의 면듀을 λ‚˜λˆ„μ— ν•΄λ‹Ή 정점듀을 높이에 따라 λ³€κ²½ν•©λ‹ˆλ‹€. λ”°λΌμ„œ segment κ°€ 높을 수둜 μ •κ΅ν•΄μ§‘λ‹ˆλ‹€.

μ•„λž˜λŠ” new THREE.SphereGeometry(1, 1000, 1000) 둜 segment λ₯Ό μ¦κ°€μ‹œν‚¨ ν›„ μ μš©μ‹œν‚¨ κ²°κ³Όμž…λ‹ˆλ‹€.

standard-material-displacement-2

πŸ–Š displacementScale

displacementMap 이 mesh 에 영ν–₯을 λΌμΉ˜λŠ” 정도λ₯Ό μ§€μ •ν•˜λŠ” μ˜΅μ…˜μž…λ‹ˆλ‹€.
기본값은 1 이며, 0 으둜 μ„€μ •μ‹œ νš¨κ³Όκ°€ μ μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

standard-material-displacement-3

πŸ–Š normalMap

Normal Texture λ₯Ό μ μš©ν•˜λŠ” μ†μ„±μž…λ‹ˆλ‹€.

πŸ–Š alphaMap

Opacity texture λ₯Ό μ„€μ •ν•  수 μžˆλŠ” μ˜΅μ…˜μž…λ‹ˆλ‹€.

πŸ‘¨β€πŸ’» MeshPhysicalMaterial

MeshPhysicalMaterial 은 MeshStandardMaterial κ³Ό 기본적으둜 κ°™μ§€λ§Œ, clearcoat μ˜΅μ…˜μœΌλ‘œ ν‘œλ©΄μ˜ μ½”νŒ… μ„ΈκΈ°λ₯Ό μ„€μ •ν•˜κ³  clearcoatRoughness 둜 μ½”νŒ…μ˜ κ±°μΉ κΈ°λ₯Ό μ„€μ •ν•œλ‹€λŠ” 점이 λ‹€λ¦…λ‹ˆλ‹€.

πŸ‘¨β€πŸ’» PointsMaterial

Points κ°€ 기본으둜 μ‚¬μš©ν•˜λŠ” material μž…λ‹ˆλ‹€.

πŸ‘¨β€πŸ’» ShaderMaterial, RawShaderMaterial

Material 을 μ»€μŠ€ν…€ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.
ShaderMaterial 의 경우 three.js 의 shader μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•˜μ§€λ§Œ, RawShaderMaterial 의 경우 그렇지 μ•Šλ‹€λŠ” 차이점이 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“” 참고자료

metal key hole 001
matcaps
Materials

이 κΈ°μ‚¬λŠ” μ €μž‘κΆŒμžμ˜ CC BY 4.0 λΌμ΄μ„ΌμŠ€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.

three.js texture μ‚΄νŽ΄λ³΄κΈ°

three.js light μ‚΄νŽ΄λ³΄κΈ°