일반적인 코드를 일부 공유하되, 특정한 키워드가 활성화되거나 비활성화되면 기능이 달라지는 셰이더를 만들 수 있습니다.
내부적으로 셰이더 키워드는 셰이더 배리언트를 만들어 작동합니다. 셰이더 키워드를 사용하기 전에 먼저 셰이더 배리언트의 작동 방식을 이해하고, 성능과 워크플로에 미치는 영향을 알아보는 것이 중요합니다. 이 주제에 대한 자세한 내용은 셰이더 배리언트를 참조하십시오.
셰이더 키워드는 세트에서 선언합니다. 세트는 상호 배타적인 키워드를 포함합니다.
예를 들어, 다음 세트는 3가지 키워드를 포함합니다.
내부적으로 셰이더 키워드는 #define
프리 프로세서 지시문을 사용합니다. 셰이더 키워드 세트를 선언하면 Unity는 일치하는 #define
지시문이 있는 셰이더 배리언트를 컴파일합니다.
참고: 셰이더 그래프에서는 용어가 다릅니다. 키워드 세트는 키워드, 세트에 포함된 키워드는 상태라고 합니다. 내부적으로 기능은 동일합니다. 즉, Unity는 이러한 요소를 같은 방식으로 컴파일하고, 사용자도 같은 방식으로 C# 스크립트를 사용하여 이러한 요소로 작업합니다.
선언한 키워드의 수 및 이러한 키워드를 선언한 방식은 Unity가 컴파일하는 셰이더 배리언트의 수에 상당한 영향을 주며, 이는 다시금 프로젝트와 애플리케이션의 성능에 상당한 영향을 줍니다. 자세한 내용은 셰이더 배리언트를 참조하십시오.
직접 코딩한 셰이더에서 키워드를 선언하려면 HLSL에서 셰이더 키워드 선언 및 사용을 참조하십시오. 셰이더 그래프 셰이더에서 키워드를 선언하려면 키워드를 참조하십시오.
키워드 세트를 선언할 때는 세트의 키워드 범위가 로컬인지 전역인지 선택해야 합니다. 이는 셰이더 키워드를 활성화/비활성화할 때 Unity의 동작에 영향을 미칩니다. 셰이더 키워드 활성화/비활성화에 대한 자세한 내용은 셰이더 키워드와 C# 스크립트 함께 사용을 참조하십시오.
직접 코딩한 셰이더에서 이 값을 설정하려면 HLSL에서 셰이더 선언 및 사용을 참조하십시오. 셰이더 그래프 셰이더에서 이 값을 설정하려면 키워드를 참조하십시오.
참고: 셰이더 소스 파일과 종속성에 이름이 같은 키워드가 존재하는 경우, 소스 파일의 키워드 범위가 종속성의 범위를 오버라이드합니다. 종속성은 폴백 커맨드를 통해 포함된 모든 셰이더를 구성하며, UsePass 커맨드를 통해 포함된 패스를 구성합니다.
키워드 세트를 선언할 때는 Unity가 이러한 키워드를 정의하는 데 사용할 기법을 선택해야 합니다. 이 기법은 Unity가 컴파일하는 셰이더 배리언트의 수에 영향을 미칩니다.
가장 적합한 옵션은 키워드 사용 방식에 따라 다릅니다. 프로젝트에서 머티리얼을 설정하는 데 키워드를 사용하며 런타임 시 C# 스크립트에서 키워드의 값을 변경하지 않는 경우에는 “shader feature”를 사용하여 프로젝트의 셰이더 키워드 및 배리언트 수를 줄여야 합니다. C# 스크립트를 사용하여 런타임 시 키워드를 활성화/비활성화하는 경우에는 “multi compile”을 사용하여 배리언트가 잘못 스트리핑되지 않게 해야 합니다. 셰이더 스트리핑에 대한 자세한 내용은 셰이더 배리언트 스트리핑을 참조하십시오.
직접 코딩한 셰이더에서 이 값을 설정하려면 HLSL에서 셰이더 선언 및 사용을 참조하십시오. 셰이더 그래프 셰이더에서 이 값을 설정하려면 키워드를 참조하십시오.
기본적으로 Unity는 셰이더의 각 단계에 대해 키워드 배리언트를 생성합니다. 예를 들어, 셰이더가 버텍스 단계와 프래그먼트 단계를 포함하는 경우 Unity는 버텍스 및 프래그먼트 셰이더 프로그램 모두의 모든 키워드 조합을 위한 배리언트를 생성합니다. 특정 키워드 세트가 이러한 단계 중 하나에서만 사용된다면 다른 단계에 대해서도 동일한 배리언트가 생성됩니다. Unity는 동일한 배리언트를 자동으로 식별 및 중복 제거하여 빌드 크기가 늘어나지 않도록 하나, 이러한 배리언트는 여전히 컴파일 시간 낭비, 셰이더 로딩 시간 증가와 런타임 메모리 사용량 증가를 초래합니다.
이러한 문제를 방지하기 위해 직접 코딩한 셰이더에서 키워드 세트를 선언할 때 Unity가 특정 셰이더 단계에 대해서만 해당 키워드 세트를 컴파일하도록 명령할 수 있습니다.
참고: 키워드가 특정 셰이더 단계에서만 사용되도록 보장하는 것은 사용자의 책임입니다.
다음 그래픽스 API의 경우, Unity는 단계별 키워드 지시문 사용을 일부만 지원합니다.
직접 코딩한 셰이더에서 이 값을 설정하려면 HLSL에서 셰이더 키워드 선언 및 사용을 참조하십시오. 셰이더 그래프에서 이 값을 변경할 수는 없으며, 기본적으로 모든 키워드는 모든 단계에 영향을 미칩니다.
Unity가 특정 키워드가 활성화되는 경우 사용되는 배리언트에만 기능을 포함하도록 셰이더 소스 파일의 섹션을 표시할 수 있습니다.
이 작업을 수행하는 방법은 직접 코딩한 셰이더와 셰이더 그래프에서 각기 다릅니다. 직접 코딩한 셰이더에 대한 지침은 셰이더 키워드 정의 및 사용을 참조하십시오. 셰이더 그래프에 대한 지침은 셰이더 그래프: 키워드 노드를 참조하십시오.
셰이더 키워드를 활성화하거나 비활성화할 수 있습니다. 셰이더 키워드를 활성화하거나 비활성화하면 Unity가 렌더링에 적합한 셰이더 배리언트를 사용합니다.
다음 두 가지 방법으로 셰이더 키워드를 활성화/비활성화할 수 있습니다.
Unity는 사전 정의된 셰이더 키워드 세트를 사용하여 일반적인 기능을 활성화합니다. Unity는 컴파일 시 다음의 셰이더 키워드 세트를 추가합니다.
Unity는 최대 4,294,967,294개의 전역 셰이더 키워드를 사용할 수 있습니다. 개별 셰이더 및 컴퓨트 셰이더는 최대 65,534개의 로컬 셰이더 키워드를 사용할 수 있습니다.
셰이더 소스 파일과 종속성에서 선언된 모든 키워드는 이 한도에 포함됩니다. 종속성은 셰이더가 UsePass를 사용하여 포함한 패스와, 폴백을 모두 포함합니다.
이름이 같은 셰이더 키워드를 여러 번 발견하는 경우, Unity는 해당 셰이더 키워드를 한도에서 한 번만 차감합니다.
셰이더가 총 128개 이상의 키워드를 사용하는 경우 작은 런타임 성능 페널티가 발생합니다. 따라서 키워드 수는 적게 유지하는 것이 좋습니다.