Перевод проекта на Unity 5. Шейдеры и свет

Предыстория


Совсем недавно вышел Unity 5, в котором куча всего нового и непонятного, а документацию сотворить пока еще не успели.

В силу своей работы технических художником мастером на все руки, мне пришлось бросить все и срочно сделать UP проекта на Unity 5. Не так давно Apple обязала разработчиков создавать 64-битные приложения.

Открыв проект в новой версии, вы увидите… ничего, ну или почти ничего. Unity 5 не понимает старые шейдеры с альфой и просто заливает их черным или белым, кто как писал.

Старый Beast ушел в историю и свет придется перепекать.

Ниже вся собранная информация по вопросу: перевод мануала и туториала с офф.сайта Unity3D, и кое-какие заметки (по настройкам) от меня.

Посвящается всем перешедшим на Unity 5.

Стандартный шейдер


Полезные ссылки:
Почему ваши старые и самописные шейдеры не работают;
Официальный туториал по шейдерам.

Описание
Новый стандартный Unity Shader для каждой платформы собирается отдельно, то есть неиспользуемые поля не идут в итоговый шейдер. Оптимизация шейдера производится по целевой платформе, когда стандартный шейдер билдится, происходит 2 важные вещи:
  • Все свойства, которые не использованы, вырезаются из дальнейшего билда (а может они используют пресеты);
  • Собранный шейдер проверяется и оптимизируется под тип устройства (см. Build Settings), поэтому не нужно заботиться о производительности;

Параметры стандартного шейдера разделены на три раздела:

image

Rendering mode — режим визуализации (прозрачный, полупрозрачный, просто текстура или цвет).
  • Opaque — непрозрачный, отрисовка будет производиться без альфа; Colour is tint the texture.
  • CutOut — это Alpha testing, параметр Alpha Cutoff определяет грань между двумя состояниями: «полностью прозрачен» и «непрозрачен».
  • Fade — по сути то же, что и Transparent, но позволяет сделать объект абсолютно прозрачным.
  • Transparent — полупрозрачный, например используется для стекла, alpha in Albedo используется для регулирования прозрачности.

Main Maps — группа свойств, описывающая главную текстуру и ее свойства.
  • Albedo — основная текстура и/или цвет, альфа (RGB+A) влияет на отблеск и прозрачность, в разных rendering mode.
  • Metallic (при Standart) — определяет степень, с какой материал отражает окружение, при ноле выглядит как матовый пластик, а при 1 — как зеркальный или металлический материал. Используя белый цвет или текстуру, получим материал, похожий на металл. Оптимально использовать оттенки серого. Канал R в текстуре отвечает за свойство Metallness, в канале A (альфе) — Smoothness.
  • Specular (при Specular Setup) — определяет цвет отражения и его яркость из альфы.
  • NormalMap — волшебная текстура для объемности: берет вектор(x,y,z) из пикселя(r,g,b) и вносит дополнительную детализацию при освещении (и других эффектах, SSR, например). Получается эффект объёмности.
  • HeightMap — вторая волшебная текстура, она же карта высот, похожа на NormalMap, она нужна для Displacement-mapping (с тесселяцией) или для Parallax Occlusion'a.
  • Occlusion — свойство, которое работает с текстурой (ч/б), и затеняет «грани» на текстуре, имеется в виду Ambeint-Occlussion. Например, затемнение швов кирпичной стены.
  • Emission — излучение, цвет отсвета объекта.
  • Detail Mask — может использоваться для наложения маски на Secondary Maps.


Для свойства Albedo, Metallic и Emission текстура является опцией и НЕ обязательна.
Для свойства Albedo и Emission можно задать цвет, но для Emission цвет задать нельзя при scale равны нулю.

Secondary Maps — группа свойств, описывающая вторую текстуру, накладываемую на главную.
Пример использования показан на ткани с узором, где Main Maps имеет цвет и текстуру, а Secondary Maps накладывает узор, типа вышивки, и его текстуру.

