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

в 11:33, , рубрики: lightmaping, shaders, unity3d, метки: ,

Предыстория

Совсем недавно вышел 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 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) и преломляет по нему свет, получая эффект объёмности.
  • HightMap — вторая волшебная текстура, она же карта высот, работает как NormalMap, только влияет не на рельеф, а создает эффект «рыбьего глаза».
  • Occlusion — свойство, которое работает с текстурой (ч/б), и затеняет или высветляет «грани» на текстуре, например, затемнение швов кирпичной стены.
  • 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), то DirectionLight в сцене будет считаться «солнцем».
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 Resolution — устанавливает количество текселей (например, «texture pixels»), которые будут использоваться на единицу длины для объектов, освещенных BakedGI. Для быстрого протопипирования лучше использовать значения в диапазоне 1-4.
Baked Padding — расстояние на текстуре между запеченными объектами в текселях.
Compressed — будет ли сжиматься текстура, займет меньше места, но возможны артефакты.
Ambient Occlusion — относительная яркость поверхностей в Ambient occlusion т.е. затемнения на внутренних углах. Более высокие значения показал более высокую контрастность между затененными и освещенными местами. Это применяется только к Idirect (непрямому) освещению, рассчитанному системой GI.
Final Gather — когда опция включена, окончательные свет получаемый в расчете GI будет иметь то же разрешение, что и запеченные карты освещения.

General GI

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

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

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 and 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.

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

Автор: JenAnty

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js