Материал: Разрабокта расширения для игрового движка Unity

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Разрабокта расширения для игрового движка Unity

Содержание

 

Введение

1. Актуальность работы

2. Цели и задачи работы

3. Обзор аналогов

3.1 2D Light System

3.2 2D Dynamic Lights and Shadows

3.3 Light2D - GPU Lighting System

3.4 Light2D

3.5 2DVLS (2D Volumetric Lights and Shadows)

3.6 Seasons After Fall Rendering System

3.7 Игровой движок Ethanon 2D

3.8 Система освещения Unity

4. Компоненты разрабатываемой системы

4.1 Планы

4.2 Объекты

4.3 Источники света

4.3.1 Ambient Light

4.3.2 Directional Light

4.3.3 Point Light

4.3.4 Spot Light

4.3.5 Area Light

4.3.6 Emissive Objects

4.4 Система расчета теней

4.4.1 Расчет внешних теней

4.4.1.1 Метод трассировки лучей

4.4.2 Форма теней

4.4.3 Внутреннее освещение

4.5 Запекание света

4.6 Менеджер освещения

4.7 Графический интерфейс

4.8 Документация

5. Реализация системы в Unity

5.1 Реализация объектов

5.2 Источники освещения

5.2.1 Ambient Light

5.2.2 Point Light

5.2.2.1 ShadowMap

5.2.2.1.1 Определение, находится ли источник внутри объекта

5.2.2.1.2 Поиск базовых и вспомогательных точек

5.2.2.1.3 Поиск крайних точек

5.2.2.1.4 Формирование четырехугольников

5.2.2.1.5 Поиск корректирующих коэффициентов для задания UV координат

5.2.2.1.6 Поиск "точек привязки"

5.2.2.1.7 Наложение текстуры тени

5.2.2.2 MaterialSettings

5.2.2.3 IsInsideArea

5.2.3 Spot Light

5.2.3.1 ShadowMap

5.2.3.2 IsInsideArea

5.2.4 Directional Light

5.2.4.1 ShadowMap

5.2.4.2 MaterialSettings

5.2.4.3 IsInsideArea

5.2.5 Area Light

5.2.5.1 ShadowMap

5.2.5.2 MaterialSettings

5.2.5.3 IsInsideArea

5.3 Плановость

5.4 Шейдер

5.5 Интерфейс

5.5.1 Point Light

5.5.2 Spot Light

5.5.3 Directional Light

5.5.4 Area Light

5.6 Документация

Заключение

Список использованных источников

Приложения

Введение

Игровой движок Unity очень популярен среди разработчиков видеоигр, особенно среди начинающих, из-за простоты освоения и бесплатности. Несмотря на то, что движок ориентирован на трехмерные приложения, он поддерживает работу с двухмерной графикой. Однако не все компоненты редактора одинаково хорошо работают в 3D и 2D. В частности, встроенная система освещения не позволяет двухмерным объектам служить полноценным препятствием для света и отбрасывать тени на другие объекты. На Рис. 1 представлены три типа объектов в редакторе Unity: куб, четырехугольник и двухмерный спрайт.

Рис. 1 Тени, отбрасываемые различными типами объектов Unity. 1) Общий вид сцены. 2) Объекты имеют координату z равную - 0.5, источник света - 1.5 3) Координаты z объектов и источника равны - 0.5

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

игровой движок unity освещение

1. Актуальность работы


В последнее время Unity развивается стремительными темпами, привлекая все больше новых разработчиков. На базе этого движка были созданы такие популярные игры, как Ori and the Blind Forest (разработчик: Moon Studios), Cities: Skylines (разработчик: Colossal Order), Dungeon of the Endless (разработчик: Amplitude Studios) [1], а также мобильная версия Hearthstone: Heroes of Warcraft (разработчик: Blizzard Entertainment) [2]. Кроме того, Unity используется для создания приложений, связанных с архитектурой, обучением, визуализацией данных, электронными книгами и многими другими отраслями [3]. Так при съемках фильма Книга джунглей (2016, режиссёр: Джон Фавро) приложение на базе Unity Engine использовалось для визуализации в режиме реального времени перемещения по сцене и работы с освещением [4].

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

2. Цели и задачи работы


Цель работы: Разработать и реализовать систему освещения для работы с двухмерными объектами в виде расширения редактора Unity.

Задачи

-       Рассмотреть аналоги разрабатываемой системы;

-       Сформировать список требований;

-       Изучить основы освещения;

-       Реализовать основные источники освещения;

-       Реализовать систему расчета теней, как отбрасываемых объектами, так и внутренних;

-       Обеспечить графический интерфейс для управления системой в окне редактора Unity;