Освещение


Я нашла некоторую документацию по GI, но каких-то рабочих настроек там не присутствовало. Поэтому я перевела то, что мне удалось найти и попробовала разные настройки запечения. Все настройки получены экспериментальным путем и чтением мануалов с офф. сайта, блога и форума.

Для меня было полезно скачать проект деревня викингов.

На данный момент я работаю над полноценным 3D проектом, но для планшетов. У меня статические тени, лайтпробы и источник света. Тип света Directional, а настройки запечения Mixed.

Первый сюрприз: у вас на в LocalSettings сидит 10Гб кэш. Посмотреть на это безобразие можно в меню Edit -> Preferece

image

Самостоятельно он не удаляется, надо чистить руками.

О первом бэйке:
У меня система на SSD 256Гб, поэтому я перенесла кэш на обычный хард. Честно говоря, разницы в скорости бэйка я не заметила, а там генерируется достаточно много текстур. Первый бэйк сцены на 100к поликов, при полностью дефолтных настройках, сгенерил 200 карт (light+dir) общим весом 1Гб (процесс шел на i7-4770, оперативы 32 гига и 24/7 часов). Естественно все это коту под хвост.


Описание новых возможностей


Сейчас Unity использует технологию Enlighten глобального освещения в реальном времени (GI).

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

Real-time GI необходимо предварительно рассчитать. При этом вы не получите Lightmap, как это было в Beast, скорее всего получится LightmapSnapshot. Эта штука много весит поскольку содержит слепок ваших Lightmap. В билд этот LightmapSnapshot попадет уже в другом размере. Что там происходит я не знаю.

Описание панелей Lighting


В качестве примера я использую проект с деревней викингов, далее Window -> Lighting, вкладка Scene.
Сразу оговорюсь, что эта сцена запекается буквально полчаса, и это действительно круто.

image

Запечение происходит в 2 этапа, в первом 11 стадий, во втором 15. Для Baked GI клинит на 5/11 Clastering, 7/11 LightTransport, 4/15 Bake AO, 6/15 Bake Visibility и 12/15 BakeInderect.

Scene Tab. Environment Lighting


Свет должен быть Baked или Mixed, что позволит плавно переключаться между запеченными и рассчитываемыми в реальном времени режимах GI.

Свойства Skybox и Sun не являются обязательными и могут оставаться пустыми.
SkyBox — свойство для имитации неба или фона задника.
Sun — при использовании SkyBox, здесь можно указать направления света или «солнца» (или какой-либо большой, удаленный источник света, освещающий сцену). Если этот параметр не используется (None), то DirectionalLight станет бесконечно-удаленным источником света, like sun.
Ambient Source — источник рассеянного света Ambient Light, который освещает все в сцене (правильное определение несколько сложнее). Он может быть 3 типов:
  • SkyBox — в поле Skybox нужно указать материал с Cubemap (примерно такой). Skybox использует цвета Skybox для определения окружающего света, исходящего под разными углами.
  • Gradient — позволяет назначить цвета для Sky Color, Equator Color и Ground Color, выглядит примерно так. Это свойство последовательно плавно смешивает перечисленные цвета.
  • Color — цвет окружающего света.

Ambient Intensity — яркость Ambient Light, регулируется от 0 до 1.
Ambient GI — свойство доступно, когда включен режим Precomputed Realtime GI и Baked GI. Позволяет выбрать способ (Precomputed Realtime или запеченный/Baked GI), который будет использоваться для рассеянного света.
Reflection Source — источник отражений. Позволяет указать, следует ли использовать Skybox для эффектов отражения (по умолчанию) или же выбрать Cubemap. Если Skybox выбран в качестве источника, то дополнительная опция нужна для того, чтобы установить его разрешение для расчета отражений.
Reflection Intensity — степень воздействия Cubemap или Skybox отражений на сцену.
Reflection Bounces — сколько раз отражение объекта отразится. Уместно вспомнить зеркальный коридор.

