Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

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

Эта страница содержит информацию о следующих методах:

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

Статическое ветвление

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

Внутри Unity использует статическое ветвление при создании вариантов шейдера; однако статическое ветвление само по себе не имеет каких-либо недостатков производительности вариантов шейдера.

Преимущества и недостатки статического ветвления

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

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

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

Как использовать статическое ветвление

Вы можете использовать статическое ветвление в своих шейдерах следующими способами:

  • В шейдерах, написанных вручную:
    • Используйте [#if, #elif, #else и #endif](https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl /dx-graphics-hlsl-appendix-pre-if) директивы препроцессора или [#ifdef and #ifndef](https://docs.microsoft.com/en-us /windows/win32/direct3dhlsl/dx-graphics-hlsl-appendix-pre-ifdef) директивы препроцессора для создания статических ветвей.
    • Используйте оператор if. который оценивает постоянное значение времени компиляции. Хотя операторы if также могут использоваться для динамических ветвей, компилятор определяет постоянное значение времени компиляции и вместо этого создает статическую ветвь.
    • Unity предоставляет встроенные макросы для некоторых констант времени компиляции, которые можно использовать со статическими ветвями.

Примечание. Статическое ветвление доступно только в шейдерах, созданных вручную. Вы не можете создавать статические ветви в Shader Graph.

Динамическое ветвление

Когда шейдерная программа включает условные операторы, которые оцениваются во время выполнения, используется динамическое ветвление.

Существует два типа динамического перехода: динамический переход на основе юниформ-переменных и динамический переход на основе любого другого значения времени выполнения. Ветвление на основе юниформа обычно более эффективно, потому что значение юниформа является постоянным для всего вызова отрисовки.

Преимущества и недостатки динамического ветвления

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

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

  • Ветвление на основе неоднородных переменных означает, что графический процессор должен либо выполнять разные операции одновременно (и, следовательно, нарушать параллелизм), либо «сглаживать ветвь» и поддерживать параллелизм, выполняя операции для обеих ветвей, а затем отбрасывая одну. результат. Ветвление на основе юниформ-переменных означает, что GPU должен сгладить ветку. Оба эти подхода приводят к снижению производительности графического процессора.
  • Для любого типа динамического ветвления GPU должен выделить место в регистрах на самый худший случай. Если одна ветвь намного дороже другой, это означает, что GPU тратит впустую регистровое пространство. Это может привести к меньшему количеству параллельных вызовов шейдерной программы, что снижает производительность.

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

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

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

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

Вы можете использовать динамическое ветвление в своих шейдерах следующими способами:

  • В шейдерах с ручным кодом используйте оператор if, который оценивает состояние времени выполнения. Вы можете использовать атрибуты, чтобы заставить GPU выполнять обе ветви или выполнять только одну ветвь.
  • В Shader Graph используйте ветвь узел. Это всегда выполняет обе ветви.
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3