셰이더 그래프를 사용하여 HDRP 머티리얼 커스터마이즈
고해상도 렌더 파이프라인(HDRP)은 AxF 셰이더를 제외한 모든 셰이더에 Unity의 셰이더 그래프를 사용합니다. 즉 일부 머티리얼은 노멀 머티리얼과 같은 방식으로 만들고 편집하지 않습니다.
셰이더 그래프를 사용하는 HDRP 머티리얼
HDRP에는 다음의 셰이더 그래프가 포함됩니다.
- 데칼
- 패브릭
- 머리카락
- 릿
- 스택릿
- 언릿
Lit, LayeredLit, Unlit 셰이더는 표준 셰이더(셰이더 그래프 없음)로 사용할 수 있습니다. 즉 셰이더 그래프 인스턴스를 만들지 않고도 셰이더를 사용할 수 있으며 인스펙터에서 편집할 수 있습니다. 셰이더를 사용하려면 인스펙터에서 볼 머티리얼을 선택하고 Shader 드롭다운에서 클릭합니다. HDRP 섹션으로 이동하여 셰이더 그래프 인스턴스를 요구하지 않는 모든 HDRP 셰이더 리스트를 확인합니다.
생성
셰이더 그래프(예: 스택릿 그래프)를 사용하는 머티리얼을 생성하려면 다음 단계를 따르십시오.
- 머티리얼에서 사용하고자 하는 셰이더 그래프로 셰이더를 만듭니다.
- Assets > Create > Shader > HDRP로 이동하여 HDRP 셰이더 그래프 리스트를 찾습니다. 이 예시의 경우 StackLit Graph를 클릭합니다.
- 셰이더 그래프를 고유한 이름으로 지정합니다. 이는 머티리얼에서 이 셰이더 그래프를 레퍼런스해야 하므로 중요합니다.
- 해당 셰이더에서 머티리얼을 만듭니다.
- 프로젝트 창에서 방금 생성한 셰이더를 찾아 오른쪽 클릭합니다.
- Create > Material을 선택합니다. 이렇게 하여 선택한 셰이더를 사용하는 머티리얼을 만듭니다. 이러한 방식으로 하는 것이 매우 중요합니다. 기본 머티리얼을 만든 다음 해당 머티리얼의 Shader 드롭다운에서 셰이더를 선택해선 안 됩니다. 이유에 대한 자세한 내용은 알려진 문제를 참조하십시오.
- 머티리얼에 이름을 지정하고 키보드에서 Return을 누릅니다.
편집
셰이더 그래프를 사용하는 머티리얼의 프로퍼티를 편집하기 위해 인스펙터 창에서는 제한된 수의 프로퍼티에만 액세스할 수 있습니다. 모든 머티리얼 프로퍼티를 편집하려면 반드시 셰이더 그래프의 마스터 노드를 직접 편집해야 합니다.
- 셰이더 그래프 에셋을 더블 클릭하여 엽니다. 창에 마스터 노드와 사용할 수 있는 입력 리스트가 표시됩니다. 아래 스크린샷의 Surface Inputs 섹션에서 이 내용을 참조하십시오.
- 나머지 프로퍼티를 노출하려면 마스터 노드 우측 상단에 있는 기어를 클릭합니다. 아래 스크린샷의 Surface Options 섹션에서 이러한 다른 프로퍼티를 참조하십시오.
- 인스펙터 창에서 한 것과 같은 방식으로 기어의 프로퍼티 값을 편집합니다. 마스터 노드와 기어 리스트에 있는 사용할 수 있는 프로퍼티에 대한 입력 리스트는 선택하는 옵션에 따라 변경됩니다.
머티리얼 프로퍼티
셰이더 그래프 에셋을 편집할 때 이 에셋을 사용하는 머티리얼용 Blackboard에서 프로퍼티를 만들 수 있습니다. 이렇게 하면 런타임 시 프로퍼티 값을 변경할 수 있습니다.
프로퍼티를 만드는 가장 좋은 방법은 프로퍼티를 사용하고자 하는 방법에 따라 다릅니다.
- 에디터에서 프로퍼티를 편집하는 기능을 원할 경우 Blackboard를 사용하고 프로퍼티를 노출합니다.
- 에디터에서 편집하는 것이 아닌 런타임 시 프로퍼티를 편집하는 기능을 원하는 경우 Blackboard를 사용하되 프로퍼티를 노출하지는 않습니다.
- 프로퍼티 편집을 원하지 않는 경우 콘크리트 노드를 사용합니다.
Blackboard의 머티리얼 프로퍼티
모든 Blackboard 프로퍼티는 노출 여부와 관계없이 디스크의 머티리얼 크기에 기여합니다. 프로퍼티 값을 변경할 필요가 전혀 없는 경우(에디터에서든 런타임에서든) 대신 콘크리트 노드를 사용하여 프로퍼티 값이 머티리얼 크기에 추가되지 않도록 합니다.
Unity 에디터 인스펙터에 있는 머티리얼 프로퍼티 값을 변경하고자 하는 경우 해당 프로퍼티를 노출해야 합니다. Blackboard의 프로퍼티를 인스펙터에 노출하려면 다음 단계를 따르십시오.
- 머티리얼이 사용 중인 셰이더 그래프 에셋을 엽니다.
- Blackboard로 이동하여 인스펙터에서 보려고 하는 프로퍼티에 대한 Exposed 설정을 활성화합니다.
- 툴바에서 Save Asset을 클릭합니다.
- 셰이더 그래프 에셋에서 머티리얼을 만들 때 프로퍼티는 Exposed Properties 섹션에 나타납니다.
에디터에서 애플리케이션을 개발하는 동안 인스펙터의 프로퍼티를 변경하려면 해당 프로퍼티만 노출해야 합니다. 그렇지 않으면 인스펙터에서 너무 많은 공간을 차지하지 않도록 하고 실수로 변경되지 않도록 프로퍼티를 노출되지 않은 상태로 두는 것이 좋습니다.
프로퍼티가 노출되어 있지 않은 경우 계속 편집할 수 있습니다. 선택한 셰이더를 사용하는 모든 머티리얼 인스턴스의 프로퍼티를 편집하려면 셰이더 그래프 에셋을 열고 Blackboard에서 직접 프로퍼티를 편집합니다. 셰이더를 사용하는 단일 머티리얼 인스턴스의 프로퍼티를 편집하려면 스크립트를 사용합니다.
:경고: HDRP는 Blackboard에서 사용해선 안 되는 프로퍼티 이름 세트를 따로 보관합니다. 이 중 하나를 사용하는 경우 머티리얼이 제대로 작동하지 않을 가능성이 높습니다. 제한된 프로퍼티 이름 리스트와 그 용도는 다음 표에서 볼 수 있습니다.
프로퍼티 이름 | HDRP 용도 |
---|---|
_EmissionColor |
전역 조명 이미션 컬러 |
_BaseColor |
전역 조명 알파 클립 |
_BaseColorMap |
전역 조명 알파 클립 |
_RenderQueueType |
HDRP가 렌더 대기열에 머티리얼을 예약하기 위해 사용하는 렌더 대기열 타입 |
_UseShadowThreshold |
HDRP 내부 |
_RequireSplitLighting |
HDRP 내부 |
_ReceivesSSR |
표면 옵션 |
_TransparentDepthPrepassEnable |
표면 옵션 |
_TransparentDepthPostpassEnable |
표면 옵션 |
_SurfaceType |
표면 옵션 |
_DoubleSidedEnable |
표면 옵션 |
_AlphaCutoffEnable |
표면 옵션 |
콘크리트 노드의 머티리얼 프로퍼티
셰이더를 사용하는 모든 머티리얼에 프로퍼티 값을 동일하게 하고 런타임 시나 에디터에서 변경할 필요가 없는 경우 콘크리트 노드를 사용할 수 있습니다. 콘크리트 노드는 값을 정의하는 셰이더 그래프 에셋에서 만들 수 있는 노드입니다. Blackboard에서 할 수 있는 것과 동일한 모든 값 타입에 대해 콘크리트 노드를 만들 수 있습니다. 성능을 향상하기 위해 셰이더 컴파일러가 자동으로 최적화를 수행하므로 가능하면 항상 콘크리트 노드를 사용해야 합니다.
텍스처(또는 텍스처 배열)를 정의하는 콘크리트 노드는 셰이더에서 노출되지 않은 프로퍼티를 정의합니다. 즉 Blackboard 프로퍼티처럼 디스크의 머티리얼 크기에 기여합니다.
머티리얼 표면 옵션 프로퍼티
기본적으로 HDRP 마스터 노드는 다수의 Surface Options 프로퍼티를 노출하며 셰이더 그래프 대신 머티리얼에서 일반 설정을 제어할 수 있게 하므로 예를 들어 Sorting Priority나 Surface Type을 변경하기 위해 전체 그래프를 복제할 필요가 없습니다. 마스터 노드에서 이러한 설정은 셰이더의 기본 값으로 작동하므로 Shader Graph에서 머티리얼을 만들면(Shader Graph asset에서 오른쪽 클릭 > Create > Material) 마스터 노드 설정이 생깁니다.
이 시스템은 그래프 복제를 방지하는 데는 좋지만 프로퍼티 동기화에 관해 약간의 문제가 있습니다. 예를 들어 투명 셰이더 그래프에서 머티리얼을 만든 다음 Surface Type을 마스터 노드 설정에서 Opaque로 전환하기로 한 경우 생성된 머티리얼은 그대로 불투명합니다. 머티리얼을 생성하면 머티리얼에서 아무 것도 변경하지 않아도(주로 오버라이드 시스템이 없기 때문) 모든 프로퍼티가 저장되고 셰이더 그래프와 다시 동기화되지 않습니다.
이러한 표면 옵션 전환은 플레이어 모드가 아닌 편집 모드에서만 가능합니다. 이 덕분에 셰이더 컴파일 프로세스에 배리언트를 추가하지 않습니다(멀티 컴파일 대신 셰이더 기능 사용).
알려진 문제
새로운 머티리얼을 만들 때 반드시 기본 셰이더 그래프 프로퍼티(마스터 노드 설정에 있음)를 상속해야 합니다. 이렇게 하려면 생성 섹션에서 설명한 메서드를 사용해야 합니다. 이렇게 하지 않고 대신에 머티리얼을 만들기 위해 Assets > Create > Material을 사용하는 경우 Unity는 릿 셰이더를 머티리얼에 할당한 다음 여기에 모든 기본 릿 셰이더 프로퍼티를 작성합니다. 즉 셰이더 그래프를 머티리얼에 할당하면 해당 머티리얼은 셰이더 그래프 마스터 노드에 있는 프로퍼티가 아닌 릿 셰이더에 있는 기본 프로퍼티를 사용합니다.
셰이더 그래프에 있는 마스터 노드의 프로퍼티를 수정하면 Unity는 머티리얼이 인스펙터에서 열려있지 않은 경우 이를 머티리얼과 동기화하지 않습니다. 즉 마스터 노드 설정에서 Material Type과 같이 특정 프로퍼티를 변경하면 인스펙터에서 열려있지 않은 머티리얼은 동기화되지 않아 이러한 머티리얼의 렌더링이 중단됩니다. 렌더링을 수정하고 머티리얼의 프로퍼티를 셰이더 그래프와 동기화하려면 다음을 수행하십시오.
-
- 인스펙터에서 머티리얼을 열고 프로퍼티 중 하나의 값을 변경한 다음 값을 되돌립니다. 이렇게 하면 마스터 노드와 머티리얼 사이의 동기화를 트리거하고 해당 머티리얼이 수정됩니다.
- 프로젝트의 C# 스크립트에서
HDEditorUtils.ResetMaterialKeywords(Material)
을 호출합니다. 이렇게 하면 입력한 머티리얼의 프로퍼티와 머티리얼의 셰이더 그래프를 동기화합니다.