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

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

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

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


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


К сожалению, Unity не позволяет создавать наследников класса Renderer, соответственно, написать собственный класс для отображения двухмерных объектов невозможно. Так как предполагается, что для использования объектов в нашей системе требуется определить некоторые дополнительные параметры каждого из них, был написан скрипт, который необходимо прикрепить к спрайту или четырехугольнику, чтобы они могли полноценно взаимодействовать с системой.

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

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

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

Процесс задания геометрии для спрайта показан на Рис. 17. На первом шаге автоматически создаются четыре вершины (Рис. 17.1). После этого пользователь может добавлять и перемещать новые вершины (Рис. 17.2) до получения необходимого контура (Рис. 17.3).

Рис. 17 Формирование геометрии двухмерного объекта

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


Помимо окружающего света, в данной работе реализованы четыре типа источников освещения: Точечный источник (Point Light), Направленный источник (Directional Light), Spot Light и Area Light.

Все типы источников освещения имеют общие атрибуты, представленные в

Таблица 1.

Таблица 1

Общие атрибуты всех типов источников освещения

Имя атрибута

Тип

Значение по умолчанию

Модификатор доступа

Отображение в инспекторе

Color

Color

Color. white

public

Да

Intensity

float

1

public

Да

Cookie

Texture2D

null

public

Да

Type

float

1

protected

Нет

Shadow map

Render texture

null

public

Нет

Shadow shader

string

"ShadowTexture"

protected

Нет

Width

int

512

public

Нет

Height

int

512

public

Нет

Icon

string

"Light2D. png"

protected

Нет


Атрибут Color определяет цвет излучаемого света, Intensity - его интенсивность. Cookie представляет собой текстуру, используемую в качестве маски для освещаемой области. Эти атрибуты единственные из общих, доступные для модификации пользователем в редакторе.

Type задает тип источника в числовом виде, в последствии это значение передается в качестве четвертой координаты позиции источника в шейдер для определения, какая функция расчета освещения должна быть использована. Shadow map - специальная текстура, имеющая ширину Width и высоту Height. Она используется для построения непосредственно карты теней источника. Строка Shadow shader хранит названия шейдера, используемого для наложения тектуры тени. Icon задает название изображения, используемого данным источником в качестве иконки в окне редактора Unity.

Точно так же у каждого источника должна быть собственная реализация некоторых методов. ShadowMap () формирует карту теней. MeterialSettings () отвечает за передачу необходимых данных об источнике в шейдер объекта. Функция IsInsideArea () проверяет, попадает ли данный объект в зону, освещенную источником, и, соответственно, надо ли его обрабатывать. Данные атрибуты и методы составляют абстрактный класс LightSourceScript. Это позволяет добавлять новые типы источников, не меняя логику работы менеджера освещения.

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

Рассмотрим подробнее реализацию каждого типа источника.

 

5.2.1 Ambient Light

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

 

5.2.2 Point Light

Как описывалось ранее, Point light освещает все объекты в пределах определенного радиуса. Данный тип источника имеет значение type равное 1, а ширина и высота карты теней задается пользователем в зависимости от необходимой детализации. Уникальные атрибуты перечислены в

Таблица 2.

Таблица 2

Уникальные атрибуты класса Point Light

Имя атрибута

Тип

Значение по умолчанию

Модификатор доступа

Отображение в инспекторе

Range

float

5

public

Да


Переменная Range задается пользователем и определяет радиус освещаемой области.

Рассмотрим реализацию методов этого класса.

 


5.2.2.1 ShadowMap

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

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

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

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

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

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

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

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

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

 

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

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

Для данной проверки используется алгоритм определения вхождения точки в произвольный многоугольник, предложенный в [16]. Изначально метод был основан на расчете барицентрических координат точки (α, β, γ), относительно треугольника V0V1V2, где V1 и V2 - две соседние вершины многоугольника, а V0 - произвольная точка. На основе знаков этих координат можно определить, находится точка внутри треугольника, снаружи, на одной из граней, соответствует ли вершине треугольника, лежит ли на одной прямой с какой-либо гранью. Полный перечень возможных комбинаций и соответствующих им положений точки представлен на Рис. 18.

