머티리얼
물체의 겉이 빛에 어떻게 반응하는지를 적어 둔 값 묶음입니다. 모양이 같아도 이 값이 다르면 금붙이로 보이기도 하고 고무로 보이기도 합니다. 색을 실제로 셈하는 쪽은 따로 있습니다. 머티리얼은 그 셈에 먹이는 값입니다.
상세
같은 나무 의자를 두고 하나는 니스를 칠하고 하나는 천을 씌웁니다. 앉는 자리도 다리 길이도 그대로인데 눈에 들어오는 것이 달라집니다.
머티리얼은 표면이 빛에 어떻게 반응하는지를 정하는 속성 묶음입니다. 바탕색이 무엇인지, 금속처럼 반사하는지, 표면이 매끄러운지 거친지 같은 값이 여기 모입니다. 이 값 묶음 하나를 만들어 두고 여러 물체에 붙여 쓸 수 있습니다.
모양과는 자리가 다릅니다. 정점과 삼각형이 이루는 것은 물체의 형상입니다. 머티리얼은 그 형상의 겉이 어떻게 보이는지만 정합니다. 같은 메시에 다른 머티리얼을 붙이면 형상은 그대로입니다. 겉만 바뀝니다. 반대로 같은 머티리얼을 다른 메시에 붙이면 모양만 다릅니다. 재질감은 같아집니다.
계산 절차와도 자리가 다릅니다. 빛을 실제로 셈하는 것은 셰이더입니다. 머티리얼은 그 셰이더에 들어가는 입력입니다. 셰이더를 갈아 끼우면 셈하는 방식이 바뀝니다. 머티리얼 값만 바꾸면 같은 방식으로 다른 결과가 나옵니다.
값을 주는 방법은 둘입니다. 하나는 숫자를 그대로 적는 것입니다. 표면 전체가 같은 값을 쓸 때 이렇게 합니다. 다른 하나는 텍스처로 두는 것입니다. 표면 위치마다 값이 달라야 할 때 텍스처를 씁니다. 한 표면 안에서 거칠기가 자리마다 달라야 하면 숫자 하나로는 모자랍니다.
flowchart TD
메시["메시 · 모양"] --> 셰이더
머티리얼["머티리얼 · 겉의 성질"] --> 셰이더
빛 --> 셰이더
셰이더 --> 픽셀["화면의 픽셀 색"]
모양과 겉의 성질과 빛이 셰이더로 들어갑니다. 셰이더는 그것들로 화면의 픽셀 색을 셈합니다. 머티리얼은 이 그림에서 셰이더가 아니라 셰이더로 들어가는 화살표 하나입니다.
배경
2012년 SIGGRAPH 코스 노트 「Physically-Based Shading at Disney」는 물리 기반 헤어 셰이딩을 먼저 성공시킨 뒤 더 넓은 범위의 재질에 물리 기반 셰이딩 모델을 검토하기 시작했다고 적습니다. 그런데 그 헤어의 조명을 씬의 나머지와 통합하는 일이 어려웠다고 적습니다. 씬의 나머지가 여전히 전통적인 임시 셰이딩 모델과 점광원을 쓰고 있었기 때문입니다.
그래서 필요한 것이 둘로 정리됐습니다. 재질끼리도 환경이 바뀌어도 조명 반응이 더 일관될 것. 그리고 조절 손잡이를 단순하게 만들어 작업 생산성을 높일 것. 같은 노트가 이후 작품에서는 모든 재질의 풍부함을 높이면서 이 둘을 함께 원했다고 적습니다.
답은 반사를 하나의 수식으로 모으고 그 수식의 파라미터만 물체마다 달리 주는 것이었습니다. 노트는
등방성 재질의 미세면 모델 일반형을 f(l, v) = diffuse + D(θh)F(θd)G(θl, θv) / (4 cos θl cos θv)
로 적습니다. D 는 미세면 분포 함수로 스펙큘러 피크의 모양을 맡습니다. F 는 프레넬 반사 계수입니다.
G 는 기하 감쇠 또는 그림자 인자입니다. 확산 항은 형태가 알려지지 않은 함수입니다. 램버트 확산이
흔히 가정되며 상수 값으로 표현됩니다. 이렇게 뽑아낸 파라미터 묶음을 물체마다 붙여 두고 다시
쓰는 것이 오늘날의 머티리얼입니다.
갈래
표면 반사를 어떤 파라미터 묶음으로 적느냐가 축입니다. 같은 금빛 표면이라도 어느 묶음을 고르느냐에 따라 적어 넣는 숫자가 달라집니다.
묶음의 이름과 범위는 자리마다 다릅니다. 저작 도구 Blender 의 매뉴얼은 머티리얼이 표면 셰이더 · 볼륨 셰이더 · 변위 세 부분으로 이뤄진다고 적습니다. 표면 셰이더가 메시 표면의 텍스처와 빛 상호작용을 맡습니다. 축 위에서 보면 표면 반사를 적는 자리는 이 셋 중 표면 셰이더 하나입니다. 나머지 둘은 표면 바깥을 맡습니다. 실시간 엔진 Unity 의 매뉴얼은 머티리얼이 셰이더 오브젝트에 대한 참조를 담고, 그 셰이더가 머티리얼 프로퍼티를 정의하면 색이나 텍스처 참조 같은 데이터도 함께 담는다고 적습니다. 축 위에서 보면 묶음의 내용이 미리 정해져 있지 않습니다. 어느 셰이더를 참조하느냐가 그 묶음을 정합니다. 아래 셋은 교환 포맷 glTF(GL Transmission Format) 2.0 이 표면 쪽 묶음에 붙인 이름입니다.
금속-거칠기
glTF 2.0 명세는 물리 기반 렌더링에서 널리 쓰이는 재질 표현을 바탕으로 공통 파라미터 집합을
정의하고, 그중 금속-거칠기 모델을 쓴다고 적습니다. 이 선언적 표현이 하나의 glTF 파일을 플랫폼을
가로질러 일관되게 렌더되게 한다고 적습니다. 값은 material 객체의 pbrMetallicRoughness
프로퍼티 아래 모입니다.
값은 셋입니다. 베이스 컬러는 재질의 바탕색입니다. 메탈니스는 0.0 이 비금속이고 1.0 이 금속입니다.
러프니스는 0.0 이 매끄러움이고 1.0 이 거침입니다. 베이스 컬러의 뜻이 메탈니스에 따라 갈립니다.
금속이면 베이스 컬러는 수직 입사에서 측정된 반사율입니다. 비금속이면 반사되는 확산 색입니다.
이 모델에서는 비금속의 수직 입사 반사율을 따로 지정할 수 없습니다. 선형 값 4퍼센트가 쓰입니다.
셋 다 필수가 아니고 기본값이 있습니다. baseColorFactor 는 [1,1,1,1], metallicFactor 와
roughnessFactor 는 각각 1 입니다. 숫자 대신 baseColorTexture · metallicRoughnessTexture
로 텍스처를 줄 수도 있습니다.
반사-광택
KHR_materials_pbrSpecularGlossiness 확장이 정의하는 묶음입니다. 확산 색 diffuseFactor,
스펙큘러 색 specularFactor, 광택 glossinessFactor 로 적습니다. 금속이냐 비금속이냐를
0 과 1 사이에서 고르는 대신 스펙큘러 색을 직접 줍니다. 확장 문서는 광택이 금속-거칠기 모델의
러프니스와 이어져 있으며 glossiness = 1 - roughness 로 정의된다고 적습니다.
이 확장의 상태는 archived 입니다. 문서는 Khronos 그룹이 비준했으나
KHR_materials_specular 로 대체됐다고 적습니다.
언릿
KHR_materials_unlit 확장입니다. 코어 명세가 주는 물리 기반 렌더링 셰이딩 모델 대신 조명을
쓰지 않는 셰이딩 모델을 씁니다. 확장 문서가 드는 동기는 셋입니다. 자원이 제한된 모바일 기기라
성능 대안이 필요한 경우. 이미 조명 정보가 들어 있어 조명을 더 얹으면 안 되는 포토그래메트리.
그리고 애니메이션풍이나 손그림풍처럼 조명이 미적으로 바람직하지 않은 스타일라이즈드 재질입니다.
새 프로퍼티를 하나도 추가하지 않습니다. 문서는 이것이 사실상 언릿 셰이딩 모델을 쓰겠다는 불리언 플래그라고 적습니다. 확장이 붙으면 베이스 컬러와 알파 값과 정점 색은 그대로 쓰고, 기본 물리 기반 렌더링 모델의 조명 · 색 관련 프로퍼티는 전부 무시합니다.
예시
glTF 2.0 의 gold 머티리얼
명세가 금속-거칠기 파라미터로 금빛 재질을 정의하는 방법으로 드는 JSON(JavaScript Object Notation) 한 덩이입니다.
{
"materials": [
{
"name": "gold",
"pbrMetallicRoughness": {
"baseColorFactor": [1.000, 0.766, 0.336, 1.0],
"metallicFactor": 1.0,
"roughnessFactor": 0.0
}
}
]
}
metallicFactor 가 1.0 이므로 이 재질은 금속입니다. 그래서 baseColorFactor 는 바탕색이
아니라 수직 입사에서 측정된 반사율로 읽힙니다. 명세는 이 배열의 원소가 저마다 0 이상 1 이하여야
한다고 적습니다. roughnessFactor 가 0.0 이라 표면은 매끄러운 쪽 끝입니다. 값 셋만으로
금붙이 하나가 정해집니다.
UsdPreviewSurface 의 입력
USD(Universal Scene Description) 쪽의 미리보기용 표면 노드입니다. 노드 아이디는
UsdPreviewSurface 입니다. 입력마다 타입과 폴백 값이 정해져 있습니다.
| 입력 | 타입 | 폴백 |
|---|---|---|
diffuseColor |
color3f |
(0.18, 0.18, 0.18) |
emissiveColor |
color3f |
(0.0, 0.0, 0.0) |
useSpecularWorkflow |
int |
0 |
metallic |
float |
0.0 |
roughness |
float |
0.5 |
useSpecularWorkflow 가 두 모드를 가릅니다. 명세는 이 노드가 근본적으로 두 모드로 동작한다고
적습니다. specularColor 입력에 텍스처나 값을 주는 반사 워크플로, 또는 metallic 입력에
텍스처나 값을 주는 메탈릭 워크플로입니다. 메탈릭 워크플로에서는 diffuseColor 가 알베도로
해석됩니다. metallic 이 1 이면 0도 입사에서의 반사율도 에지 반사율도 모두 알베도가 됩니다.
roughness 는 스펙큘러 로브의 거칠기입니다. 값은 0 에서 1 까지 갑니다. 0.0 의 완전 스펙큘러
표면에서 시작해 스펙큘러 로브의 최대 거칠기인 1.0 에 이릅니다. 앞의 gold 머티리얼과 이름은 다르지만
고르는 축은 같습니다.
관련 항목
머티리얼이 자리 잡는 그래픽스 파이프라인
그래픽스 · 렌더링 · 래스터화 · 셰이더 · GPU · HLSL
머티리얼 선택에 영향을 주는 실무 맥락
머티리얼 값을 실어 나르는 자료
텍스처 · 텍스처 좌표 · 노멀 맵 · 밉맵 · 알베도 · 정점 색 · 변위
머티리얼과 맞세워지는 형상 개념
머티리얼 반사 계산의 바탕이 되는 개념과 연구
물리 기반 렌더링 · 미세면 모델 · 프레넬 반사 · 램버트 확산 · 스펙큘러 · 점광원 · BRDF(Bidirectional Reflectance Distribution Function, 양방향 반사율 분포 함수) · Phong · Cook-Torrance · SIGGRAPH
머티리얼 값이 거치는 색 처리 단계
머티리얼을 정의하거나 구현하는 표준과 제품
glTF · USD · Blender · Unity · Khronos Group
머티리얼 예시를 적을 때 쓰는 표기와 구조
다른 이름: material · 재질