언리얼 엔진의 머티리얼 인스턴싱 은 비용이 높은 머티리얼 리컴파일링 없이 머티리얼의 외형을 바꾸는 데 사용됩니다.
일반적인 머티리얼은 (게임플레이 이전에 반드시 수행해야 하는) 리컴파일 없이는 변경이 불가능하지만, 파라미터화된 머티리얼은 머티리얼 인스턴스에서 리컴파일 없이 편집할 수 있습니다. 이 방식은 워크플로 측면에서 다양한 장점이 있으며, 머티리얼 퍼포먼스를 향상시킬 수 있습니다.

에디터에서 연 머티리얼 인스턴스. 이 인터페이스에서 파라미터 그룹(Parameter Groups)에 나열된 어트리뷰트를 커스터마이징할 수 있습니다.
특정 타입의 인스턴스드 머티리얼은 게임 내 이벤트에 반응해서 게임플레이 도중 변화할 수도 있습니다. 예를 들어, 나무에 불이 붙으면 머티리얼이 까맣게 타서 그을리게 만들 수도 있습니다. 이 기능을 활용하면 미적인 요소에 있어 뛰어난 시각적 유연성을 발휘할 수 있습니다.
머티리얼 상속
머티리얼과 머티리얼 인스턴스는 계층구조식의 부모와 자손 관계를 가지고 있습니다. 머티리얼 인스턴스의 모든 어트리뷰트는 부모(또는 마스터) 머티리얼로부터 상속됩니다. 예를 들어 시작용 콘텐츠에 있는 의자 소품에 사용되는 머티리얼 그래프를 살펴보겠습니다.

M_Chair 에서 생성된 머티리얼 인스턴스는 모든 어트리뷰트를 위 그래프에서 상속합니다.

위에서 사용한 명명 규칙을 잘 살펴보시기 바랍니다. 이러한 규칙을 사용하면 콘텐츠 브라우저에서 부모 머티리얼과 머티리얼 인스턴스를 쉽게 구별할 수 있습니다.
- M_Chair 에서 앞에 붙은 M_ 은 부모 머티리얼을 나타냅니다.
- 오른쪽 그림에 나타난 두 개의 예시에서 앞에 붙은 MI_ 은 머티리얼 인스턴스를 나타냅니다.
새로 생성된 머티리얼 인스턴스는 어트리뷰트를 부모로부터 상속받기 때문에 레벨의 오브젝트에 적용했을 때 외형이 부모 머티리얼과 동일합니다. 아래 이미지를 보면 가장 왼쪽에 있는 의자에는 부모 머티리얼이 적용되어 있고, 가운데 의자와 오른쪽 의자는 바뀌지 않은 머티리얼 인스턴스를 사용합니다.

머티리얼 인스턴스의 주요 워크플로 장점은 노드 그래프를 편집하거나 머티리얼을 리컴파일하지 않고도 머티리얼 인스턴스 에디터(Material Instance Editor) 에서 매우 신속한 커스터마이징이 가능하다는 것입니다.
아래 동영상에서는 콘텐츠 브라우저에서 두 개의 머티리얼 인스턴스를 열고 머티리얼 인스턴스 에디터에서 수정합니다. 변경사항은 즉시 중앙 뷰포트에 나타납니다. 일반 머티리얼은 복잡도에 따라 리컴파일에 최대 몇 분이 소요될 수 있습니다.
머티리얼 파라미터화
머티리얼 인스턴스의 모든 특징을 기본적으로 편집할 수 있는 것은 아닙니다. 인스턴스 내에서 머티리얼 어트리뷰트를 편집할 수 있게 하려면 부모 머티리얼에서 어트리뷰트를 파라미터로 지정해야 합니다. 이를 머티리얼의 파라미터화 라고 합니다.
파라미터는 머티리얼 에디터에서 다른 데이터 노드와 같은 방식으로 생성되며, 파라미터화되지 않은 머티리얼과 동일한 정보를 담고 있습니다.
예를 들어, 상수(Constant) 표현식은 하나의 부동 소수점 값을 가지며 러프니스나 메탈릭과 같은 머티리얼 입력을 컨트롤하는 데 자주 사용됩니다. 이 노드를 파라미터화한 버전이 스칼라 파라미터(Scalar Parameter) 입니다.