Рис. 18 Соответствие знаков барицентрических координат точки и её положения относительно треугольника

Однако, если произвольную точку зафиксировать в координатах (x, y-1), где x и y - координаты рассматриваемой точки, то исключается возможность их совпадения, а алгоритм получает существенное упрощение. В первую очередь следует транслировать координаты рассматриваемых в данный момент вершин так, чтобы проверяемая точка находилась в центре координат (Рис. 19).

Рис. 19 Коррекция координат вершин исследуемого треугольника

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

Если β < 0 или γ < 0, то точка находится вне треугольника (Рис. 20.1). Это соответствует случаю, когда грань ViVj не пересекает ось y, что подразумевает (xi > 0 and xj > 0) or (xi < 0 and xj < 0), или xi · xj > 0, где i и j - номера исследуемых вершин.

Рис. 20 1) Отрезок ViVj не пересекает ось ординат; 2) Точки Vi и Vj лежат ниже оси абсцисс

Проверяемая точка однозначно находится вне треугольника, y-координаты вершин которого меньше нуля (Рис. 20.2). Если xi > xj, следует проверить положение ViVj относительно точек P и O. Существует три варианта (случай, при котором ViVj проходит через P или O будет рассмотрен далее): ViVj находится выше P и O (Рис. 21), между P и O (Рис. 22.1), ниже P и O (Рис. 22.2). Первый случай удовлетворяет условию |OViVj| > 0 и |PViVj| > 0, второй - |OViVj| > 0 и |PViVj| < 0, третий - |OViVj| < 0 и |PViVj| <0. Таким образом, P находится внутри OViVj, если |PViVj| > 0 и xi > xj. Если |PViVj| < 0 и xi >xj, P находится вне треугольника независимо от знака |OViVj|.

Рис. 21 Отрезок ViVj лежит выше точек P и O

Рис. 22 1) Отрезок ViVj расположен между точками P и O; 2) Отрезок ViVj находится ниже точки O

Случай xi < xj, аналогичен предыдущему за исключением того, что Vi и Vj меняются местами. Если xi = xj, то треугольник OViVj является вырожденным. Тогда рассматриваются три случая: P находится на отрезке ViVj (Рис. 23.1 - 2), P ниже ViVj (Рис. 23.3) или P выше ViVj (Рис. 23.4). Последний случай был уже рассмотрен ранее. Точка P находится на отрезке ViVj тогда, когда (yi ≤ 0 или yj ≤ 0) и xi = xj.

Рис. 23 Взаимное расположение точки P и грани ViVj в вырожденном треугольнике

Существует три случая, при которых P принадлежит одной из граней треугольника (Рис. 24).

P лежит на ViVj (включая концы), если α = 0, это соответствует случаю |PViVj| = 0 и треугольник не был отброшен ранее.

P лежит на OVj (не включая вершины), если xj = 0 и треугольник не был отброшен ранее.

P лежит на OVi (не включая вершины), если xi = 0 и треугольник не был отброшен ранее.

Рис. 24 Точка P принадлежит одной из граней треугольника

Если O лежит на ViVj (включая вершины), OViVj - вырожденный треугольник. Разбором данного случая можно пренебречь, так как предыдущие условия (|PViVj| < 0 и xi < xj) и (|PViVj| > 0 и xi < xj) вернули корректный результат.

 

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

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

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

 

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

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

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

Метод Vector3. Angle () определяет меньший из углов между векторами. Однако, так как форма объекта может представлять собой невыпуклый многоугольник, следует учитывать, что угол может быть больше 180 градусов, соответственно, следует принимать значение угла, равное 360-Vector3. Angle (). Для нахождения таких случаев, проверяется пересечение отрезка с концами в точке расположения источника освещения и точки, лежащей на биссектрисе проверяемого игла, на предмет пересечения с гранями многоугольника. Если такого пересечения не наблюдается, то значение меньшего угла вычитается из 360 градусов.

 

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

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

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

UV-координаты определяют, какой точке накладываемой текстуры будет соответствовать данная вершина меша. Каждая координата имеет значение в промежутке (0;

). Так точка (0, 0) соответствует нижнему-левому углу текстуры, а (1, 1), соответственно, верхнему-правому. Однако, если задать UV-координаты вершинам четырехугольника таким образом, на границе двух треугольников возникнет видимый шов.

