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