상수 머티리얼 표현식(1)과 스칼라 파라미터(2).
스칼라 파라미터는 이름을 가진 값이 되어 머티리얼 인스턴스로 데이터 값을 전송하는 컨듀잇 역할을 할 수도 있습니다. 모든 파라미터에는 디테일(Details) 패널 에서 해당 파라미터의 특징을 잘 설명하는 고유의 이름을 부여해야 합니다. 디테일 패널에서 프로퍼티에 액세스하려면 머티리얼 그래프에서 노드를 선택합니다.

위 예시에서 파라미터의 이름은 Roughness 이며, 디폴트값은 0.25입니다.
아래의 간단한 파라미터화 머티리얼을 보면 벡터 파라미터(Vector Parameter) 가 베이스 컬러(Base Color) 입력에 연결되어 있고, 스칼라 파라미터 는 메탈릭(Metallic)과 러프니스(Roughness)에 연결되어 있습니다.

파라미터화의 개념을 더 자세히 설명하자면, 상수 값 0.5가 스페큘러(Specular) 입력으로 전달됩니다.
세 개의 파라미터는 머티리얼 인스턴스 에디터에서 열었을 때 노출되어 있고 편집할 수 있는 상태지만, 상수는 그렇지 않습니다. 아티스트에게 노출하고 싶은 값은 파라미터여야 하고, 다른 사람이 변경하면 안 되는 값은 상수여야 합니다.

베이스 컬러, 메탈릭, 러프니스의 파라미터는 머티리얼 인스턴스 에디터에서 편집할 수 있지만 상수 값은 아티스트에게 노출되지 않습니다.
파라미터 타입
파라미터는 머티리얼 그래프 어디서든 사용하여 다양한 머티리얼 이펙트를 표현할 수 있습니다.
주요 파라미터 타입은 아래에서 설명합니다. 파라미터 표현식 전체 목록은 여기서 확인할 수 있습니다.
스칼라 파라미터
ScalarParameter 는 하나의 부동 소수점 값을 가진 파라미터입니다. 스칼라 파라미터는 위에서 본 러프니스와 메탈릭처럼 단일 값을 바탕으로 모든 이펙트를 표현할 수 있습니다.
스칼라 파라미터는 어트리뷰트의 증배율을 컨트롤하는 데에도 자주 사용됩니다.

이 그래프에서는 스칼라 파라미터에 단색을 곱한 뒤 결과값을 이미시브 컬러(Emissive Color) 입력에 연결했습니다. 스칼라 파라미터의 값은 이미시브 이펙트의 강도를 제어합니다. 값이 높을수록 밝기가 올라갑니다.
벡터 파라미터
VectorParameter 는 4채널 벡터 값이나 4개의 부동 소수점 값을 가지는 파라미터입니다.

보통 환경설정 가능한 컬러를 제공하는 데 사용되지만, 위치 데이터를 나타내거나 여러 값이 필요한 이펙트를 구현하는 데에도 사용할 수 있습니다.
텍스처 파라미터
가장 흔히 사용되는 텍스처 파라미터는 머티리얼 인스턴스 내에서 텍스처를 변경할 수 있도록 해 주는 TextureSampleParameter2D입니다.

그 외에도 다양한 타입의 텍스처 파라미터를 사용할 수 있습니다. 파라미터에 따라 수락하는 텍스처의 타입이나 사용 방식이 다릅니다. 예를 들어 다음과 같이 할 수 있습니다.
- TextureSampleParameterCube는 TextureCube 또는 큐브맵을 수락합니다.
- TextureSampleParameterFlipbook는 FlipbookTexture를 수락합니다.
- TextureSampleParameterMeshSubUV는 메시 이미터와 함께 서브 uv 이펙트에 사용되는 Texture2D를 수락합니다.
- TextureSampleParameterMeshSubUV는 메시 이미터와 함께 서브 uv 블렌딩 이펙트에 사용되는 Texture2D를 수락합니다.
텍스처 파라미터 전체 목록은 머티리얼 표현식 레퍼런스를 참조하세요.
스태틱 파라미터
Static 파라미터는 컴파일 시간에 적용되기 때문에 스크립트나 런타임이 아니라 머티리얼 인스턴스 에디터에서 편집할 수 있습니다.
스태틱 파라미터는 머티리얼의 분기(branch)를 마스킹하는 데 사용됩니다. 예를 들어, StaticSwitch 파라미터는 두 개의 입력을 가집니다. 그리고 파라미터 값이 참이면 첫 번째 값을, 거짓이면 두 번째 값을 출력합니다. 스태틱 파라미터로 마스킹된 분기는 런타임에서 실행되지 않으므로 이 기능은 보다 적합한 코드를 제공합니다.

