인스턴싱된 머티리얼

셰이더 리컴파일 없이 자손 머티리얼의 작동방식이나 외형을 변경하고자 프로퍼티의 변경을 허용하는 계층구조식 머티리얼 관계입니다.

Windows
MacOS
Linux

MICEditor.png

언리얼 엔진 4 에서 머티리얼 인스턴싱은 비싼 머티리얼 리컴파일 작업 없이 머티리얼의 외양을 바꾸는 데 사용됩니다. 전형적인 머티리얼(, 즉 게임플레이 이전에 발생되어야 하는 것들)은 리컴파일 없이는 편집 및 변경이 불가능하지만, 인스턴싱된 머티리얼은 그러한 리컴파일 없이 변경 가능합니다. 심지어 인스턴싱된 머티리얼 중 특정 유형은 게임내 이벤트에 반응해서 게임플레이 도중 변화하는 (이를테면 불타는 나무의 머티리얼을 까맣게 만들어 숯이 되게 만드는) 것도 가능합니다. 이를 통해 미적인 요소에 있어 엄청난 시각적 유연성을 발휘할 수 있습니다.

인스턴스와 파라미터

머티리얼 인스턴스의 목적이 그리 비싸지 않은 방법으로 머티리얼의 외양을 편집하는 데 있기는 하지만, 기본적으로 머티리얼의 모든 기능 하나 하나를 편집하지는 못한다는 것을 유념해 둬야 합니다. 머티리얼 인스턴스를 제대로 편집하기 위해서는, 먼저 원본 (또는 마스터) 머티리얼 중 어떤 프로퍼티를 인스턴스 내에서 편집가능하도록 할 것인지를 선택해서 그들을 파라미터 로 지정해야 합니다. 이것을 머티리얼을 파라미터화 시킨다고 합니다.

파라미터는 머티리얼 에디터 안에서 데이터 노드로 보입니다. 기술적으로는 데이터 값을 머티리얼 인스턴스로 전송용 도관 역할을 위해 이름붙인 값입니다. 이러한 파라미터는 머티리얼 인스턴스 에디터 안에서나 스크립트(블루프린트나 코드) 안에서 )노출 시킨 다음, 그 값을 편집할 수 있습니다. 이를테면 컬러를 즉석에서 바꿀 수 있는 머티리얼을 만들고자 한다 칩시다. 컬러에, 이를테면 빨강 채널에 값을 그냥 할당하는 대신, 머티리얼의 Base Color 프로퍼티에 Vector Parameter_ 를 할당합니다. 그 파라미터에는 이름을 지어줘야 하겠구요. 이 머티리얼의 인스턴스를 생성할 때, 인스턴스의 프로퍼티에 그 이름의 Vector Parameter 가 있는 것을 볼 수 있으며, 그 파라미터를 통해 리컴파일 없이도 원하는 대로 컬러 설정이 가능합니다.

머티리얼에 셋업된 파라미터는 이렇습니다:

Material_Parameters.png

여기서 보면 머티리얼 인스턴스 안에 노출된 파라미터 결과물을 볼 수 있습니다.

Instance_Parameters.png

콘스턴트 / 다이내믹 인스턴스

언리얼 엔진 4 에서 사용가능한 머티리얼 인스턴스 유형은 두 가지입니다:

  • Material Instance Constant 머티리얼 인스턴스 콘스턴트 - 실행시간 이전에만 계산됩니다.

  • Material Instance Dynamic 머티리얼 인스턴스 다이내믹 - 실행시간에 계산( 및 편집) 가능합니다.

머티리얼 인스턴스 콘스턴트

머티리얼 인스턴스 콘스턴트 (MIC) 는 실행시간 전에 한 번만 계산되는 머티리얼 인스턴스 입니다. 즉 게임플레이 도중의 변경이 불가능하다는 뜻입니다. 그러나 게임 내도록 불변 상태로 남아있기는 하지만, 컴파일이 필요치 않다는 점에서 퍼포먼스 상의 이점이 있습니다. 예를 들어 여러가지 색깔 변종이 있지만, 게임 플레이 도중 색이 변하지는 않는 차량이 등장하는 게임의 경우, 최적의 접근법은 일반적인 차량 도색에 있어서 기본적인 측면을 나타내는 마스터 머티리얼을 만든 다음, 여러가지 색상, 다양한 수준의 금속성, 광택 등 여러가지 유형의 차량 변종을 나타내는 머티리얼 인스턴스 콘스턴트를 생성합니다.

