인스턴스와 파라미터화
Material Instance, Dynamic Material Instance, 파라미터 그룹, Static Switch로 효율적 머티리얼 관리.
Material Instance 개념
하나의 마스터에서 무한한 변형 생성
Material Instance는 마스터 머티리얼의 파라미터 값만 변경하여 새로운 머티리얼 변형을 만드는 에셋입니다. 셰이더를 재컴파일하지 않으므로 매우 효율적입니다.
| 특성 | Material (마스터) | Material Instance |
|---|---|---|
| 셰이더 컴파일 | 노드 변경 시 재컴파일 | 파라미터 변경 시 재컴파일 없음 |
| 노드 그래프 | 편집 가능 | 편집 불가 (파라미터만 변경) |
| 생성 비용 | 높음 | 매우 낮음 |
| 런타임 변경 | 불가 | Dynamic Instance로 가능 |
프로젝트에서 마스터 머티리얼 수를 최소화하고, 대부분의 변형은 인스턴스로 만드세요. 예: "M_Master_Environment" 하나로 바위, 나무, 흙 등의 인스턴스를 생성. 이렇게 하면 셰이더 변형(퍼뮤테이션)을 줄여 메모리와 컴파일 시간을 절약합니다.
파라미터 노드 유형
인스턴스에서 조절 가능한 파라미터들
| 파라미터 노드 | 타입 | 용도 | 런타임 변경 |
|---|---|---|---|
| ScalarParameter | Float | Roughness, Intensity, Tiling 등 | 가능 |
| VectorParameter | Float4 | Color, UV Offset 등 | 가능 |
| TextureParameter | Texture | Base Color, Normal 텍스처 교체 | 가능 |
| StaticSwitchParameter | Bool | 기능 토글 (Normal Map 사용 여부 등) | 불가 (컴파일 시) |
| StaticComponentMaskParameter | Mask | 채널 선택 | 불가 (컴파일 시) |
// 파라미터 정리를 위한 그룹 설정
// 파라미터 노드의 디테일 패널에서:
Group: "01_BaseProperties"
Sort Priority: 0
// 그룹 이름 앞에 숫자를 붙이면
// 인스턴스 에디터에서 순서가 고정됩니다
// 예: "01_Color", "02_Surface", "03_Detail"
Parameter Name: "BaseColor_Tint"
Default Value: (1, 1, 1, 1)
Group: "01_Color"
Dynamic Material Instance
런타임에 파라미터를 변경하기
// 런타임에 머티리얼 파라미터 변경
// 1. Dynamic Instance 생성
UMaterialInstanceDynamic* MID =
UMaterialInstanceDynamic::Create(
BaseMaterialInstance, // 부모 (MI 또는 M)
this // Outer
);
MeshComp->SetMaterial(0, MID);
// 2. 파라미터 변경
MID->SetScalarParameterValue("Roughness", 0.3f);
MID->SetVectorParameterValue("Color",
FLinearColor(1, 0, 0, 1));
MID->SetTextureParameterValue("DiffuseTex", NewTexture);
// 블루프린트에서의 동적 머티리얼
Create Dynamic Material Instance
Target: Static Mesh Component
Source Material: MI_MyMaterial
→ Return: Dynamic Material Instance
Set Scalar Parameter Value
Target: Dynamic Material Instance
Parameter Name: "EmissiveIntensity"
Value: 5.0
Dynamic Material Instance는 매 프레임 생성하지 마세요. BeginPlay나 초기화 시 한 번 생성하고 레퍼런스를 저장해 두세요. 또한 같은 머티리얼이 적용된 여러 메시에서 각각 MID를 만들면 배칭(Batching)이 깨져 드로우콜이 증가합니다.
Static Switch Parameter
컴파일 타임 분기로 기능 토글
StaticSwitchParameter는 인스턴스에서 기능을 켜고 끌 수 있지만, 변경 시 셰이더가 재컴파일됩니다. 런타임 변경은 불가하나, 사용하지 않는 분기의 코드가 완전히 제거되므로 성능상 이점이 있습니다.
// 마스터 머티리얼에서 기능 토글
StaticSwitchParameter "UseDetailNormal"
True: BlendAngleCorrectedNormals(BaseNormal, DetailNormal)
False: BaseNormal
→ Normal 입력
StaticSwitchParameter "UseEmissive"
True: EmissiveColor * Intensity
False: (0, 0, 0)
→ Emissive Color 입력
// 인스턴스에서 체크박스로 활성화/비활성화
// 비활성화된 분기의 코드는 컴파일에서 제외
// → 불필요한 텍스처 샘플링 절약
각 Static Switch 조합마다 별도 셰이더가 컴파일됩니다. Switch가 3개면 최대 8개(2^3) 변형. 너무 많은 Static Switch는 셰이더 컴파일 시간과 메모리를 증가시킵니다. 5개 이하를 권장합니다.
핵심 요약
- Material Instance는 셰이더 재컴파일 없이 파라미터만 변경하여 머티리얼 변형을 만듭니다.
- 파라미터 유형: Scalar(Float), Vector(Float4), Texture, StaticSwitch(Bool).
- Dynamic Material Instance로 런타임에 파라미터를 변경하며, 초기화 시 한 번만 생성합니다.
- Static Switch는 컴파일 타임 분기로 미사용 코드를 제거하지만, 과다 사용은 퍼뮤테이션을 증가시킵니다.
- 파라미터 Group과 Sort Priority로 인스턴스 에디터의 UI를 정리합니다.
도전 과제
배운 내용을 직접 실습해보세요
Scalar Parameter(Roughness, Metallic), Vector Parameter(BaseColor), Texture Parameter(NormalMap)를 가진 마스터 머티리얼을 만들고, 3가지 이상의 Material Instance를 생성하여 서로 다른 표면을 표현하세요.
Static Switch Parameter를 사용하여 '눈 효과 활성화' 토글을 만드세요. ON일 때 월드 Z축 기준으로 눈 레이어가 추가되는 분기를 구성하고, 컴파일 결과 셰이더 수를 확인하세요.
블루프린트에서 CreateDynamicMaterialInstance로 MID를 생성하고, Timeline 노드와 SetScalarParameterValue를 사용하여 피격 시 Emissive가 플래시되는 히트 이펙트를 구현하세요.