Шейдеры в Unity используются через материалы, которые по существу комбинируют код шейдера с его параметрами, такими как текстуры. Глубокое объяснение связи шейдер / материал может быть найдено здесь.
Свойства материала показываются в инспекторе, когда будут выбраны или сам материал, или GameObject, который использует материал. Инспектор для материала выглядит так:
Каждый материал выглядит немного по другому в инспекторе, в зависимости о используемого в нем шейдера. Сам шейдер определяет какие свойства будут доступны для настройки в инспекторе. Инспектор материала описан в деталях на странице справочника по компоненту Material. Помните, что шейдер реализовывается через материал. Таким образом, в то время как шейдер определяет свойства, которые будут отображаться в инспекторе, материал содержит настроенные данные слайдеров, цветов и текстур. Наиболее важная вещь - помнить о том, что один шейдер может быть использован во многих материалах, но один материал не может использовать несколько шейдеров.
Есть несколько факторов, которые могут воздействовать на общую производительность в игре. На этой странице мы поговорим о вопросах производительности для встроенных шейдеров. Производительность шейдеров наиболее зависит от двух вещей: самого шейдера и какой режим рендеринга используется проектом или конкретной камерой. Для советов по производительности при написании своего шейдера смотрите страницу Производительность шейдеров ShaderLab.
Из режимов рендеринга, поддерживаемых Unity, режимы отложенного освещения и вершинного освещения имеют наиболее предсказуемую производительность. В отложенном освещении каждый объект обычно рисуется дважды не зависимо от количества освещающих его источников света. В вершинном освещении каждый объект рисуется один раз. Таким образом, производительность в шейдерах при этом будет зависеть от того, как много текстур они используют и какие совершают расчеты.
При упреждающем типе рендеринга, производительность шейдера зависит и от самого шейдера, и от источников освещения в сцене. Следующий раздел поясняет это в деталях. Существует две основных (с точки зрения производительности) категории шейдеров: Vertex-Lit (вершинная подсветка) и Pixel-Lit (пиксельная подсветка).
Шейдеры Vertex-Lit в упреждающем режиме рендеринга всегда менее ресурсоёмки, чем Pixel-Lit шейдеры. Эти шейдеры работают с помощью расчёта освещения на вершинах меша, используя сразу все источники освещения. Поэтому, неважно сколько источников освещения освещают объект, он всё равно будет отрисован только один раз.
Pixel-Lit шейдеры рассчитывают итоговое освещение для каждого отрисовываемого пикселя. Из-за этого, объект должен быть отрисован один раз для получения освещения от окружения и от одного главного направленного источника света, и по одному разу для каждого дополнительного источника освещения, который его освещает. Это увеличивает нагрузку на CPU для обработки и отправки на графический адаптер команд, и нагрузку на GPU для обработки вершин и отрисовки пикселей. Пространство, занимаемое на экране попиксельно освещаемым объектом, также влияет на производительность отрисовки. Чем больше объект, тем больше придётся обработать пикселей и тем медленней будет проходить отрисовка.
Так что использование pixel lit шейдеров требует дополнительных ресурсов, но, зато, позволяет реализовать некоторые изумительные эффекты с помощью теней, карт нормалей, красивых отражаемых бликов и источников света с cookie текстурами (это лишь некоторые из возможностей).
Запомните, что можно форсировать тип рендеринга у источников освещения в пиксельный (“important”) или вершинный/SH (“not important”). Любой вершинный свет, попадающий на Pixel-Lit шейдер будет рассчитываться на основе вершин объекта или всего объекта, и не будет потреблять дополнительных ресурсов и выдавать эффекты, ассоциируемые с пиксельными источниками освещения.
Рассматривая встроенные шейдеры, они идут по мере увеличения сложности:
Кроме того, в Unity существует несколько упрощённых шейдеров для использования на мобильных платформах, они расположены в категории “Mobile”. Эти шейдеры работают и на других платформах, так что если вам не мешают упрощения, которые в них внесены (например, усреднённые отражения, нет поддержки цветов для каждого материала и т.д.), попробуйте использовать их!
To see the specific simplifications that have been made for each shader, look at the .shader
files from the “built-in shaders” package and the information is listed at the top of the file in some comments.
Some examples of changes that are common across the Mobile shaders are:
AlphaTest
or ColorMask
.