세트에서 셰이더 키워드 활성화 여부에 따라 셰이더 코드의 일부를 조건부로 표시하려면 HLSL if 문을 사용합니다.
예시:
#pragma multi_compile QUALITY_LOW QUALITY_MED QUALITY_HIGH
if (QUALITY_LOW)
{
// code for low quality setting
}
인스펙터를 사용하거나 C# 스크립팅을 사용하여 키워드를 활성화하거나 비활성화할 수 있습니다.
Unity가 셰이더 코드로 수행하는 작업은 사용하는 셰이더 지시문에 따라 다릅니다.
dynamic_branch를 사용하는 경우 Unity는 각 키워드에 균일한 정수 변수를 생성합니다. 키워드를 활성화하면 Unity는 해당 변수의 정수를 1로 설정하고 GPU는 해당 키워드의 if 문에서 코드를 사용하도록 전환합니다. 이는 동적 브랜칭입니다.
shader_feature 또는 multi_compile을 사용하는 경우 Unity는 각 키워드 상태에 별도의 셰이더 배리언트를 생성합니다. 각 배리언트에는 해당 키워드에 대한 if 브랜치의 코드가 포함되어 있습니다. 키워드를 활성화하면 Unity가 일치하는 배리언트를 GPU로 전송합니다. 이는 정적 브랜칭입니다.
언제 어느 셰이더 지시문을 사용해야 하는지에 대한 자세한 내용은 셰이더의 조건부를 참조하십시오.
세트의 각 키워드에 Unity는 자동으로 _KEYWORD_DECLARED 키워드를 추가합니다. 예를 들어 QUALITY_LOW 키워드를 선언하면 Unity는 QUALITY_LOW_KEYWORD_DECLARED 키워드를 추가합니다.
활성화 여부와 관계없이 키워드가 존재하는지 확인하는 데 사용할 수 있습니다.
예시:
#pragma multi_compile QUALITY_LOW QUALITY_MED QUALITY_HIGH
#if defined(QUALITY_LOW_KEYWORD_DECLARED)
{
// The QUALITY_LOW keyword exists
}
세트의 모든 키워드가 비활성화된 경우 코드를 실행하려면 Unity가 해당 상태에 대한 추가 셰이더 배리언트 또는 균일한 정수를 생성해야 합니다.
shader_feature 또는 dynamic_branch를 사용하여 단일 키워드를 생성하는 경우 Unity는 추가 배리언트 또는 균일한 정수를 자동으로 생성합니다. 예시:
// Creates a variant for when FEATURE_1_ON is enabled, and another for when FEATURE_1_ON is disabled.
#pragma shader_feature FEATURE_1_ON
// Creates a uniform integer for when FEATURE_2_ON is enabled, and another for when FEATURE_2_ON is disabled.
#pragma dynamic_branch FEATURE_2_ON
shader_feature 또는 dynamic_branch를 사용하여 두 개 이상의 키워드 세트를 생성하거나 multi_compile을 사용하는 경우 키워드 세트를 선언할 때 Unity가 추가 배리언트 또는 균일한 정수를 생성하도록 _를 추가하십시오. 예시:
// Creates 5 shader variants, including one for when RED, GREEN, BLUE, and WHITE are all disabled.
#pragma shader_feature _ RED GREEN BLUE WHITE
// Creates 2 shader variants, including one for when FEATURE_3_ON is disabled.
#pragma multi_compile _ FEATURE_3_ON
// Creates 4 uniform integers, including one for when QUALITY_LOW, QUALITY_MED, and QUALITY_HIGH are all disabled.
#pragma dynamic_branch _ QUALITY_LOW QUALITY_MED QUALITY_HIGH
다음 HLSL 프리 프로세서 지시문을 사용하여 조건부 코드를 생성할 수도 있습니다.
if 대신 이를 사용하면 나중에 #pragma 키워드 지시문을 변경하기가 더 어렵습니다. 예를 들어 셰이더 배리언트의 수를 줄여야 하는 경우에는 dynamic_branch로 변경하기가 더 어렵습니다.