Precomputed Realtime GI


Realtime Resolution — устанавливает количество текселей, которые будут использоваться на единицу длины для объектов, освещенных в реальном времени GI. Обычно это значение примерно в десять раз ниже, чем разрешение запеченных. Может быть нецелым, например 0,5.
CPU Usage — определяет насколько можно грузить CPU в редакторе при запекании текстур в реальном времени.

Baked GI


Baked Resolution — устанавливает количество текселей (например, «texture pixels»), которые будут использоваться на единицу длины для объектов, освещенных BakedGI. Для быстрого протопипирования лучше использовать значения в диапазоне 1-4.
Baked Padding — расстояние на текстуре между запеченными объектами в текселях.
Compressed — будет ли сжиматься текстура. Займет меньше места, но возможны артефакты.
Ambient Occlusion — относительная яркость поверхностей в Ambient occlusion т.е. затемнения на внутренних углах. Более высокие значения показали более высокую контрастность между затененными и освещенными местами. Это применяется только к Indirect (непрямому) освещению, рассчитанному системой GI.
Final Gather — когда опция включена, окончательный свет, получаемый в расчете GI, будет иметь то же разрешение, что и запеченные карты освещения.

General GI


Следующие параметры влияют на отраженный свет в режимах Realtime и Baked GI mode: рассеянный Ambient, отраженный свет Light Bounces и излучение Emissive материалов, но не отражение.
Indirect intensity — масштабирует интенсивность Indirect light.В меню Scene Window -> Irradiance можно посмотреть Indirect light.
Bounce Boost — насколько сильно свет отражается от одной поверхности к другой. Отраженный свет умножается на это значение, стандартно равно 1.
Directional Mode — по сути указывает нужно ли сохранять информацию Directional и Specular в лайтмапы при Baked GI mode.
Atlas size — размер лайтмап при запечении Baked GI mode. Обычно ставлю 1024px.

В Skined Mesh Renderer теперь добавилось новое свойство — Lightmap Parameters, это свойство отвечает за группировку объектов, например внутри помещения и снаружи, по уровням или сценам, то как зададите вы или автоматически.

image

Мои низкие настройки для быстрого бэйка.

Precomputed Realtime GI


  • Resolution — разрешение конечной лайтмапы в тикселях к мировым единицам.
  • Cluster Resolution — Отношение разрешения кластера к разрешению конечной лайтмапы, т.е. разрешение, к которому рассчитывается отраженный свет.
  • Irradiance Budget — значение определяет точность, с которой данные о падающем(приходящем) свете используются для расчета света каждого текселя на лайтмапе, т.е. записывается шаблон (паттерн) падающего света. Более низкие значения приводят к размытию контуров освещенной части, более высокое значение к более четким контурам. Увлекаться этим параметром нельзя, так как он напрямую грузит оперативу и проц при бэйке.
  • Irradiance Quality — качество передачи отраженного света на лайтмапе. Значение не влияет на конечный результат на устройстве, но увеличивает precomputing time in the editor. Как я понимаю, это свойство эквивалентно свойству Final Gather Rays в Beast, но для отраженных лучей. Больше лучей — выше качество, но больше и время бэйка.
  • Backface Tolerance — это свойство позволяет пренебречь освещением тех тикселей, которые недостаточно освещены (например находятся внутри меша), а расчет их освещенности производится интерполяцией с рядом находящимися текселями. Помогает избежать артефактов.
  • Modelling Tolerance — максимальный размер отверстий в геометрии сетки, которым можно пренебречь при расчете GI.
  • Edge Stitching — если опция включена, то UV “charts” будут запечены с лайтмапами, чтобы избежать визуальных артефактов.
  • Is Transparent — если опция включена, то объекты с прозрачностью остаются прозрачными во время расчета GI. При этом бэкфэйсы не учитываются и свет проходит сквозь объект. Может быть использовано для излучающих невидимых поверхностей
  • System Tag — группа объектов с лайтмапами в одном атласе. Это также детализация, от которой зависят вычисления. Несколько систем создаются автоматически, если в сцене достаточно объектов. Разные System Tag можно использовать для разных уровней в локации или частей уровня.


