Сделать поведение шейдера зависимым от ключевых слов
Чтобы сделать части кода шейдера условными в зависимости от состояния ключевого слова шейдера, используйте оператор if языка HLSL.
Например:
#pragma multi_compile QUALITY_LOW QUALITY_MED QUALITY_HIGH
if (QUALITY_LOW)
{
// code for low quality setting
}
else if (QUALITY_MED)
{
// code for medium quality setting
}
else if (QUALITY_HIGH)
{
// code for high quality setting
}
Теперь вы можете включать и отключать ключевые слова с помощью сценария Inspector или C#.
См. Как Unity компилирует ветвящиеся шейдеры для более подробной информации о том, когда использовать какую директиву шейдера.
Ветвь, если ключевое слово существует
Для каждого ключевого слова в наборе 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
}
Ветвь, когда все ключевые слова в наборе отключены
Чтобы выполнить код, когда все ключевые слова в наборе shader_feature или multi_compile отключены, Unity должна создать для этого состояния дополнительный вариант шейдера.
Если вы используете shader_feature для создания одного ключевого слова, 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
Если вы используете shader_feature или multi_compile для создания набора из двух или более ключевых слов, добавьте _ при объявлении набора ключевых слов. Например:
// 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
Если вы используете dynamic_branch, Unity не нужно дополнительное uniform-целое, когда все ключевые слова отключены. Но чтобы указать, что вы используете это состояние в условном коде, необходимо добавить _ при объявлении набора ключевых слов. Например:
// Creates 3 uniform integers.
// The underscore doesn't create an additional uniform integer, but it indicates you use the additional state in conditional code.
#pragma dynamic_branch _ QUALITY_LOW QUALITY_MED QUALITY_HIGH
Используйте другие инструкции для условного поведения шейдера
Вы также можете использовать следующие директивы препроцессора HLSL для создания условного кода с shader_feature или multi_compile:
-
#if, #elif, #else and #endif. -
#ifdef and #ifndef.
Использование этих директив вместо if затрудняет последующее изменение директивы ключевого слова #pragma. Например, если вам нужно уменьшить количество вариантов шейдеров, труднее изменить ее на dynamic_branch.