-       Составить документацию для пользователей системы.

3. Обзор аналогов


В качестве аналогов разрабатываемой системы были рассмотрены:

-       Готовые системы, опубликованные в Unity Asset Store:

-       2D Light System (Автор: Михаил Любимов);

-       2DDL PRO - 2D Dynamic Lights and Shadows (Автор: Martin Ysa);

-       Light2D - GPU Lighting System (Автор: Alexander Penkin);

-       Light2D (Автор: Dan John Moran);

-       2DVLS (на данный момент эта система не доступна) (Автор: Pico Games);

-       Реализованные системы освещения:

-       Seasons After Fall Rendering System (разработчик: Swing Swing Submarine);

-       Игровой движок Ethanon 2D;

-       Система освещения Unity.

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

3.1 2D Light System


Данная система является самой мощной из рассмотренных. Она поддерживает три типа источников освещения: Point Light, Spot Light и Directional Light, а также Ambient Light.

Тени отбрасываются не только стандартными 2D объектами, но и системой частиц. Также в данном продукте реализован эффект преломления света при прохождении через прозрачные области. Для формирования тени система использует альфа-канал объекта, а не систему коллайдеров. Поддерживаются мягкие тени. Основными недостатками пользователи этого продукта называют: отсутствие поддержки со стороны разработчика, работа только в плоскость xy, невозможность управлять порядком прорисовки теней объектов [5].

3.2 2D Dynamic Lights and Shadows


Данная система формирует тени объектов путем трассировки лучей от источника света к определённым точкам на сцене. Эти точки задаются как формой освещаемой области (источник представляет собой восьмиугольник, отображенный при помощи специального шейдера), так и вершинами объектов. Существенный минус этой системы заключается в том, что эти углы определяются так называемыми коллайдерами [6]. Система коллайдеров Unity используется в первую очередь для определения столкновений объектов. В данном случае это значит, что не все объекты, имеющие данный компонент, должны служить препятствием для света, и не все препятствия, в свою очередь, должны обладать данным компонентом.

3.3 Light2D - GPU Lighting System


Данная система обладает следующими функциями:

-       Поддержка Normal mapping;

-       Оптимизация для мобильных устройств;

-       Отсутствие необходимости в использовании коллайдеров для формирования тени;

-       Свободное изменение формы источника света;

-       Точечный, линейный, окружающий источники;

-       Поддержка системы частиц.

Для формирования освещенной области используются спрайты. Освещение формируется с использованием дополнительной камеры, которая должна быть в 1-1,5 раза больше основной. В то же время, работа с перспективной камерой поддерживается лишь частично [7].

3.4 Light2D


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

3.5 2DVLS (2D Volumetric Lights and Shadows)


Основная идея этой системы заключается в задании геометрии объекта вручную. Это несколько похоже на систему коллайдеров, описанную ранее, но их работе такая система не мешает. Пользователь создает и перемещает вершины многоугольника, которые, соединяясь последовательно, формируют контур объекта. В данном продукте реализованы точечный источник света и источник произвольной формы. Работают они по сходному алгоритму, но форма первого представляет из себя правильный многоугольник с заданным количеством граней, а область освещения второго типа задается тем же способом, что и силуэт освещаемых объектов. Кроме того, источники могут изменять угол освещаемого сектора, тем самым моделируя Spot Light. Освещение объектов рассчитывается при помощи аддитивного шейдера, используемого полигоном источника [9].


3.6 Seasons After Fall Rendering System


Французская компания Swing Swing Subrarine представила систему освещения для своей игры Seasons After Fall на конференции Game Connection Paris. Основным компонентом системы являются так называемые планы (слайсы). Суть данной системы заключается в разделении сцены на несколько планов по аналогии с живописью (задний план, передний план и т.д.). Ключевой особенностью является то, что каждый план имеет собственное освещение, эффекты, действующие на весь план, и собственное значение окружающего света. Источники освещения и тени формируются на основе их собственной системы формирования спрайтов. Освещение слайса формируется объединением двух карт освещения - передней и задней. Такая система позволяет использовать неограниченное количество источников. С другой стороны, она не позволяет использовать карты нормалей [10].

3.7 Игровой движок Ethanon 2D


Ethanon 2D - Полноценный игровой движок, сфокусированный на поддержке высококачественного освещения. Из источников освещения представлены только точечные. Поддерживается работа с тенями от 2D объектов и импортированных 3D. Настройка ширины затеняемой области производится отдельно и не зависит от формы объекта [11].

3.8 Система освещения Unity


