Material Function
재사용 가능한 머티리얼 함수 작성, 입출력 정의, 라이브러리 구성 전략.
Material Function 개념
머티리얼의 서브루틴
Material Function은 프로그래밍의 함수와 같습니다. 노드 그래프 조각을 독립 에셋으로 캡슐화하여 여러 머티리얼에서 재사용합니다.
재사용성
한 번 만들면 모든 머티리얼에서 노드처럼 사용. 수정하면 사용처 모두에 반영.
캡슐화
복잡한 로직을 하나의 노드로 감싸 그래프를 깔끔하게 유지.
라이브러리 가능
"Expose to Library" 옵션으로 팔레트에서 바로 검색 가능.
// Material Function 생성
콘텐츠 브라우저 → 우클릭 → Materials → Material Function
// 이름 규약 (권장)
MF_접두어 + 기능명
MF_HeightBlend
MF_TriplanarProjection
MF_WindAnimation
MF_EmissivePulse
입출력 정의
FunctionInput / FunctionOutput 노드
// Material Function 내부 구조
FunctionInput 노드들 (입력 정의)
Input Name: "BaseUV"
Input Type: Vector2
Preview Value: (0, 0)
Use Preview as Default: true
Sort Priority: 0
FunctionInput
Input Name: "Tiling"
Input Type: Scalar
Preview Value: 1.0
Use Preview as Default: true
// 로직 (노드 그래프)
BaseUV → Multiply (by Tiling) → 처리...
FunctionOutput 노드 (출력 정의)
Output Name: "Result"
→ 최종 결과 연결
// FunctionOutput은 여러 개 가능 (다중 출력)
이 옵션을 켜면 함수를 사용할 때 해당 입력을 연결하지 않아도 Preview Value가 기본값으로 사용됩니다. 선택적 입력(Optional Input)을 만들 때 유용합니다.
실전 Material Function 예제
자주 만드는 유틸리티 함수
MF_HeightBlend
// 높이맵 기반 블렌딩 함수
// 입력:
// HeightA (Scalar) - 레이어 A 높이
// HeightB (Scalar) - 레이어 B 높이
// BlendAlpha (Scalar) - 블렌딩 비율 (0~1)
// Contrast (Scalar, 기본 0.2) - 경계 날카로움
// 로직:
float hA = HeightA * (1 - BlendAlpha);
float hB = HeightB * BlendAlpha;
float ma = max(hA, hB) - Contrast;
float b1 = max(hA - ma, 0);
float b2 = max(hB - ma, 0);
return b2 / (b1 + b2); // 출력: BlendFactor
MF_EmissivePulse
// 맥동 Emissive 함수
// 입력:
// Color (Vector3)
// MinIntensity (Scalar, 기본 0.5)
// MaxIntensity (Scalar, 기본 3.0)
// Speed (Scalar, 기본 1.0)
Time * Speed → Sine → * 0.5 + 0.5
→ Lerp(MinIntensity, MaxIntensity)
→ Multiply(Color)
→ Output: EmissiveColor
라이브러리 구성 전략
프로젝트 머티리얼 함수 체계화
// 머티리얼 함수 라이브러리 구조
Content/Materials/Functions/
├─ Blend/
│ ├─ MF_HeightBlend
│ ├─ MF_AngleBlend
│ └─ MF_DistanceBlend
├─ UV/
│ ├─ MF_TriplanarProjection
│ ├─ MF_PolarCoordinates
│ └─ MF_ParallaxOcclusionMapping
├─ Effect/
│ ├─ MF_EmissivePulse
│ ├─ MF_DissolveEffect
│ └─ MF_RimLight
├─ Utility/
│ ├─ MF_ChannelPack
│ ├─ MF_NormalIntensity
│ └─ MF_CheapContrast
└─ Weather/
├─ MF_SnowCoverage
├─ MF_Wetness
└─ MF_WindAnimation
Material Function의 디테일 패널에서 Expose to Library = true로 설정하면, 머티리얼 에디터의 팔레트에서 이름으로 검색하여 바로 사용할 수 있습니다. Library Categories에 카테고리를 지정하면 팔레트에서 분류됩니다.
핵심 요약
- Material Function은 노드 그래프 로직을 독립 에셋으로 캡슐화하여 재사용합니다.
- FunctionInput/Output 노드로 입출력을 정의하며, Preview Value로 기본값을 설정합니다.
- HeightBlend, TriplanarProjection, EmissivePulse 등을 함수로 만들어 재사용합니다.
- Expose to Library로 팔레트에서 검색 가능하게 하고, 폴더로 카테고리별 정리합니다.
- 함수 수정 시 사용하는 모든 머티리얼에 자동 반영되므로, 일관된 수정이 가능합니다.
도전 과제
배운 내용을 직접 실습해보세요
UV 회전 기능을 Material Function으로 만드세요. Input으로 UV와 RotationAngle을 받고, sin/cos를 사용하여 회전된 UV를 Output으로 반환하세요. 여러 머티리얼에서 이 함수를 재사용하세요.
두 텍스처를 Height Map 기반으로 자연스럽게 블렌딩하는 Material Function을 만드세요. Contrast 파라미터로 경계의 날카로움을 조절하고, 지형 머티리얼에 적용하세요.
프로젝트 공용 Material Function 라이브러리를 설계하세요: UV 유틸리티(타일링, 회전, 왜곡), 블렌딩(Height, Angle), 이펙트(디졸브, 프레넬 글로우)를 각각 함수화하고 폴더 구조를 정리하세요.