Чтобы избежать этого, требуется передавать в вертексный шейдер три координаты (qu, qv, q), которые будут обратно преобразовываться в фрагментном шейдере делением на q [17].

Допустим, задан четырехугольник p0p1p2p3.

Тогда q вычисляется следующим образом. Введем вектора a, b и c. Они будут равны соответственно , , , тогда:

, , , , ,

В итоге, получается четыре значения q, тогда UV-координаты для каждой вершины будут представлены в виде , где i - номер вершины.

Данные координаты задаются при создании каждой новой вершины. Так как итоговый меш состоит из нескольких четырехугольников, необходимо умножать u-координату на некоторый коэффициент, определяющий какая часть текстуры соответствует этому полигону. Для того, чтобы найти этот коэффициент, предлагается вычислить угол между первой крайней точкой, соответствующей UV-координате (0, 0), и данной вершиной и разделить это значение на общий угол между крайними точками.

 

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

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

 

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

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

5.2.2.2 MaterialSettings

Данный метод позволяет передать в шейдер объекта ту информацию об источнике, которая является уникальной для данного типа. В случае Point Light это позиция источника и его тип, радиус, матрицы трансформации для cookie и карты теней, текстура cookie.

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

Матрица трансформации cookie является перемножением трёх матриц: переноса, поворота и масштабирования. Стандартная функция SetTRS () перемножает матрицы в порядке "перенос, поворот, масштабирование", что не подходит для данного случая, так как поворот осуществляется относительно нуля координат. Из-за этого каждая матрица создаётся отдельно и после этого перемножается с другими таким образом, чтобы сначала повернуть объект, и лишь потом перенести и масштабировать. Матрица трансформации карты теней использует те же компоненты, но итоговая матрица не умножается на матрицу поворота.

Матрица трансформации карты теней получается перемножением матриц переноса и масштабирования, так как не зависит от вращения источника освещения.

 

5.2.2.3 IsInsideArea

Данный метод позволяет исключить некоторые объекты, неосвещаемые данным источником, из расчета карты теней. Объект считается освещенным Point Light, если хотя бы одна из вершин его фигуры находится на меньшем расстоянии от источника, чем радиус.

 

5.2.3 Spot Light

Класс Spot Light наследуется от Point Light. С точки зрения расчетов освещения этот тип источника освещения отличается от точечного только тем, что освещает объекты, расположенные в пределах конкретного сектора, заданного углом (

Таблица 3). Если угол равен 360 градусам, то Spot Light полностью идентичен Point Light.

Таблица 3

Уникальные атрибуты класса Point Light

Имя атрибута

Тип

Значение по умолчанию

Модификатор доступа

Отображение в инспекторе

Angle

float

30

public

Да


Рассмотрим только те методы, которые отличаются от родительского класса.

5.2.3.1 ShadowMap

Весь алгоритм расчета теней остается неизменным, за исключением метода очистки карты теней. Если перед формированием карты в Point Light текстура полностью заливалась белым цветов, то здесь вся часть изображения, не попадающая в освещаемый сектор, заполняется черным. Для этого формируются неосвещенные треугольники из точки центра карты, соответствующей положению источника, точек, вектор к которым образует с вектором, направленным вертикально вниз угол, равный половине сопряженного угла заданному, и углов текстуры.

 

5.2.3.2 IsInsideArea

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

5.2.4 Directional Light

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

 

5.2.4.1 ShadowMap

Общий алгоритм построения карты теней Directional Light похож на Point Light. Однако, в данном случае нет необходимости проверять нахождение источника внутри объекта. Кроме того, перенос вспомогательных точек осуществляется вдоль вектора, направленного под углом, заданным источником. Таким образом, точки переносятся параллельно друг другу.

5.2.4.2 MaterialSettings