Система освещения Unity состоит из источников освещения, системы запекания света, системы шейдеров и системы глобального освещения. Все отображаемые объекты имеют свой компонент-рендерер, к которому прикреплен материал. Материал представляет собой шейдер, параметры которого можно настраивать. Шейдеры могут быть написаны пользователями, а могут быть выбраны из стандартных. Для объявления переменных и описания функций расчета освещения используются специальные файлы с расширением. cginc.

Источники освещения являются объектами с прикрепленным к ним специальным компонентом. Unity поддерживает следующие типы источников освещения:

-       Point light

-       Spot light

-       Directional light

-       Area light

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

Таким образом, разрабатываемая система должна включать в себя как минимум следующие функции:

-       Поддержка источников освещения, подобных источником редактора Unity

-       Система расчета теней для всех типов 2D объектов

-       Расчет теней в режиме реального времени в окне редактора

-       Работа в плоскости XY

-       Работа без привязки к системе коллайдеров

-       Графический интерфейс для настройки компонентов системы

-       Поддержка шейдеров для расчета освещения объектов

Помимо этого, в расширении будет реализована система планов на подобии системы Swing, swing, submarine и специальная система для задания формы тени, отбрасываемой объектами. Для удобства использования система должна быть тщательно документирована.

4. Компоненты разрабатываемой системы


Сцена в редакторе Unity представляет собой набор объектов, к каждому из которых прикреплены какие-либо компоненты. Разрабатываемые пользователями компоненты представлены в виде скриптов, написанных на одном из двух языков программирования - C# или JavaScript. Любой отображаемый на сцене объект имеет свой компонент-рендерер, отвечающий за его рендеринг. Данный компонент одним из своих атрибутов имеет материал, к которому прикреплен определенный шейдер. Шейдер отвечает за то, как непосредственно объект будет отрисовываться на сцене, и как он будет взаимодействовать со светом. Шейдеры в Unity могут быть написаны, используя следующие языки (иногда реализация одного шейдера состоит из нескольких частей, написанных на разных языках программирования): HLSL, GLSL, Cg. Рассмотрим предполагаемую сцену Unity при использовании разрабатываемой системы. Сцена по аналогии с системой, предложенной компанией Swing Swing Submarine, разделена на так называемые планы. Каждому из них принадлежит множество объектов и источников освещения. К объектам привязаны материалы, к которым прикреплены шейдеры. Менеджеры планов собирают информацию о своих источниках освещения и передают её в качестве параметров в шейдеры.

Теперь подробнее о каждом компоненте системы.

4.1 Планы


В разрабатываемой системе предполагается реализация системы планов, подобно системе французской компании-разработчика Swing Swing Submarine. Плановость предполагает разделение сцены на слои, подобно планам, например, в живописи: задний план, средний план, передний план (Рис. 2).

Рис. 2 Система плановости в изобразительном искусстве

Естественно количество планов на сцене не должно ограничиваться тремя, так разработчики Swing Swing Submarine используют следующее разделение: background 2, background 1, playground foreground [10] (Рис. 3).

Рис. 3 Разделение игровой сцены на планы в игре Seasons after Fall

Основная идея реализации планов заключается в том, что каждый из них имеет собственное, независимое освещение. Так источники одного плана никак не взаимодействуют с объектами другого. Это верно не только для источников, размещаемых непосредственно на сцене, но и для значения окружающего света (Ambient Light). Итоговая сцена формируется последовательным наложением планов друг на друга, как показано на Рис. 4 [10].

Рис. 4 Процесс формирования итоговой сцены, состоящей из четырех планов

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

Внутри одного плана тоже необходимо каким-либо образом определять глубину. Для этого можно использовать несколько параметров, реализованных в Unity: порядок прорисовки объекта в слое и значение z-координаты объекта. Так как многие объекты в сцене представлены несколькими спрайтами, и для правильного их отображения требуется определить порядок их прорисовки, то использовать параметр порядка в слое затруднительно. Однако, Unity изначально является трехмерным движком, и даже в двухмерном режиме у нас есть возможность распределять объекты вдоль оси z.

Предлагается следующая модель взаимодействия света с объектами, в зависимости от их взаимного расположения по оси z (Рис. 5). Объект, находящийся над источником света (ближе к камере), не освещается им и не отбрасывает теней. Объект под источником также не отбрасывает теней, но освещается. Объект, находящийся на одном уровне с источником (имеющий то же значение координаты z), не освещается, но является препятствием для прохождения света, отбрасывая тень на все, что находится за ним.

Рис. 5 Взаимодействие источника освещения с объектами, в зависимости от их взаимного расположения

4.2 Объекты


Двухмерные объекты в Unity можно разделить на два типа по классу их компонента-рендерера (указан в скобках).