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

Уменьшение вариаций шейдера в пользовательском коде шейдера

Предотвращение варианты шейдеров от компиляции в ваших пользовательских шейдерах, чтобы значительно сократить время сборки, размер файла, время загрузки шейдера и использование памяти при выполнении.

Вы также можете ограничить или удалить варианты шейдеров с помощью Редактора UI. Дополнительные сведения см. в Уменьшение вариантов шейдеров.

Ограничение вариантов шейдера при объявлении ключевых слов шейдера

Способ объявления ключевых слов шейдера может ограничить количество вариантов, которые они создают:

Информацию о декларировании ключевых слов в ручных шейдерах см. в Декларирование и использование ключевых слов шейдеров в HLSL.

Указать, какие ключевые слова шейдера влияют на стадию шейдера

Когда вы объявляете ключевое слово, Unity предполагает, что все стадии шейдера содержат условный код для этого ключевого слова.

Вы можете добавить следующие суффиксы, чтобы указать, что только определенные стадии содержат условный код для ключевого слова, так что Unity не генерирует ненужные варианты шейдеров.

  • _vertex
  • _fragment
  • _hull
  • _domain
  • _geometry

Например, используйте #pragma shader_feature_fragment RED GREEN BLUE, чтобы указать, что вы используете 3 ключевых слова для создания условного кода только на стадии фрагмента.

Примечание: Вы не можете добавить эти суффиксы к #pragma dynamic_branch потому что dynamic_branch не создает варианты.

Эти суффиксы могут вести себя по-разному или не иметь никакого эффекта, в зависимости от графики API. Например:

  • Суффиксы не влияют на OpenGL, OpenGL ES или Vulkan.
  • Суффиксы _geometry и _raytracing не влияют на Metal. Metal рассматривает _vertex, _hull и _domain как одну стадию.

Используйте макросы препроцессора для ограничения вариантов по платформе

Вы можете создавать код условного шейдера с помощью макроса препроцессора для целевой платформы, чтобы ограничить варианты на платформах с ограниченной памятью.

Например:

#ifdef SHADER_API_DESKTOP
   #pragma multi_compile _ RED GREEN BLUE WHITE
#else
   #pragma shader_feature RED GREEN BLUE WHITE
#endif

Образец кода выполняет следующие действия:

  • Если вы строите для SHADER_API_DESKTOP платформа, Unity создает варианты для каждой возможной комбинации ключевых слов.
  • Если вы собираете для другой платформы, Unity собирает только варианты для комбинаций ключевых слов Materials, используемых в вашей сборке.

Вы можете использовать макросы препроцессора целевой платформы для выбора между shader_feature, multi_compile и dynamic_branch. Более подробную информацию о том, когда использовать каждый тип условного, см. в Shader Conditionals.

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

При сборке для консолей и мобильных платформ с ограниченной памятью можно ограничить варианты шейдеров, разрешив пользователям переключаться только между небольшим количеством параметров качества.

Например, если использовать ключевые слова DYNAMIC_LIGHTING, SOFT_SHADOWS и HIGH_QUALITY_LIGHTMAPS, можно создать следующее:

  • Настройка «низкого качества», которая включает DYNAMIC_LIGHTING.
  • Настройка «высокого качества», которая включает DYNAMIC_LIGHTING, SOFT_SHADOWS и HIGH_QUALITY_LIGHTMAPS.

Это означает, что Unity не будет создавать шейдерные варианты для DYNAMIC_LIGHTING, когда он выключен, или многие различные комбинации 3 ключевых слов включены и выключены.

Сокращение контролируемых пользователем параметров качества по платформам

Вы можете использовать макросы препроцессора целевой платформы для условного создания меньшего количества параметров качества и меньшего количества вариантов на платформах с ограниченной памятью. Например, следующий пример кода позволит пользователям переключаться между 8 пермутациями параметров на платформах SHADER_API_DESKTOP, но только 2 на платформах SHADER_API_MOBILE.

#if SHADER_API_DESKTOP
   #pragma multi_compile SHADOWS_LOW SHADOWS_HIGH
   #pragma multi_compile REFLECTIONS_LOW REFLECTIONS_HIGH
   #pragma multi_compile CAUSTICS_LOW CAUSTICS_HIGH
#elif SHADER_API_MOBILE
   #pragma multi_compile QUALITY_LOW QUALITY_HIGH
   #pragma shader_feature CAUSTICS // Uses shader_feature, so Unity strips variants that use CAUSTICS if there are no Materials that use the keyword at build time.
#endif

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