Набор передаваемых значений данным типом источника существенно меньше набора Point Light. В шейдеры передается лишь информация о позиции источника в пространстве (требуется для определения, располагается объект ниже, выше или на одном уровне с источником и матрица трансформации карты теней.

 

5.2.4.3 IsInsideArea

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

Пример теней, сформированных данным классом, представлен на Ошибка! Источник ссылки не найден..

 

5.2.5 Area Light

В данной работе Area Light представляет собой равномерно освещенную область, заданную прямоугольником. Свет направлен параллельно взгляду наблюдателя, соответственно, данный тип источника не формирует тени объектов. Индивидуальные атрибуты этого класса представлены в

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

Таблица 4

Уникальные атрибуты класса Area Light

Имя атрибута

Тип

Значение по умолчанию

Модификатор доступа

Отображение в инспекторе

AreaWidth

float

5

public

Да

AreaHeight

float

5

public

Да


Значение переменной type для Area light равно 2.

 

5.2.5.1 ShadowMap

Так как объекты, освещенные Area Light, не отбрасывают тени, то карта теней представляет собой белую текстуру 1x1 пиксель.

 

5.2.5.2 MaterialSettings

Area Light кроме общих атрибутов также передает в шейдер значения ширины и высоты освещаемой области.

 

5.2.5.3 IsInsideArea

Объект считается обрабатываемым Area Light, если хотя бы одна его вершина находится внутри образованного источником прямоугольника. Таким образом, необходимо проверить, что разность координат x данной точки и положения источника меньше половины заданной ширины, а разность координат y, соответственно, высоты.

Тем не менее, данный метод используется для предотвращения обработки лишних объектов в ShadowMap (), и, учитывая, что Area Light не формирует теней, таким образом его реализация может быть сведена к возврату константного значения true.

5.3 Плановость


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

Каждому объекту-плану прикрепляется скрипт менеджера освещения. Сначала этот компонент собирает информацию об источниках и освещаемых объектах этого плана. Для этого при помощи встроенной функции Unity в два массива записываются все компоненты Renderer и LightSource, прикрепленные к объектам-наследникам. После этого каждый кадр менеджер передает шейдерам всех объектов информацию об Ambient Light. Далее для каждого освещаемого объекта выбираются ближайшие восемь источников освещения. Для каждого из этих источников вызывается метод MaterialSettings, описанный ранее, который передает все необходимые параметры материалу. Затем в шейдер передаются параметры, наличие которых не зависит от реализации источника. Ими являются цвет, интенсивность и карта теней. Последняя перед этим формируется вызовом соответствующего метода источника.

 

5.4 Шейдер


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

Таблица 5.

Таблица 5

Описание переменных cginc файла, необходимых для работы системы

Имя переменной

Тип

Описание

_AmbientColor

float4

Цвет окружающего света для данного плана

_LightPosition0

float4

Координаты источника освещения

_LightCol0

half4

Цвет источника освещения

_LightIntensity0

float

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

_LightRange0

float

Радиус источника освещения

_LightWidth0

float

Параметр ширины Area light

_LightHeigth0;

float

Параметр высоты Area light

_LightTex0

sampler2D

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

_LightTRSMatrix0

float4x4

Матрица, необходимая для преобразования cookie-текстуры

_Shadow0

sampler2D

Карта теней данного источника

_ShadowMatrix0

float4x4

Матрица для преобразования карты теней


Также, в данном файле реализованы функции расчета освещения объекта. Эти функции включают вертексное освещение источником Point light и фрагментное освещение Point light, Directional light и Area light. Для всех расчетов используется модель затенения Ламберта. Согласно этой модели результирующее освещение точки вычисляется по формуле , где I - результирующее значение отраженного света, L - направление источника, N - нормаль поверхности, C - цвет источника освещения, IL - интенсивность источника. Это значение интенсивности перемножается со значениями карты теней и Cookie в данной точке, и складывается с аналогичным освещением от других источников, включая окружающее освещение. Затем получившаяся сумма умножается на значение цвета данной точки поверхности, зависящее от текстуры объекта [18].

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

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

 

5.5 Интерфейс


За отображение в редакторе источников освещения отвечают отдельные скрипты. Эти компоненты наследуются от класса Editor, и позволяют как рисовать на экране какие-либо элементы, так и создавать контроллеры, при помощи которых можно изменять значения каких-либо переменных. В отличии от метода OnDrawGizmos класса источников, данная графическая информация отображается только если объект выделен пользователем.

 

5.5.1 Point Light

Редактор Point Light строит на сцене окружность с центром в точке положения источника. Эта окружность имеет радиус и цвет равные радиусу и цвету Point Light, что дает наглядно видеть, какая область освещается этим источников. Справа на окружности располагается управляющий элемент, перетаскивая который, можно изменять радиус источника в окне редактора.

5.5.2 Spot Light

Редактор Spot Light аналогичен редактору Point Light за исключением того, что дополнительными линиями ограничивается освещаемый сектор. Управляющий элемент располагается на окружности заданного радиуса, на равном расстоянии между ограничивающими сектор линиями.

 

5.5.3 Directional Light

Редактор Directional Light не позволяет изменять какие-либо атрибуты источника, так как поворот можно задавать встроенной системой управления компонентами Unity. Данный компонент рисует пять параллельных линий от точки расположения источника. Эти линии имею цвет равный цвету Directional Light. Кроме того, они направлены под соответствующим углом так, чтобы можно было понять, в каком направлении движется свет от источника.

5.5.4 Area Light

Редактор Area Light формирует прямоугольник (Ошибка! Источник ссылки не найден.), соответствующий области освещения, а также управляющие элементы для изменения высоты и ширины.

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


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

Документация включает в себя:

-       Перечень компонентов системы с описанием их назначения, порядка добавления на сцену и настройки;

-       Перечень доступных для использования классов и их публичных атрибутов и методов;

-       Перечень и назначение описанных в cginc файле переменных и функций.

Компоненты описываются по следующей структуре:

1.      Название;

2.      Назначение;

.        Описание всех атрибутов;

.        Примеры использования.

Описание классов состоит из общей информации об их назначении и описании публичных атрибутов и методов по следующей структуре:

1.      Название метода или атрибута;

2.      Назначение;

3.      Для метода: описание всех входных параметров;

.        Пример использования в виде фрагмента написанного кода.

Описание шейдерных функций по своей структуре соответствует описанию методов классов.

В качестве платформы для размещения документации служит сервис Google Сайты. Это дает возможность легко редактировать руководство, а также быстро осуществлять поиск необходимого метода или класса, используя встроенный сервис. Под каждый элемент системы отводится своя страница. Карта сайта представляет собой иерархическую структуру, показанную на Ошибка! Источник ссылки не найден.. Ссылка на сайт представлена в виде QR-кода в Приложении

Карта сайта документации

Заключение


Результатом работы является расширение для игрового движка Unity, позволяющее двухмерным объектам отбрасывать тени и использовать шейдеры. Система состоит из 12 скриптов, написанных на языке C#, одного файла с расширением. cginc и двух шейдеров на языке Cg. Исходные коды представленны в приложении.

Система позволяет любому объекту с прикрепленным к нему компонентом LightObstacle служить препятствием для созданных источников света. Также предусмотрена возможность рассчитывать в шейдерах освещенность поверхностей используя карты нормалей. Абстрактный класс LightSourceScript позволяет пользователям создавать собственные типы источников освещения, не меняя логику работы менеджера освещения.

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

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

Дальнейшая работа предполагает публикацию расширения в магазине Unity Asset Store, расширение функционала и поддержку пользователей.

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


1. Unity Technologies Made with Unity. URL: #"896898.files/image037.jpg">

Приложение Б. Реализация класса PointLight2D













Приложение В. Реализация класса SpotLight2D

 




Приложение Г. Реализация класса DirectionalLight2D







Приложение Д. Реализация класса AreaLight2D

 




Приложение Е. Реализация класса Utility2D





Приложение Ж. Реализация класса ShadowCaster

 


Приложение И. Реализация класса LightManagerScript

 




Приложение К. Реализация класса PointLightEditor

 

 

Приложение Л. Реализация класса SpotLightEditor

 


Приложение М. Реализация класса DirectionalLightEditor

 


Приложение Н. Реализация класса AreaLightEditor

 


Приложение П. Реализация файла Light2D. cginc

 

 

 


Приложение Р. Реализация шейдера аддитивного наложения текстуры на карту теней

 



Приложение С. Реализация базового шейдера для работы с системой

 





Приложение Т. Ссылка на интернет ресурс с пользовательской документацией системы