처음 테크니컬 아티스트로 일하기 시작하면서 프로젝트의 머테리얼들을 살펴봤을 때 의문이 드는 점이 하나 있었습니다. 마스터 머테리얼 인스턴스가 있었던 것 입니다.
그냥 마스터 머테리얼(MM_Material) 아래 여러 머테리얼 인스턴스들(MI_Material)을 생성하는 것이 아닌, 중간 단계 머테리얼 인스턴스(MP_Material)가 있었습니다. 이를 편의상 마스터 머테리얼 인스턴스라고 하겠습니다.
마스터 머테리얼 인스턴스가 꼭 필요한 것은 아닙니다. 이를 전혀 사용하지 않는 경우도 있습니다. 하지만 마스터 머테리얼 인스턴스를 만들면 아래와 같은 이점을 얻을 수 있습니다.
물 표현용 마스터 머테리얼 MM_Ocean이 있다고 가정해봅시다.
이 MM_Ocean으로 특징별 바다를 모두 표현해야 한다고 해봅시다. 이 경우 바다의 종류에 따라 마스터 머테리얼 인스턴스들을 만들어두어 각각의 표현에 용이한 파라미터값을 미리 지정해둘 수 있습니다.
예컨대, 큰 파도의 바다(MP_WavyOcean)엔 World Position Offset으로 표현한 파도의 크기를 정하는 파라미터를 큰 값으로 설정하고, 포말 텍스쳐도 큰 파도에 어울리는 부서지는 포말 텍스쳐를 미리 지정해 둘 수 있습니다.
잔잔한 바다(MP_CalmOcean)엔 파도의 크기를 정하는 파라미터를 작은 값으로 설정해두고 포말 텍스쳐도 물 위에서 떠다니는 포말 텍스쳐로 지정해 둘 수 있습니다.
핏빛 바다(MP_BloodyOcean)는 바다색을 붉은 색으로 지정해두고 굴절률(IOR)값을 피에 해당하는 값으로 지정해둘 수 있습니다. 포말 대신 응고된 검은 찌꺼기들을 표현할 수 있는 디테일 텍스쳐를 포말 텍스쳐 자리에 지정해둘 수도 있습니다.
그리고 이런 마스터 머테리얼 인스턴스를 부모로 갖는 지역별 바다 머테리얼 인스턴스들(MI_WavyOcean_A, MI_WavyOcean_B, MI_WavyOcean_C ...)을 생성해서 사용하면 지역 디테일을 갖는 특징별 바다들을 빠르게 생산할 수 있습니다.
동일한 마스터 머테리얼 기반 인스턴스더라도 스위치값이 다르거나 머테리얼 프로퍼티를 오버라이드해서 사용하는 경우엔 마스터 머테리얼 인스턴스로 생성해서 사용하는 것이 좋습니다. 이는 불필요한 Shader Permutation 문제를 예방하기 위함입니다.
우선, 모든 머테리얼은 개별적으로 쉐이더 컴파일이 진행됩니다. 따라서, 너무 많은 머테리얼 제작은 쉐이더 컴파일 시간과 메모리 사용량을 늘립니다. 때문에, 머테리얼 인스턴스를 적극적으로 사용하는 것을 권장합니다. 이것이 세세한 용도별 머테리얼을 각각 만드는 것보다 마스터 머테리얼 인스턴스들을 제작하여 사용하는 것이 퍼포먼스에 이로운 이유입니다.
이렇게 중간 단계의 마스터 머테리얼 인스턴스가 있다면 마스터 머테리얼엔 공용으로 사용하는 기본 텍스쳐들만 넣어두면 됩니다. 위 예시의 경우 MM_Ocean 포말 텍스쳐 샘플러 란엔 4x4 기본 화이트 텍스쳐를 넣어두고 MP_WavyOcean에 부서지는 포말 텍스쳐를 지정해두면 됩니다. 이렇게 할 경우 MM_Ocean의 용량도 작아질 뿐만 아니라 쉐이더 컴파일 속도도 빨라집니다.
공용 기본 텍스쳐들은 보통 4x4 ~ 32x32 내외의 작은 크기를 갖고, 압축 방식이나 sRGB 여부 등이 해당 텍스쳐의 용도에 맞게 세팅되어 있어야합니다. 저는 아래와 같은 기본 텍스쳐들을 사용하곤 합니다.
- Default: Default Compression, sRGB On
- Default_Linear: Default Compression, sRGB Off
- Normal: Normalmap Compression, sRGB Off
- Masks: Masks Compression, sRGB Off
- UI: UserInterface2D Compression, sRGB On
- Cubemap(Texture Cube): Default Compression, sRGB On