Baked GI


  • Blur Radius — радиус в тикселях из фильтра размытия, который применяется для прямого освещения во время постобработки. Этот радиус соответствует расстоянию, на котором будут усредняться соседние тиксели. Более высокие уровни снижают вероятность появления артефактов и делают края тени более гладкими или мягкими.
  • Antialiasing Samples — степень сглаживания для подавления артефактов.
  • Direct Light Quality — число лучей используется для оценки прямой освещения (полный аналог Final Gather Rays в Beast). Большее количество лучей дает более точные мягкие тени.


Baked AO


  • Quality — количество лучей для расчета ambient occlusion (AO)
  • Antialiasing Samples — степень сглаживания, для подавления артефактов.
  • Baked Tag — как и описанное выше System Tag, позволяет группировать объекты в определенные наборы для запекания. Можно использовать для оптимизации динамической подгрузки уровня.

Для Baked Tag и System Tag числовое значение не является существенным, объекты используют один и тот же лайтмап, если они имеют одинаковое значение тага.

General GI. Directional Lightmapping


Directional lightmaps хранят больше информации об освещении окружения, чем обычные карты освещения. Шейдеры могут использовать эту особенность для получения дополнительных данных о поступающем свете, чтобы лучше рассчитать отраженный/испускаемый свет. Это происходит за счет использования текстуры большего объема памяти и shading time.
Можно выбрать один из 3-х режимов: Non-directional, Directional и Directional with Specular. Все три поддерживают realtime и запеченные лайтмапы.

Non-directional: flat diffuse.
Самый простой режим, использующий одну лайтмапу. Хранит инфо о том, сколько света излучает поверхность, предполагая ее diffuse. Если объекты имеют NormalMap или отражают свет, то они будут показаны как diffuse, но в остальном показаны корректно.

Directional: normal-mapped diffuse
Этот режим добавляет вторую лайтмапу, которая хранит доминирующее направление поступающего света и множитель, пропорциональный тому, сколько света в первой лайтмапе поступает по доминирующему направлению. Остальное рассчитывается, если бы свет поступал равномерно (по сфере). Эта информация позволяет рассчитать NormalMap, но при этом материал останется diffuse.

Directional with Specular: full shading
Как и в предыдущем, здесь используется 2 дополнительные латмапы: свет и направление, но здесь они разделены пополам. Левая сторона сохраняет прямой свет, правая — непрямой. Отличие состоит в том, что свет хранится в виде incoming intensity (освещенность). Эта информация позволяет использовать шейдеры, похожие на BRDF-шейдеры, которые обычно зарезервированы для освещения в realtime. В результате можно получить материал с воздействием непрямого света.
Двойные карты освещения (Dual lightmaps) — позволяют использовать отражающие поверхности (specular), карты нормалей (normal mapping).

Directional использует вдвое больше памяти по сравнению с Non-directional и имеет более высокую shading cost.
Directional with Specular использует вдвое больше памяти по сравнению с Directional.

Надеюсь на конструктивные замечания, возможно, я в чем-то не права. Буду благодарна за советы.
Share post

Similar posts