머티리얼 인스턴스 콘스턴트는 콘텐츠 브라우저 안에서 생성하며, 머티리얼 인스턴스 에디터 를 통해 편집합니다.

머티리얼 인스턴스 다이내믹

머티리얼 인스턴스 다이내믹 (MID) 은 게임플레이 도중 (실행시간에) 계산할 수 있는 머티리얼 인스턴스 입니다. 즉 플레이하는 와중에 스크립트(컴파일된 코드 또는 블루프린트 비주얼 스크립트)를 사용하여 머티리얼의 파라미터를 바꾸는 것, 따라서 게임 전반에 걸쳐 머티리얼을 변경하는 것이 가능하다는 뜻입니다. 입은 피해의 정도에 따라 도색을 바꾸는 것에서부터 얼굴 표정에 반응하여 다른 스킨 텍스처를 블렌딩 인 하는 것에까지, 그 적용 예는 무궁합니다.

MID 의 생성은 스크립트 안에서, 파라미터화된 머티리얼이나 머티리얼 인스턴스 콘스턴트를 통해 이루어집니다. 블루프린트에서 파라미터화된 프로퍼티가 있는 머티리얼을 받은 다음, 그것을 Create Dynamic Material Instance 노드를 통해 물려주면 됩니다. 그러면 그 노드의 결과가 Set Material 노드를 통해 문제의 오브젝트에 적용되어, 게임플레이 도중 변경 가능한 머티리얼이 새로 생기는 것입니다.

ConstructionScriptForMID.png

기술적 응용

프리미티브에 인스턴싱되지 않은 머티리얼을 적용할 수 있도록 하기 위해, 추상형 베이스 클래스 MaterialInterface 가 사용됩니다. 이 클래스는 적용된 머티리얼의 파라미터 값과 표현식 둘 다에 대한 인터페이스 입니다. Material 클래스는 파라미터 기본값과 표현식을 정의하는 MaterialInterface 의 서브클래스 입니다. 이 두 유형 모두 부모에게서 표현식과 파라미터 값을 상속받으며, 선택적으로 일부 파라미터 값에 대한 오버라이딩/애니메이션도 가능합니다.

부수적으로 이게 뜻하는 바는, 블루프린트 변수가 머티리얼 이나 머티리얼 인스턴스 콘스턴트 를 받을 수 있도록 하려면, MaterialInstance 유형 변수인지 확인해야 한다는 것입니다.

에디터에서 머티리얼 인스턴싱하기

에디터에서 머티리얼의 인스턴스를 만드는 방법은 크게 두 가지 있습니다.

콘텐츠 브라우저 에서 신규 추가 버튼을 누르고 MaterialInstanceConstant 를 선택합니다.

NewMIC.png

새로운 머티리얼 인스턴스에 이름을 짓습니다.

NameMIC.png

새 머티리얼 인스턴스를 더블클릭합니다. 머티리얼 인스턴스 에디터 가 열립니다. 콘텐츠 브라우저에서 인스턴싱할 머티리얼을 선택한 다음 새 머티리얼 인스턴스의 Parent 프로퍼티에 할당합니다.

MatInstEditorOpen.png

인스턴스를 생성하고자 하는 머티리얼을 이미 알고 있는 경우, 콘텐츠 브라우저에서 그 머티리얼에 우클릭한 다음 머티리얼 인스턴스 생성 (Create Material Instance) 를 선택합니다.

CreateMaterialInstance.png

파라미터 그룹

파라미터 표현식에 있는 Group 프로퍼티를 통해 머티리얼 인스턴스 에디터에서 보이는 상태를 체계적으로 정리할 수 있습니다. 관련된 파라미터를 같은 그룹에 넣어 두면 부모 머티리얼의 특정한 면이나 이펙트를 제어하는 모든 파라미터를 쉽고 빠르게 찾아 수정할 수 있습니다. 어떤 그룹에도 속하지 않는 파라미터의 기본 그룹은 None 그룹으로 표시됩니다.

ParameterGroups.png

파라미터화된 머티리얼 만들기

머티리얼에 파라미터를 추가하려면, 머티리얼 에디터에 파라미터 표현식 종류 중 하나를 사용합니다. ScalarParameter, VectorParameter, 다양한 텍스처 파라미터, 스태틱 파라미터 등을 포함해서 사용할 수 있는 파라미터 종류는 여러가지 됩니다.

