Unity3Dschool

обучение разработке игр

Теория и примеры использования света в Unity 2018

Теория и примеры использования света в Unity 2018

Выпуск Unity 2018.1 ознаменовал собой новую эру в создании визуальных эффектов в играх. По сути, разработчики Unity получили инструменты для создания красоты в своих играх. Среди всех нововведений новичку очень тяжело понять что зачем идет и как оно работает. Вы из таких? Знакомо? В этой статье вы узнаете про основы работы с освещением в Unity, поймете, что всё не так страшно и с этим можно и нужно работать. Ведь освещение сильно влияет на восприятие игры пользователями.

А в конце статьи вас ждут примеры того, что можно создать с помощью настроек освещения.

Основные понятия

Напомним себе, что такое свет в реальном мире, где таки действуют законы физики. Итак, мы видим предметы цветными, потому что часть света ими поглощается, а часть отражается. Тут всё понятно. При этом важно понимать, что свет падает не одним лучом, как часто рисуют в учебниках, а пучком света. Поэтому свет отражается в различных непредсказуемых направлениях, это зависит от свойств поверхности с которой они отражаются.

Realtime и Baked

Это типы освещения, они указывают когда происходит расчет освещений, отражений и тд.

Для тех, кто работает в Unity уже стало второй натурой понимать, что существуют расчеты в реальном времени и в “офлайне”. Собственно это и есть разница между этими двумя типами освещения. Realtime расчеты происходят во время работы и нагружают девайс. Baked же проходит до работы приложения и не влияет на производительность во время работы. У каждого из этих типов есть свои особенности применения, но понятно, что там где требуется экономия ресурсов следует обратить внимание на Baked, а там где можно этим пренебречь в пользу реалистичности - Realtime.

Baked часто использует статичные объекты, поэтому при работе с этим типом следует не забывать про выбор Static свойств объектов.

Глобальное освещение (GI)

Разберемся, что это и зачем это. На самом деле это набор техник и принципов, в основе которых лежит определенные математические расчеты. Этот набор инструментов призван создать эффект реального освещения в сценах, созданных в Unity. Речь идет именно о симуляции прямого и отраженного света. Именно с этими терминами познакомимся дальше.

Прямое освещение (Direct Illumination) создается светом, падающим на объект. Непрямое же освещение - это отраженный свет от всех освещенных объектов. Такой свет может влиять на объекты сцены, которые не попадают под прямое освещение. Именно подсчеты непрямого освещения тратят много ресурсов ПК. Однако именно это освещение добавляет атмосферности играм.

Окружающее освещение (Ambient Lighting или Environment Lighting)

Это освещение по сути представляет собой глобальное освещение которое идет со всех сторон. Этот стиль освещения можно использовать для создания определенного настроения сцены - например убрать слишком темные тени или немного подправить общий цвет. Еще одно применение этого освещения - задать яркость света в игре не меняя параметры отдельных источников света или интенсивность GI.

Важной особенностью использования Ambient Light есть то, что это достаточно простое по расчетам освещение, а значит его 100% имеет смысл использовать в разработке для мобильных устройств.

Еще один важный момент. В Unity 2018.2 (да и 2018.1 тоже) настройки этого освещения находятся тут: Lighting -> Scene -> Environment Lighting. По каким-то причинам на официальном сайте Unity все еще указана старая версия.

Итак, как и почему оно работает? Для начала, нужно понимать что есть так называемый “источник” окружающего света. И он может быть в 3 вариантах.

По умолчанию установлен Skybox. Очень коротко про скайбоксы - это текстура, которая прорисована за всеми объектами сцены и чаще всего представляет собой небо, хотя есть варианты. Больше можно почитать на официальном сайте Unity.  Итак, в таких настройках свет исходит от скайбокса. Все что видимо влияет на сцену - это бегунок Intensity Multiplier. Он и задает яркость всего освещения сцены. При этом скайбокс не меняется - его интенсивность, цвет, картинка - все остается таким как было. Пример на картинке:

Стандартные настройки освещения (слева). Интенсивность выставлена на 2 (справа). Как вы можете заметить горизонт не изменился. Использовался стандартный скайбокс и стандартные материалы.

