Unity에는 __Procedural Materials__이라는 새로운 에셋 타입이 포함되었습니다. 이 머티리얼은 근본적으로 스탠다드 머티리얼과 동일하지만 사용하는 머티리얼을 미리 정의하여 저장하지 않고 런타임에 생성할 수 있다는 차이점이 있습니다.
텍스처를 절차적으로 생성하는 스크립트 코드는 일반적으로 저장 및 전송하는 데 비트맵 이미지보다 훨씬 더 적은 공간을 차지하므로 절차적 머티리얼은 다운로드 시간을 줄이는 데 유용할 수 있습니다. 또한 생성 스크립트에는 런타임에 머티리얼의 비주얼 프로퍼티를 바꾸기 위해 변경할 수 있는 파라미터가 포함될 수 있습니다. 프로퍼티는 벽의 컬러 배리에이션부터 벽돌 크기까지 다양합니다. 따라서 절차적 머티리얼 하나로 여러 배리에이션을 생성할 수 있을 뿐만 아니라 머티리얼을 프레임별로 애니메이션화할 수도 있습니다. 여러 흥미로운 시각 효과가 가능합니다. 서서히 돌로 변하는 캐릭터나 산성 물질이 닿아서 손상되는 표면을 상상해 보십시오.
Unity의 절차적 머티리얼 시스템은 Substance라는 산업 표준 제품에 기반을 두고 있습니다. 이 제품은 Allegorithmic에서 개발했습니다.
Unity 5.2에서 절차적 머티리얼은 스탠드얼론(Windows, Mac, Linux), Android 및 iOS, PlayStation 4, 그리고 Xbox One 빌드 타겟용으로 완벽하게 지원됩니다. 절차적 머티리얼 생성은 CPU 기반이고 상기 플랫폼의 모든 하드웨어 설정에서 작동합니다.
모든 기타 플랫폼(콘솔, WSA, WebGL, Tizen)의 경우 Unity는 빌드 중에 머티리얼을 일반 머티리얼로 미리 렌더(“베이크”)합니다. 이렇게 하면 절차적 생성을 통한 런타임 관련 이점을 누릴 수 없지만 에디터에서 기본 머티리얼의 배리에이션을 만들 수 있으므로 여전히 유용합니다.
절차적 머티리얼은 다른 에셋처럼 임포트할 수 있는 서브스턴스 아카이브 파일(SBSAR)로 제공됩니다(에셋 폴더로 직접 드래그하여 놓거나 Assets->Import New Asset… 사용). 서브스턴스 아카이브 에셋은 하나 이상의 절차적 머티리얼을 포함하고 이 머티리얼에 필요한 모든 스크립트와 이미지도 포함합니다. 컴파일되지 않은 SBS 파일은 지원되지 않습니다.
절차적 머티리얼은 다르게 구현되지만 Unity에서는 다른 머티리얼과 똑같이 처리됩니다. 예를 들어 절차적 머티리얼을 메시에 할당하려면 다른 머티리얼과 똑같은 방법으로 메시로 드래그하여 놓습니다.
각 절차적 머티리얼은 특정 머티리얼 타입을 생성하는 커스텀 스크립트입니다. 이 스크립트는 할당할 변수를 인스펙터에 표시할 수 있다는 면에서 Unity 스크립트와 유사합니다. 예를 들어 “Brick Wall”이라는 절차적 머티리얼은 여러 벽돌 코스, 벽돌 색 및 모르타르 컬러를 설정하는 데 사용할 수 있는 프로퍼티를 표시할 수 있습니다. 따라서 에셋 하나에서 무한한 배리에이션의 머리티얼을 얻을 수 있습니다. 이런 프로퍼티를 MonoBehaviour의 public 변수와 매우 비슷한 방법으로 런타임에 스크립트에서 설정할 수도 있습니다.
절차적 머티리얼은 복잡한 텍스처 애니메이션도 통합할 수 있습니다. 예를 들어, 시계 바늘이나 바닥 위를 빨리 지나가는 바퀴벌레를 애니메이션으로 표현할 수 있습니다.
절차적 머티리얼은 절차적으로 생성된 텍스처와 저장된 비트맵의 모든 조합에 사용할 수 있습니다. 또한 포함된 비트맵 이미지를 사용하기 전에 필터링하고 수정할 수도 있습니다. 스탠다드 머티리얼과 달리 절차적 머티리얼은 SVG 파일 형식의 벡터 이미지를 사용할 수 있고, 이를 통해 해상도와 무관한 텍스처 구현이 가능합니다.
절차적 머티리얼을 완전히 새로 만드는 데 사용할 수 있는 디자인 툴에는 아트 툴에서 사용되는 것과 비슷한 시각적 노드 기반 편집이 사용됩니다. 따라서 코딩 경험이 거의 없거나 전무한 아티스트도 머티리얼을 만들 수 있습니다. 예를 들어, 다음은 건설 중인 “벽돌 벽” 절차적 머티리얼이 나와 있는 Allegorithmic의 서브스턴스 디자이너 스크린샷입니다.
Unity의 절차적 머티리얼은 산업 표준 서브스턴스 제품에 기반을 두고 있으므로 절차적 머티리얼 에셋을 Unity의 에셋 스토어를 비롯한 여러 인터넷 출처에서 쉽게 얻을 수 있습니다. Allegorithmic의 서브스턴스 디자이너(Substance Designer)를 사용해 절차적 머티리얼을 생성할 수 있지만, 서브스턴스 기술이 포함되고 서브스턴스 디자이너만큼 Unity와 잘 호환되는 다른 애플리케이션(예: 3D 모델링 앱)도 있습니다.
절차적 머티리얼은 본질적으로 비트맵 이미지보다 저장 공간을 더 적게 사용하는 경향이 있지만 스크립트 기반이므로 머티리얼을 생성하기 위한 스크립트를 실행하는 데 CPU 및 GPU 리소스가 어느 정도 필요하다는 단점이 있습니다. 절차적 머티리얼이 복잡할 수록 런타임 오버헤드가 큽니다.
절차적 머티리얼은 머티리얼의 파라미터가 마지막으로 생성된 후 변경된 경우에만 업데이트되는 형태의 캐싱을 지원합니다. 또한 일부 머티리얼에는 이론적으로는 변경할 수 있지만 아주 소수만 런타임 시 변경해야 하는 여러 프로퍼티가 있을 수 있습니다. 이 경우 변경되지 않을 변수에 대해 Unity에 알리면 Unity가 이전에 머티리얼을 생성할 때 발생한 데이터를 최대한 많이 캐시에 저장할 수 있습니다. 그러면 성능이 종종 크게 향상됩니다.
절차적 머티리얼은 경과 시간 또는 여러 절차적 머티리얼 인스턴스 같은 숨은 시스템 전역 변수를 참조할 수 있습니다. 이 데이터는 애니메이션에 유용할 수 있습니다. 이런 변수 값이 바뀌면 명시적으로 정의된 파라미터가 하나도 바뀌지 않아도 절차적 머티리얼이 업데이트될 수 있습니다.
절차적 머티리얼을 에디터에서 순전히 편의를 위해서만 사용할 수도 있습니다. 즉, 절차적 머티리얼의 파라미터를 설정한 다음 “베이크”하여 스탠다드 머티리얼을 생성할 수 있습니다. 그러면 머티리얼 생성으로 인한 런타임 오버헤드가 없어지지만, 당연히 베이크된 머티리얼을 게임 플레이 중에 변경하거나 애니메이션화할 수 없습니다.
절차적 머티리얼의 복잡성으로 인해 런타임 성능이 저하될 수 있으므로 Allegorithmic의 Substance Player 툴에는 프로파일링 기능이 있습니다. 이 툴은 Allegorithmic 웹사이트에서 무료로 다운로드할 수 있습니다.
서브스턴스 플레이어에는 Unity에 통합된 것과 동일한 최적화된 렌더링 엔진이 사용되므로 이 플레이어로 Unity에서 측정한 렌더링 성능은 서브스턴스 디자이너보다 더 정확합니다.