구체적인 스태틱 파라미터 타입에 대한 정보는 스태틱 스위치 파라미터 및 스태틱 컴포넌트 마스크 파라미터를 참조하세요.
인스턴스가 사용하는 베이스 머티리얼의 스태틱 파라미터가 가지는 모든 조합에 대해 새로운 머티리얼이 컴파일됩니다.
이로 인해 컴파일해야 하는 셰이더의 수가 지나치게 늘어날 수 있습니다. 머티리얼의 스태틱 파라미터 수, 그리고 이러한 스태틱 파라미터에서 실제로 사용되는 순열의 수를 최소화하는 것이 좋습니다.
상수 및 다이내믹 인스턴스
언리얼 엔진에서는 두 가지 타입의 머티리얼 인스턴스를 사용할 수 있습니다.
- 머티리얼 인스턴스 상수(Material Instance Constant) — 런타임 이전에만 계산됩니다.
- 머티리얼 인스턴스 다이내믹(Material Instance Dynamic) — 런타임에서 계산, 편집할 수 있습니다.
머티리얼 인스턴스 상수
머티리얼 인스턴스 상수 는 런타임 이전에 한 번 계산하는 인스턴스드 머티리얼입니다. 따라서 게임플레이 도중에 변경할 수 없습니다. 머티리얼 인스턴스 상수는 게임 내내 같은 상태를 유지하지만, 컴파일이 필요하지 않아 퍼포먼스 측면에서 유리합니다.
예를 들어 게임에 다양한 색상을 가진 자동차가 여러 대 등장하고 게임플레이 도중에 색이 바뀌지 않는다면, 기본적인 일반 자동차 페인트를 나타내는 마스터 머티리얼부터 만드는 것이 가장 좋습니다. 그 다음, 머티리얼 인스턴스 상수 를 생성해 자동차마다 다른 컬러나 다양한 러프니스 등을 표현합니다. 이 문서 앞쪽의 의자 예시에서도 이 방식을 확인할 수 있습니다.
머티리얼 인스턴스 상수는 콘텐츠 브라우저에서 생성하고 머티리얼 인스턴스 에디터에서 편집합니다.
머티리얼 인스턴스 다이내믹
머티리얼 인스턴스 다이내믹(MID) 은 게임플레이 도중에(런타임에서) 계산할 수 있는 인스턴스드 머티리얼입니다. 따라서 플레이 도중에 스크립트(컴파일된 코드나 블루프린트 비주얼 스크립트)를 사용해 머티리얼의 파라미터를 변경하여 게임 중간에 머티리얼을 수정할 수 있습니다. 이 인스턴스의 용도는 무궁무진합니다. 수준별 대미지를 표현할 수도 있고, 건축 시각화에서는 페인트 컬러를 변경할 수도 있습니다.
MID는 스크립트 내에서 파라미터화 머티리얼이나 머티리얼 인스턴스 상수로 생성합니다. 블루프린트에서는 파라미터화 프로퍼티를 가진 머티리얼을 Create Dynamic Material Instance 노드에 연결합니다. 그리고 Set Material 노드를 사용해 결과값을 문제의 오브젝트에 적용합니다. 이렇게 하면 게임플레이 도중에 바뀌는 새로운 머티리얼이 만들어집니다.

머티리얼 인스턴스 생성 및 사용법
머티리얼 인스턴스의 생성과 사용은 두 단계로 이루어집니다. 먼저 머티리얼 인스턴스에서 오버라이드하고 싶은 프로퍼티에 해당하는 파라미터 표현식을 사용하는 부모 머티리얼을 만들어야 합니다. 그 다음, 머티리얼 인스턴스를 생성하고 머티리얼 인스턴스 에디터에서 프로퍼티를 커스터마이징할 수 있습니다.
파라미터화된 머티리얼을 생성하여 머티리얼 인스턴스에서 사용하는 방법은 머티리얼 인스턴스 생성 및 사용을 참조하세요.