파라미터에 고유명을 짓고 그룹 에 할당한 다음, 기본값을 줍니다.

Material_Parameters.png

스칼라 파라미터

ScalarParameter 는 하나의 부동소수점 값을 포함하는 파라미터입니다. 스페큘러 파워, 리니어 인터폴레이션의 알파, 오패시티 등과 같은 단일 값을 기반으로 이펙트를 돌리는 데 사용할 수 있습니다.

모든 표현식 목록과 그 설명에 대해서는 머티리얼 표현식 레퍼런스 페이지를 참고하시기 바랍니다.

벡터 파라미터

VectorParameter 는 4 채널 벡터 값 또는 4 개의 부동소수점 값을 갖는 파라미터입니다. 보통 환경설정 가능한 색을 내는 데 사용되나, 위치 데이터를 나타내거나 값이 여럿 필요한 이펙트를 돌리는 데도 사용할 수 있습니다.

모든 표현식 목록과 그 설명은 머티리얼 표현식 레퍼런스 페이지를 참고하시기 바랍니다.

텍스처 파라미터

사용가능한 텍스처 파라미터는 여럿 있습니다. 각각은 수용되는 텍스처의 종류나 사용되는 방식이 정해져 있습니다. 생성되는 셰이더 코드가 텍스처 종류에 따라 달라지기 때문에, 각각의 특정 텍스처 타입마다 별도의 표현식이 필요합니다.

  • TextureSampleParameter2D 는 기본 Texture2D 를 받습니다.

  • TextureSampleParameterCube 는 TextureCube 나 큐브맵을 받습니다.

  • TextureSampleParameterFlipbook 은 FlipbookTexture 를 받습니다.

  • TextureSampleParameterMeshSubUV 는 메시 이미터와 함께 Sub-UV 이펙트에 사용되는 Texture2D 를 받습니다.

  • TextureSampleParameterMeshSubUV 는 메시 이미터와 함께 Sub-UV 블렌딩 이펙트에 사용되는 Texture2D 를 받습니다.

  • TextureSampleParameterMovie 는 MovieTexture (bink 무비)를 받습니다.

  • TextureSampleParameterNormal 은 노멀맵으로 사용되는 Texture2D 를 받습니다.

  • TextureSampleParameterSubUV 는 스프라이트 이미터와 함께 Sub-UV 이펙트에 사용되는 Texture2D 를 받습니다.

모든 표현식 목록과 그 설명에 대해서는 머티리얼 표현식 레퍼런스 페이지를 참고해 주시기 바랍니다.

스태틱 파라미터

스태틱 파라미터는 컴파일 시간에 적용되어, 스태틱 파라미터에 의해 마스킹 되버리는 머티리얼의 전체 분기가 완전히 컴파일되어 실행시간에 실행되지 않을 것이기에 코드를 좀 더 최적화시킬 수 있습니다. 컴파일 시간에 적용되기에 머티리얼 인스턴스 에디터 에서만 변경할 수 있으며, 스크립트에서는 불가능합니다.

경고: 인스턴스에 의해 사용되는 베이스 머티리얼 내 스태틱 파라미터가 결합될 때마다 새로운 머티리얼이 컴파일되게 됩니다!

이를 통해 컴파일되는 셰이더의 양이 지나치게 많아질 수 있습니다. 머티리얼에 스태틱 파라미터의 수와, 실제로 사용되는 해당 정적 파라미터의 치환(permutation) 수의 최소화에 노력을 기울여야 합니다.

구체적인 정적 파라미터 유형에 대한 정보는 Static Switch Parameter, [Engine/Rendering/Materials/ExpressionReference/Parameters#StaticComponentMaskParameter) 부분을 참고하시기 바랍니다.

모든 표현식 목록과 그 설명은 머티리얼 표현식 레퍼런스 페이지를 확인하시기 바랍니다.

태그
Select Skin
Light
Dark

새로운 언리얼 엔진 4 문서 사이트에 오신 것을 환영합니다!

문서 사이트에 대한 의견을 모을 수 있는 피드백 시스템을 포함해서 여러가지 새로운 기능을 준비하고 있습니다. 아래 Documentation Feedback 포럼(영문) 또는 언리얼 엔진 네이버 공식 카페(한글) 중 편하신 곳에 의견이나 문제점을 알려 주세요.

새 시스템이 준비되면 알려 드리겠습니다.

네이버 카페
공식 포럼