В Unity при работе с шейдерами, которые являются частью графического конвейера, обычно работать с экземплярами Shaderпрограммы, работающей на графическом процессоре. Подробнее
См. в Словарь. Экземпляр класса Shader
называется объектом Shader.
Объект Shader — это специфичный для Unity способ работы с шейдерными программами. это оболочка для шейдерных программ и другой информации. Он позволяет вам определять несколько шейдерных программ в одном файле и указывать Unity, как их использовать.
Совместимость конвейера рендеринга
Название функции | Встроенный конвейер рендеринга | Универсальный конвейер рендеринга (URP) | Конвейер рендеринга высокого разрешения (HDRP) | Пользовательская SRP |
---|---|---|---|---|
Shader objects | Да | Да | Да | Да |
Основы шейдерных объектов
Объект Shader содержит шейдерные программы, инструкции по изменению настроек графического процессора (в совокупности называемые состоянием рендеринга) и информацию, которая сообщает Unity, как их использовать.
Вы используете объекты Shader с материаламиресурсом, который определяет, как поверхность должна быть оказано. Подробнее
См. в Словарь, чтобы определить внешний вид вашего sceneСцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. в Словарь.
Активы
Вы можете создавать объекты Shader двумя способами. У каждого есть свой тип объекта:
- Вы можете написать код для создания актива шейдера, который представляет собой текстовый файл с
.shader
расширение. - Вы можете использовать Shader Graph для создания объекта Shader Graph.
Каким бы способом вы ни создавали объект Shader, Unity представляет результаты одним и тем же образом внутри.
Внутри объекта Shader
Объект Shader имеет вложенную структуру. Он организует информацию в структуры, называемые SubShaders и Passes. Он организует шейдерные программы в варианты шейдеров.
Объект шейдера
Объект Shader содержит:
- Информация о себе, такое как его название
- Необязательный резервный объект Shader, который Unity использует, если не может использовать этот.
- Один или несколько подшейдеров
Вы также можете указать дополнительную информацию, такую как общий код шейдера или использовать ли пользовательский редактор. Для получения информации об определении объекта Shader см. ShaderLab: определение объекта Shader.
Подшейдеры
Подшейдеры позволяют разделить объект шейдера на части, совместимые с различным оборудованием, конвейерами рендеринга и настройками среды выполнения.
Подшейдер содержит:
- Информация о том, с каким оборудованием, конвейерами рендеринга и параметрами среды выполнения совместим этот субшейдер.
- Теги SubShader, представляющие собой пары "ключ-значение", предоставляющие информацию о SubShader
- Один или несколько пропусков
Вы также можете определить дополнительную информацию, такую как состояние рендеринга, которое является общим для всех его проходов. Для получения информации обо всем, что вы можете определить в SubShader, см. ShaderLab: определение SubShader.
Проходит
Пропуск содержит:
- Теги передачи, представляющие собой пары "ключ-значение", предоставляющие информацию о передаче.
- Инструкции по обновлению состояния рендеринга перед запуском шейдерных программ
- Шейдерные программы, организованные в один или несколько вариантов шейдера
Вы также можете указать дополнительную информацию, такую как имя. Информацию обо всем, что можно определить в проходе, см. в разделе ShaderLab: определение прохода.
Варианты шейдера
Шейдерные программы, содержащиеся в проходе, организованы в варианты шейдеров. Варианты шейдеров имеют общий код, но имеют разную функциональность при включении или отключении данного ключевого слова.
Количество вариантов шейдера в проходе зависит от того, сколько ключевых слов вы определили в коде шейдера, и от целевой платформы. Каждый пропуск содержит как минимум один вариант.
Дополнительную информацию см. в разделе Варианты шейдераВерсия шейдера программа, которую Unity генерирует в соответствии с определенной комбинацией ключевых слов шейдера и их статусом. Объект Shader может содержать несколько вариантов шейдера. Подробнее
См. в Словарь.
Порядок операций при рендеринге
Это общее описание того, как Unity использует объекты Shader для рендеринга геометрии во всех конвейерах рендеринга.
Прежде чем Unity использует объект Shader:
- Unity создает список подшейдеров для объекта Shader. Он добавляет все вложенные шейдеры, определенные в объекте шейдера, а затем добавляет все вложенные шейдеры во всех резервных объектах шейдера по порядку.
Когда Unity впервые визуализирует геометрию с помощью объекта Shader или когда изменяется значение уровня детализации шейдера или активный конвейер рендеринга:
- Unity перебирает список всех субшейдеров и проверяет их, чтобы определить, являются ли они: совместимыми с аппаратным обеспечением устройства; на уровне или ниже текущего шейдера LODМетод Level Of Detail (LOD) — это оптимизация, которая уменьшает количество треугольников, которые Unity должна отображать для GameObject, когда его расстояние от камеры увеличивается. Подробнее
Увидеть в значении Словарь; и совместим с активным конвейером рендеринга. - Если в списке есть один или несколько субшейдеров, отвечающих этим требованиям, выбирается первый. Это активный субшейдер.
- Если в списке нет субшейдеров, отвечающих всем требованиям:
- Если в списке есть один или несколько подшейдеров, которые соответствуют требованиям к оборудованию (но не соответствуют требованиям LOD или конвейера рендеринга), Unity выбирает первый. Это активный субшейдер.
- Если в списке нет субшейдеров, отвечающих требованиям к оборудованию, Unity отображает шейдер ошибок.
Unity может идентифицировать геометрию, использующую тот же вариант шейдера, и организовывать ее в пакеты для более эффективной рендерингаПроцесс отрисовки графики на экран (или текстуры рендеринга). По умолчанию основная камера в Unity отображает изображение на экране. Подробнее
См. в Словарь. Один раз на кадр для каждой партии геометрии:
- Unity определяет, какой из проходов в активном субшейдере он должен отображать и в какой точке кадра. Это поведение зависит от конвейера рендеринга.
- Для каждого прохода, который он отображает:
- Если текущее состояние рендеринга не соответствует состоянию рендеринга, определенному в проходе, Unity устанавливает состояние рендеринга, как определено в проходе.
- Графический процессор визуализирует геометрию с использованием соответствующего варианта шейдера.