Оптимизация освещения в Unity. #22

unity    2019-06-16 14:38:09     тег: освещение

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

В этом уроке речь пойдет об оптимизации освещения. Хоть эта тема может быть и не очень интересна начинающим разработчикам, знать как оптимизировать освещение все же стоит. 

Ведь каждый кто играл в игры знает, что плохая оптимизация игры портит все удовольствие от игрового процесса. А ведь согласно статистике 50 % пользователей играют на бюджетных видеокартах. 

Освещение в игре играет большую роль, так как задает общее настроение и атмосферу в которую погружается игрок. 

Однако кроме красивого расположения источников света, оно должно быть еще и правильным, иначе это может привести к неоправданному использованию вычислительных ресурсов, тормозам игры и появлению артефактов. 

Обратите внимание на сцену, у меня есть три источника Point Light синего цвета, три оранжевого цвета и три красного-оранжево для факелов.

В данный момент от всех источников освещения на Terrain попадает свет.

Когда источники света пересекаются, это не очень хорошо, не то чтобы это нужно обязательно избегать, тем не менее это может привести к визуальным артефактам освещения похожих на шахматную доску.

Это может обычно происходить, когда на Terrain попадает мало света и используется метод освещения Per Pixel Lighting, то есть попиксельное освещение.

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

Есть метод под названием Per Pixel Lighting, который освещает меш объекта попиксельно и метод Vertex Lighting, который освещает меш объекта по вершинам полигонов. 

При полигональном освещении цвет определяется для вершины полигона, дальше свет усредняется по остальной поверхности. 

Для следующей вершины, используется другое значение цвета, и дальше свет опять усредняется по остальной поверхности, и так далее.

Каким методом освещать, Unity определяет при помощи приоритетов. Если вы посмотрите на объект Light, вы найдете в нем свойство Render Mode, которое имеет значения Auto, Important (важный, первоочередной) и Not Important (не важный, второстепенный). 

Значение Auto позволяет движку Unity самостоятельно выбирать приоритет освещения. Значение Important означает, что будет использоваться попиксельное освещение, а Not Important - полигональное.

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

Давайте теперь посмотрим на нашу сцену сверху. У нас есть три синих источника света Light, в которых мы будем использовать освещение методом Vertex Lighting, хотя бы потому, что нам не нужны тени, поэтому установим свойство Render Mode в значение Not Important.

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

Тоже самое проделаем и с оранжевым освещением, и как вы видите это позволило нам избавиться от артефактов в виде шахматной доски видимых ранее на Terrain.

Иногда, если в источнике света изменить приоритет освещения на  Important, могут появиться артефакты освещения, и это потому, что источник света может переопределить конкретный объект каким методом он будет освещаться, в данном случае переопределено освещение объекта Terrain.

Чтобы разобраться как это происходит, надо знать, что в Unity, в настройках качества, указывается количество пиксельных источников освещения которые можно использовать на объекте. 

Это количество регулируемое. Чтобы его изменить - откройте меню Edit->Project Settings и измените свойство Pixel Light Count.

В данный момент у меня установлено значение 4, но на сцене я указал только три источника как Important. Значит есть еще один, который освещает пиксельным методом используя в свойстве Render Mode значение Auto, тем самым и вызывая данную проблему.

Если мы продублируем еще один источник синего света, то увидим, что факельные огни теперь все используют полигональное освещение методом  Vertex Lighting, так как остальные пиксельные заняты четырьмя синими источниками использующими метод Per Pixel Lighting.

Удалим только что добавленный синий источник.

Но если это значение увеличить до 8, вы увидите, что это позволяет не только синим источникам освещать пиксельным методом, но и источникам освещения для факелов, также использовать метод Per Pixel Lighting.

Как вы помните оранжевые источники света мы указали как Not Important, поэтому они не учитываются при использовании значения Pixel Light Count.

Таким образом, если мы даже уменьшим значение до 6, мы не увидим разницу.

Но если мы, изменим значение до 5, какой-то из факельных источников у которого в свойстве Render Mode стоит значение Auto, изменит приоритет на Not Important.

Но если у этого источника установить приоритет Not Important, то в какой то мере проблема исчезнет. 

Но вернем все назад и выделим синие источники света. Установим их приоритет как Not Important. 

А также давайте увеличим интенсивность до трех. Terrain заметно осветился голубоватым светом, но бывают ситуации когда нужно, чтобы свет освещающий полигонально, то есть методом Vertex Lighting не влиял на Terrain. 

Для этого включите у него свойство static, установив флажок над компонентом Transform. Таким образом теперь Terrain освещается только методом Per Pixel Lighting. Давайте отключим свойство Static.

Теперь, касательно освещения которое у нас в качестве факелов. Этот свет будет освещать объекты которые рядом, кусты, персонажа и было бы хорошо чтобы эти объекты не имели плоский вид, как при полигональном освещении, а также отбрасывали тени. Поэтому у этих источников свойство Render Mode установим в значение Important.

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

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