Использование и производительность встроенных шейдеров
Шейдеры в Unity используются через Материалов, которые по сути объединяют код шейдера с параметрами, такими как текстуры. Углубленное объяснение взаимоотношений Shader/Material можно прочитать здесь.
Свойства материала будут отображаться в Inspector при выборе либо самого Материала, либо GameObject, использующих Материал. Материал Inspector выглядит следующим образом:
Каждый Материал будет выглядеть немного по-разному в Inspector, в зависимости от конкретного используемого шейдера. Сам шейдер определяет, какие типы свойств будут доступны для настройки в Inspector. Инспектор материалов подробно описан в Материал справочная страница. Помните, что шейдер реализуется через Материал. Таким образом, в то время как шейдер определяет свойства, которые будут показаны в Inspector, каждый Материал фактически содержит настроенные данные с ползунок, цветов и текстур. Самое важное, что нужно помнить об этом, это то, что один шейдер может быть использован в нескольких Материалах, но один Материал не может использовать несколько шейдеров.
Названия шейдеров
Изменение имени Legacy Shader может повлиять на его функциональность. Это потому, что до Unity 5.0, некоторые функции shader определялись путем и именем. Так по-прежнему работают Legacy Shaders. Для более подробной информации см. Старые имена шейдеров
Соображения, касающиеся эффективности
Существует множество факторов, которые могут повлиять на общую производительность вашей игры. На этой странице мы подробно рассмотрим вопросы производительности Встроенных шейдеров. Производительность шейдера зависит от двух факторов: сам шейдер и Путь отображения используются проектом или конкретной камерой. Для получения советов по производительности при написании собственных шейдеров, см. ShaderLab Производительность шейдера.
Пути отображения и производительность шейдера
Из путей отображения Unity поддержки, Отложенное затенение и Вертекс Лит В Deferred shading каждый объект рисуется обычно один раз, независимо от того, какой свет на него воздействует. Аналогичным образом, в Vertex Lit каждый объект рисуется обычно один раз. Таким образом, различия в производительности шейдеров в основном зависят от того, сколько текстур они используют и какие вычисления они делают.
Производительность шейдера в прямом пути отображения
В Вперед пути рендеринга производительность шейдера зависит от как самого шейдера, так и от освещения в сцене. В следующем разделе объясняются детали. С точки зрения производительности существуют две основные категории шейдеров, Вертекс-лити Pixel-Lit.
Вертекс-лит шейдеры в Forward рендеринг траектории всегда дешевле, чем Pixel-Lit шейдеры. Эти шейдеры работают, рассчитывая освещение на основе вершин сетки, используя все огни одновременно. Из-за этого, независимо от того, сколько огней светят на объект, он будет рисоваться только один раз.
Pixel-Lit шейдеры вычисляют окончательное освещение на каждом пикселе, который рисуется. Из-за этого, объект должен быть нарисован один раз, чтобы получить окружающий и основной направленный свет, и один раз для каждого дополнительного света, который светит на него. Таким образом, формула составляет N проходов рендеринга, где N — окончательное количество пикселей света, светящихся на объекте. Это увеличивает нагрузку на CPU для обработки и отправки команд в видеокарту, и на видеокарту для обработки вершин и рисования пикселей. Размер Pixel-Lit объекта на экране также влияет на скорость, с которой он рисуется. Чем больше объект, тем медленнее он будет рисоваться.
Таким образом, пиксельные осветительные шейдеры имеют высокую стоимость, но эта стоимость позволяет создавать некоторые эффекты: тени, нормальное отображение, хорошо выглядящие зеркальные подсветки и световые печенья, чтобы назвать лишь некоторые.
Помните, что свет может быть принудительно включен в пиксельный («важный») или вершинный/SH («не важный») режим. Любые вершинные огни, светящиеся на Pixel-Lit Shader, будут рассчитываться на основе вершин объекта или всего объекта и не будут добавляться к стоимости рендеринга или визуальным эффектам, связанным с пиксельными огнями.
Общая производительность шейдера
Из встроенных шейдеровони расположены примерно в следующем порядке возрастающей сложности:
- Не освещён. Это просто текстура, не подверженная никакому освещению.
- VertexLit.
- Диффузная.
- С картой нормалей. Это немного дороже, чем Diffuse: оно добавляет еще одну текстуру (нормальное отображение) и несколько инструкций для шейдера.
- Зеркало. Это добавляет зеркальное вычисление яркости.
- Нормальный отображенный зеркальный. Опять же, это немного дороже, чем зеркальный.
- С параллакс-картой нормалей. Это добавляет вычисление нормальной параллакса.
- Parallax Normal Mapped Specular. Это добавляет как нормальную параллель, так и зеркальное освещение.
Мобильные упрощённые шейдеры
Кроме того, Unity имеет несколько упрощенных шейдеров, предназначенных для мобильных платформ, в категории “Mobile”. Эти шейдеры работают и на других платформах, так что если вы можете жить с их упрощениями (e.g. приблизительное зеркало, отсутствие поддержки цвета по материалам и т.д.), попробуйте использовать их!
Чтобы увидеть конкретные упрощения, которые были сделаны для каждого шейдера, посмотрите на файлы .shader из пакета «встроенные шейдеры», и информация перечислена в верхней части файла в некоторых комментариях.
Ниже приведены некоторые примеры изменений, которые являются общими для всех мобильных шейдеров:
- Нет цвета материала или основного цвета для тонирования шейдера.
- Для шейдеров, принимающих карту нормалей, используется плитка и смещение от базовой текстуры.
- Шейдеры частиц не поддерживают
AlphaTestилиColorMask. - Ограниченная поддержка функций и освещения — e.g. некоторые шейдеры поддерживают только один направленный свет.