Следующий вариант настроек - градиент. Тут вы можете выбрать цвет неба, цвет горизонта и цвет земли. Все эти цвета потом будут смешаны.

Пример использования градиента. Видно, как выбранные цвета отображаются на сцене.

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

Отражения (Reflections)

Важно понимать, что свет по разному отражается от поверхностей. Это зависит от материала и его свойств. В стандартном шейдере есть две важные настройки - это  Metallic (то насколько “металлическим” кажется материал - чем больше значение, тем больше) и Smoothness (насколько шероховатая поверхность материала). Эти настройки не влияют на 3d модель, а просто задают параметры того как этот объект должен реагировать на освещение. Работа с материалами и Standard Shader заслуживает еще одной статьи, а сейчас мы обсудим то, что касается работы с освещением и отражением света.

Материал с свойством Metallic выставленным на 1 (это максимум) будет “отражать” свет. Понятно, что второй бегунок - Smoothness также на это влияет. Чем более гладкий материал тем проще ему отражать лучи. Вспомните зеркало. Именно эти физические свойства оказывают максимальное влияние на то, как объект будет представлен при освещении.

Отражения в юнити обрабатываются Reflection Probes. Это “зонды” которые указывают что и как должно отражаться на наших супер-гладких, супер-металлических поверхностях. Каждый такой зонд работает внутри параллелепипеда и является точкой на которую ориентируются расчеты отражений.

По умолчанию в сцене юнити есть один такой зонд. Он отражает скайбокс. Поэтому если вы делаете сцену в помещении и вам нужно сделать отражение, то недостаточно будет выкрутить бегунки материалов на максимум. Просто получите отражение неба в полностью закрытом помещении, что согласитесь, абсолютно не реалистично. Вот это и есть работа того самого дефолтного зонда. Чинится это просто - добавлением своего зонда: GameObject>Light>Reflection Probe.

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

Одно важно замечание, вот эти Reflection Probes могут стоить много в вопросах производительности. По умолчанию, в настройках зонда стоит тип Baked. Если поставить на Realtime, то придется ориентироваться на высокую производительность. И чтобы ваши объекты могли участвовать в отражении они должны быть помечены Reflection Probe Static. Выставляется в инспекторе в менюшке Static.

Бонус

Помимо рассмотренных методов освещения, есть еще свойство материалов к излучению света. Это Emissive materials. От стандартных они отличаются тем, что в них поставлена галочка напротив Emission. Там же можно выбрать цвет излучения.

Эти материалы будут излучать свет, который плавно затухает. У них нет настроек дальности освещения. Излучающие материалы вносят свой вклад в освещение сцены только если они обозначены Lightmap static. Воспринимать такой свет тоже должны статические объекты.

Использована та же сцена что и в предыдущем примере, однако добавлен Plane с излучающим материалом. Окружающее освещение выставлено немного ниже по интенсивности. Видно, что за шариком появилась тень, а стенки окрашены в красный от излучающей плоскости. Плоскости назначено Lightmap Static.

Примеры

В сцене убран скайбокс как источник света. Environment light - Color. Выбран неинтересный серый цвет. По центру - шар с излучающим материалом, а вокруг статические объекты с материалом, где настройки Metallic и Smoothness выставлены на 0.5. Также убран из сцены Directional light.

Наоборот включен скайбокс и Directional light, однако окружающее освещение выставлено на градиент. Ни одна из сфер не обозначена Static. Материалы на сферах выставлены по умолчанию.

Выводы

Умение работать с инструментами отличает хорошего разработчика. Понимание того, какие инструменты есть и когда их лучше всего использовать добавляет профессионализма.

В этой статье была рассмотрена часть таких инструментов, как они работают и указано какие из них влияют на производительность. С помощью рассмотренных материалов - таких как ambient light или reflections можно создавать сцену для мобильных устройств, либо добавлять атмосферности игре.

Рассмотренные механизмы можно использовать самостоятельно, либо в добавку к источникам освещения. Источники освещения в Unity требуют отдельной статьи, они являются простым способом добавить изюминку в игру, но каждый источник света может добавлять нагрузку на устройство. Всегда приходится помнить, что есть целевые платформы и на них нужно ориентироваться в выборе инструментов.