TIL 117 | Three.js 기초 - Materials

meow·2025년 3월 16일
0

Interactive

목록 보기
7/11
post-thumbnail

Three.js에서 Material은 3D 객체의 표면을 렌더링하는 방법을 정의하는 중요한 요소입니다. 각 Material은 빛과 상호 작용하는 방식, 색상, 반사율, 투명도 등의 속성을 결정합니다. Three.js에서는 다양한 Material을 제공하며, 각각의 특징이 다릅니다.

1. MeshBasicMaterial

조명(Light)의 영향을 받지 않는 가장 단순한 재질.
텍스처, 색상, 투명도 등의 속성만 적용됨.
사용 예: UI 요소, 배경, 항상 동일한 밝기를 유지해야 하는 개체.

🔹 주요 속성:

  • color: 기본 색상
  • map: 텍스처 맵 적용 가능
  • wireframe: 와이어프레임 모드 활성화 가능

아래의 두 방식은 동일하게 동작한다.

Texture

const material = new THREE.MeshBasicMaterial({ map: doorColorTexture })
const material = new THREE.MeshBasicMaterial()
material.map = doorColorTexture

Colors

하지만 색상을 수정하는 경우는 조금 다르다.

const material = new THREE.MeshBasicMaterial({ color: 'green' })
// 이 코드는 정상적으로 동작하지 않는다.
const material = new THREE.MeshBasicMaterial()
material.color = 'green'

색상은 Class로 되어있기 때문이다. 따라서 색상 생성자를 사용해서 입력해줘야 한다.

const material = new THREE.MeshBasicMaterial()
material.color = new THREE.Color('green')
material.color = new THREE.Color('#ff0000')

Etc

material.wireframe = true // wireframe 적용 여부

// opacity를 적용하기 위해서는 transparent === true 적용이 필요하다.
material.transparent = true
material.opacity = 0.5 

material.alphaMap = doorAlphaTexture

material.side = THREE.DoubleSide // 내부에도 material 적용
material.side = THREE.FrontSide // 앞면에만 material 적용
material.side = THREE.BackSide // 뒷면에만 material 적용

2. MeshNormalMaterial

표면의 법선(Normal) 방향을 시각적으로 표시하는 재질.
디버깅 및 법선 맵을 확인할 때 유용함.

🔹 주요 속성:

  • normalMap: 법선 맵 적용 가능
// MeshNormalMaterial
const material = new THREE.MeshNormalMaterial()

카메라를 기준으로 Material 표면을 x, y, z 축의 방향을 기준으로 색상으로 보여준다.

material.flatShading = true

3. MeshMatcapMaterial

const material = new THREE.MeshMatcapMaterial()
material.matcap = matcapTexture // cannot move the light(downside)

더 많은 레퍼런스 참고하기
https://github.com/nidorx/matcaps
https://www.kchapelier.com/matcap-studio/

4. MeshDepthMaterial

객체의 깊이(Depth)를 기반으로 렌더링하는 재질.
깊이에 따라 색상이 변화하는 효과를 줄 수 있음.
일반적으로 쉐도우 맵(Shadow Map)이나 특수 효과에 사용됨.

🔹 주요 속성:

  • depthPacking: 깊이 값을 변환하는 방법 설정.
// MeshDepthMaterial
const material = new THREE.MeshDepthMaterial()

5. MeshLambertMaterial

간단한 광원 반응을 적용하는 재질 (광량 계산에 Lambertian 반사 사용).
부드러운 확산 반사(Diffuse Lighting) 효과가 있지만, 반사광(Specular Light) 없음.
실시간 조명이 많을 경우 성능이 좋음.
MeshBasicMaterial과 동일한 속성을 제공하지만, 빛과 관련된 프로퍼티들이 있다는 차이가 있다.

🔹 주요 속성:

  • color
  • map
  • emissive: 자체 발광 색상
// MeshLambertMaterial
const material = new THREE.MeshLambertMaterial()

/**
 * Lights : 요렇게 빛을 활용 가능하다.
 */
const ambientLight = new THREE.AmbientLight(0xfffff, 1)
scene.add(ambientLight)
const pointLight = new THREE.PointLight(0xfffff, 30)
pointLight.position.set(2, 3, 4)
scene.add(pointLight)

6. MeshPhongMaterial

MeshLambertMaterial과 유사하지만, 반사광(Specular Highlight)을 표현 가능.
금속이나 반짝이는 표면을 표현할 때 유용함.
MeshLambertMaterial보다 퍼포먼스는 떨어지지만 지금 고려할 레벨은 아니다. 빛반사 조절은 shineness 프로퍼티로, 반사광의 색상은 specular 프로퍼티로 조절이 가능하다.

🔹 주요 속성:

  • specular: 반사광 색상 설정
  • shininess: 반짝임 정도 (값이 높을수록 광택이 강함)
