Unity 6.3
0 онлайн 106 гостей 3 в системе
Вход
Материалы и шейдеры Шаг 264 из 442

Сделать поведение шейдера зависимым от ключевых слов

Чтобы сделать части кода шейдера условными в зависимости от состояния ключевого слова шейдера, используйте оператор 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.

Дополнительные ресурсы