Comments 13

    0
    Спасибо, хорошая статья. Как раз с недавнего времени работал с шейдерами в Unity 4.6 и вот не так давно перешёл на 5й, а вопросов возникло уйма. Теперь некоторые вещи понятнее стали.
      0
      Спасибо что поделились опытом. Очень полезный материал, сэкономит много времени.
        0
        Благодарю за статью, не так давно пытался разобраться в новой системе, но сходу это не получилось и я отложил.
          +1
          Почему ваши старые и самописные шейдеры не работают;

          Все прекрасно работает, не используйте fixed pipeline конвейер, пишите руками vert/frag шейдеры. Апгрейд прошел без единого разрыва исправления со стороны юнити, за исключением макроса чтения лайтмапы — стало более уродски выглядеть.
          Собранный шейдер проверяется и оптимизируется под тип устройства (см. Build Settings), поэтому не нужно заботиться о производительности;

          И он все-равно гораздо тяжелее чем самописный.
          При этом вы не получите Lightmap, как это было в Beast, скорее всего получится LightmapSnapshot.

          AmbientSource=Color
          ReflectionSource=Custom
          PrecomuptedRealtimeGI=Off
          General GI/DirectionalMode=Non-directional
          Получаем на выходе старые лм-ки как в бисте + холдер для всей этой информации (ассет LightmapSnapshot).
          На данный момент я работаю над полноценным 3D проектом, но для планшетов.

          Есть смысл использовать бейк больше штатной Non-Directional лмки? Тяжело же получается в плане рендера.
            0
            Честно говоря, еще не пробовала билдить свой проект, только «викингов на пк».
            General GI/DirectionalMode=Non-directional, в проекте нужен Directional, и это я не решаю,
            кроме того у меня есть проблемы с гуманоидными анимациями и аниматором, звуками и т.д.
            0
            есть проблемы с гуманоидными анимациями и аниматором, звуками

            В чем конкретно проблема? Если не использовались маски и слои, то проблем быть не должно. По поводу звука — почитайте вот эту статью и комментарии к ней. Это все относится в первую очередь к мобилкам и с сильными послаблениями — к десктопу.
              0
              Используем маски и слои, кроме того множество аддишинал костей с rotate и scale, аватар один на множество анимаций… это тема для отдельной статьи.
              Что касается размера приложения, то давно уже на грани 100+mb.
              Дело не в размере, а в «собственных системах», и эту инфу я не могу разглашать, так как творение не мое.
                0
                множество аддишинал костей с rotate и scale

                Если наименования костей будут различаться и аватар будет скопирован из другого скина, то будут глюки по-любому. По поводу дополнительных костей — гуманоид их никогда и не поддерживал, так что глюки тут возможны, обычно в таких случаях используют Generic анимации без ретаргетинга (ну или как повезет).
                Что касается размера приложения, то давно уже на грани 100+mb. Дело не в размере

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

                эту инфу я не могу разглашать

                Надеюсь на конструктивные замечания

                Какие же замечания могут быть о том, что неизвестно? :)
                +1
                Собранный шейдер проверяется и оптимизируется под тип устройства (см. Build Settings), поэтому не нужно заботиться о производительности;


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

                HightMap — вторая волшебная текстура, она же карта высот, работает как NormalMap, только влияет не на рельеф, а создает эффект «рыбьего глаза».


                Что за эффект fisheye? Разве hEight map нужна не для Displacement mapping / POM?
                  0
                  На счет Очень вредного совета спорить не буду — но для быстрого старта при переводе проекта подойдет.
                  Да именно для Displacement mapping / POM, пояснение относится к получаемому эффект. Для камня (или для клеток) эффект будет, как будто вы смотрите на текстуру через каплю воды, она сферическая, поэтому грани искажаются, и получается некоторый объем.
                    0
                    Может я не рыба?
                    Но не вижу в POM'e ничего фишайного.
                    image
                      0
                      Поправила описание.
                      И вы определенно не рыба, вы разговариваете.
                    0
                    Спасибо за информативную статью, я то думал, почему забиваются все ресурсы на ПК.
                    У меня такой вопрос, не было ли у кого-нибудь при запекании теней на Terrain черных полос на конечной текстуре слепка? И как этого можно избежать?

                    Only users with full accounts can post comments. Log in, please.