// MeshPhongMaterial
const material = new THREE.MeshPhongMaterial()
material.shininess = 100
material.specular = new THREE.Color(0x1188ff)
material.side = THREE.DoubleSide

7. MeshToonMaterial

카툰(셀 셰이딩, Toon Shading) 스타일의 렌더링을 위한 재질.
밝기 단계를 계단식으로 나누어 애니메이션 스타일의 명암을 표현.

🔹 주요 속성:

  • gradientMap: 색상 단계를 조절하는 그라디언트 맵 적용 가능.
// MeshToonMaterial
const material = new THREE.MeshToonMaterial()
gradientTexture.minFilter = THREE.NearestFilter
gradientTexture.magFilter = THREE.NearestFilter
gradientTexture.generateMipmaps = false
material.gradientMap = gradientTexture // 색상의 단계를 설정할 수 있다.

gradientTexture 파일

const gradientTexture = textureLoader.load('./textures/gradients/5.jpg')

2단계

3단계

5단계

8. MeshStandardMaterial

실제 물리 기반(PBR) 렌더링을 적용하는 기본적인 재질.
조명의 영향을 받으며, 반사와 거칠기(Roughness) 등의 속성이 적용됨.
성능과 퀄리티 균형이 적절한 소재.

🔹 주요 속성:

  • metalness: 0(비금속) ~ 1(금속) 값으로 설정
  • roughness: 표면 거칠기 (0 = 매끈, 1 = 거침)
  • map, normalMap, metalnessMap, roughnessMap 등의 여러 맵 지원
// MeshStandardMaterial
const material = new THREE.MeshStandardMaterial()
material.metalness = 0.45
material.roughness = 0.65

Environment Map

주변 환경을 세팅해서 확인하면 반사가 잘 되고 있는 것을 확인해볼 수 있다.

import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js'

/**
 * Environment map
 */
const rgbeLoader = new RGBELoader()
rgbeLoader.load('./textures/environmentMap/2k.hdr', (map) => {
	map.mapping = THREE.EquirectangularReflectionMapping
	scene.background = map
	scene.environment = map
})

9. MeshPhysicalMaterial

MeshStandardMaterial의 확장 버전으로 더욱 세밀한 설정 가능.
반투명(Transparency), 굴절(Refraction), 광택(Clearcoat) 등의 추가 효과 제공.

🔹 주요 속성:

  • clearcoat: 자동차 도색 같은 광택층 추가
  • clearcoatRoughness: 광택층의 거칠기
  • transmission: 투명 효과 (유리 재질 표현)
// MeshPhysicalMaterial
const material = new THREE.MeshPhysicalMaterial()
material.metalness = 0
material.roughness = 0

투명도 적용한 결과

Material 선택 가이드**

재질조명 영향반사 효과주요 용도
MeshBasicMaterialUI 요소, 배경, 단순한 객체
MeshStandardMaterial✅ (금속, 거칠기)일반적인 PBR 재질
MeshPhysicalMaterial✅ (투명도, 굴절, 광택)유리, 물, 자동차 도색
MeshLambertMaterial기본 확산 조명
MeshPhongMaterial✅ (반짝이는 표면)금속, 플라스틱, 반짝이는 재질
MeshToonMaterial셀 셰이딩(카툰 스타일)
MeshDepthMaterial깊이 기반 특수 효과
MeshNormalMaterial법선 디버깅
ShadowMaterial바닥 그림자 전용
PointsMaterial입자 시스템 (Particle)

결론

Three.js에서 Material을 선택할 때는 조명 영향, 반사 효과, 성능 등을 고려해야 합니다.

  • 최적의 성능이 필요한 경우: MeshBasicMaterial
  • 일반적인 PBR(물리 기반 렌더링) 재질: MeshStandardMaterial
  • 반짝이는 표면이나 투명 효과: MeshPhysicalMaterial
  • 단순한 조명 반응: MeshLambertMaterial 또는 MeshPhongMaterial
  • 카툰 스타일 셰이딩: MeshToonMaterial
  • 그림자 효과: ShadowMaterial
  • 입자 시스템: PointsMaterial

이제 Three.js에서 원하는 효과에 맞게 적절한 Material을 선택할 수 있습니다! 🚀

Reference

List of IOR(Wikipedia)

profile
🌙`、、`ヽ`ヽ`、、ヽヽ、`、ヽ`ヽ`ヽヽ` ヽ`、`ヽ`、ヽ``、ヽ`ヽ`、ヽヽ`ヽ、ヽ `ヽ、ヽヽ`ヽ`、``ヽ`ヽ、ヽ、ヽ`ヽ`ヽ 、ヽ`ヽ`ヽ、ヽ、ヽ`ヽ`ヽ 、ヽ、ヽ、ヽ``、ヽ`、ヽヽ 🚶‍♀ ヽ``ヽ``、ヽ`、

0개의 댓글