Иногда вам нужен тот же самый шейдерПрограмма, работающая на графическом процессоре. Подробнее
См. Словарь, чтобы делать разные вещи в разных обстоятельствах. Например, вы можете захотеть настроить разные параметры для разных материалов, определить функциональность для разного оборудования или динамически изменить поведение шейдеров во время выполнения. Вы также можете избегать выполнения кода, требующего значительных вычислительных ресурсов, когда он не нужен, например, чтение текстуры, входные данные вершин, интерполяторы или циклы.
Вы можете использовать условия для определения поведения, которое GPU выполняет только при определенных условиях.
Различные типы условных выражений
Чтобы использовать условные операторы в шейдере, вы можете использовать следующие подходы:
- Статическое ветвление: компилятор шейдера оценивает условный код во время компиляции.
- Динамическое ветвление: GPU оценивает условный код во время выполнения.
- Варианты шейдераВерсия программы шейдера, которую Unity генерирует в соответствии с определенной комбинации ключевых слов шейдера и их статуса. Объект Shader может содержать несколько вариантов шейдера. Подробнее
См. в Словарь: Unity использует статическое ветвление для компиляции исходного кода шейдера в несколько шейдерные программы. Затем Unity использует программу шейдера, которая соответствует условиям во время выполнения.
Когда и какой тип условного оператора использовать
Не существует универсального подхода к условным выражениям в шейдерах, и вы должны учитывать преимущества и недостатки каждого подхода для данного шейдера в конкретном проекте.
Учитывайте следующую информацию:
- Если вы знаете условия во время компиляции (например, если вы знаете, что собираете для данного оборудования), то статическое ветвление, вероятно, будет лучшим выбором. Статический код ветвления прост в написании и сопровождении, и он не оказывает негативного влияния на время сборки, размер файлов или производительность во время выполнения. Однако его нельзя использовать для выполнения кода для различных условий во время выполнения.
- Если вам нужно выполнить код для различных условий во время выполнения, вам следует рассмотреть следующие варианты:
- Варианты шейдеров не снижают производительность графического процессора. Однако большое количество вариантов шейдеров в проекте может привести к серьезным проблемам: увеличению времени сборки, размерам файлов, использованию памяти во время выполнения и времени загрузки. Варианты шейдеров также усложняют код при ручной предварительной загрузке («предварительном прогреве») шейдеров.
- Динамическое ветвление влечет за собой снижение производительности графического процессора, которое может быть небольшим или значительным в зависимости от кода шейдера и аппаратного обеспечения. Однако он позволяет использовать условные операторы во время выполнения, не увеличивая количество вариантов шейдеров в проекте.
- Можно написать код шейдера таким образом, чтобы он избегал ветвления или вариантов и вместо этого использовал математические операции, возвращающие 0 или 1 для выполнения условного кода. Это может привести к сложному коду, который трудно поддерживать. В зависимости от обстоятельств это может привести лишь к незначительному повышению производительности по сравнению с динамическим переходом или вообще к отсутствию преимуществ.
Как правило, лучший подход — анализировать производительность вашего приложения и тщательно взвешивать свои решения в каждом конкретном случае. Например, если вы можете позволить себе немного увеличить стоимость графического процессора, может быть лучше использовать динамическое ветвление для достижения «достаточно хорошей» производительности графического процессора и снижения риска введения дополнительных вариантов. Однако если производительность графического процессора является основной задачей для этого шейдера и вы уже учли стоимость дополнительных вариантов, вы можете использовать варианты.