Поскольку система будет использоваться сторонними
разработчиками, требуется создать руководство по использованию всех компонентов
системы. Кроме того, необходимо описать все функции разрабатываемого cginc файла, так как, несмотря
на то, что в основном там будут содержаться функции cginc файлов Unity, документации последних
пока не существует.
К сожалению, Unity не позволяет создавать наследников класса Renderer, соответственно, написать собственный класс для отображения двухмерных объектов невозможно. Так как предполагается, что для использования объектов в нашей системе требуется определить некоторые дополнительные параметры каждого из них, был написан скрипт, который необходимо прикрепить к спрайту или четырехугольнику, чтобы они могли полноценно взаимодействовать с системой.
Так как в системе предполагается функция построения теней заданной формы, необходимо вычислять точки для формирования области тени. Для этого лучше подходит алгоритм формирования теней методом детализации геометрии объекта.
Так как двухмерные объекты в трехмерной пространстве как правило представляют из себя четырехугольники, состоящие из двух треугольников, то использовать данные вершины для определения формы препятствия практически невозможно. Именно поэтому геометрия спрайтов задается пользователем. Для этого используется библиотека VLS2D, реализованная в системе, описанной в пункте 3.5 данной работы.
При прикреплении к объекту необходимого компонента, создаются четыре начальных точки. В окне редактора они соединяются гранями. При нажатии клавиши Ctrl на клавиатуре, пользователь может создать точку в любом месте одной из граней. Координаты этой вершины добавляются в лист, между соседними. Удаление точки происходит при помощи кнопки Backspace. Выделенные точки можно переносить тем же образом, что и стандартные объекты на сцене. Таким образом, создавая и располагая вершины, пользователь системы может задавать контуры освещаемого объекта. Если есть необходимость получить специальный эффект, необязательно делать контур идентичным действительной границе изображения. Используя координаты этих вершин, система рассчитывает карты теней от источников, что будет описано позднее.
Процесс задания геометрии для спрайта показан на Рис. 17. На
первом шаге автоматически создаются четыре вершины (Рис. 17.1). После этого
пользователь может добавлять и перемещать новые вершины (Рис. 17.2) до
получения необходимого контура (Рис. 17.3).
Рис. 17 Формирование геометрии двухмерного объекта
Помимо окружающего света, в данной работе реализованы четыре типа источников освещения: Точечный источник (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 (), который идентичен у
всех источников освещения. Он позволяет отобразить в окне редактора какую-либо
графическую информацию о данном источнике. Так как интерфейс настройки
атрибутов источников освещения реализуется в отдельных скриптах, здесь
формируется только то, что не зависит от конкретного экземпляра класса. В
данном методе реализуется только отображение соответствующей иконки в окне
редактора на месте расположения источника.
Рассмотрим подробнее реализацию каждого типа источника.
Ambient Light - единственный тип освещения, представляющий
собой не отдельный класс, а параметр менеджера освещения. Атрибутом менеджера
задается цвет окружающего освещения, который далее передается шейдерам всех
объектов этого плана.
Как описывалось ранее, Point light освещает все объекты в пределах
определенного радиуса. Данный тип источника имеет значение type равное 1, а ширина и
высота карты теней задается пользователем в зависимости от необходимой
детализации. Уникальные атрибуты перечислены в
Таблица 2.
Таблица 2
Уникальные атрибуты класса Point Light
Имя атрибута
Тип
Значение по умолчанию
Модификатор доступа
Отображение в инспекторе
Range
float
5
public
Да
Переменная Range задается пользователем и определяет радиус
освещаемой области.
Рассмотрим реализацию методов этого класса.
В первую очередь, при построении на карте тени рассматриваемого в
данный момент объекта, координаты вершин заданной ему геометрии переносятся
таким образом, чтобы источник освещения являлся началом координат. Как
описывалось ранее, расчет теней происходит только для тех объектов, которые
имеют соответствующий компонент, попадают в зону, освещаемую источником, и
лежат с источником в одной плоскости. Так как разрабатываемая система
подразумевает использование системы планов, использовать камеру для того, чтобы
отрендерить в текстуру все объекты, освещаемые источником затруднительно.
Поэтому информация об окружающих объектах поступает к источнику не в виде
текстуры с отрисованными силуэтами, а в виде координат точек геометрии
объектов. Рисование на карте теней производится при помощи низкоуровневой
графической библиотеки Unity
GL [15].
Построение карты теней точечного источника происходит в несколько
этапов. Для каждого объекта, находящегося на одном уровне с источником, и
имеющего компонент, задающий геометрию, формируется тень в результате следующих
шагов:
1. Определение, находится ли источник внутри объекта
2. Поиск базовых и вспомогательных точек
. Поиск крайних точек
. Формирование четырехугольников
5. Поиск корректирующих коэффициентов для задания UV координат
6. Поиск "точек привязки"
. Наложение текстуры тени
В первую очередь, необходимо проверить, находится ли данный
источник освещения внутри одного из объектов. В таком случае его карта теней
будет представлять из себя полностью затененный участок.
Для данной проверки используется алгоритм определения вхождения
точки в произвольный многоугольник, предложенный в [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) вернули корректный результат.
Следующим шагом является поиск базовых точек для формирования
меша тени. Такими точками являются те, отрезок к которым от источника освещения
не пересекается ни с одной гранью. Для этого следует воспользоваться теоремой о
том, что два отрезка пересекаются тогда и только тогда, когда концы каждого из
них лежат по разные стороны прямой, которой принадлежит другой. Для определения
положения точки относительно прямой можно воспользоваться векторным
произведением векторов, сформированных двумя точками прямой и исследуемой
точкой. Так как все точки лежат в одной плоскости, векторное произведение будет
перпендикулярно этой плоскости, тогда нам нужно лишь узнать знак z-координаты, который
укажет, куда этот вектор направлен. Таким образом, если знаки векторных
произведений для двух точек совпадают, то они находятся по одну сторону от
прямой. В результате, мы проверяем пересечение отрезков, концами одного из
которых являются положение источника освещения и проверяемая вершина, а другого
- две соседние вершины, образующие проверяемую грань. При нахождении первого
пересечения, проверка заканчивается - точка базовой не является.
Координаты вспомогательных точек получаются путем переноса
координат базовых в направлении вектора от источника к базовой точке.
Для построения меша итоговой тени требуется обходить
найденные вершины в определенном порядке. Однако, в результате предыдущих
действий мы получили лишь массив вершин. Требуется определить так называемые
"крайние" точки, предполагающие, что все вершины, задающие форму
тени, будут располагаться в секторе между ними.
Для этого используется функция поиска максимального угла
между векторами, сформированными двумя соседними базовыми точками и положением
источника. Так как в сформированном ранее массиве все вершины располагаются
последовательно в порядке возрастания порядковых номеров, можно однозначно
утверждать, что крайние точки будут располагаться в массиве либо в соседних
ячейках, либо в двух крайних.
Метод Vector3. Angle () определяет меньший из углов между векторами.
Однако, так как форма объекта может представлять собой невыпуклый
многоугольник, следует учитывать, что угол может быть больше 180 градусов,
соответственно, следует принимать значение угла, равное 360-Vector3. Angle (). Для нахождения таких
случаев, проверяется пересечение отрезка с концами в точке расположения
источника освещения и точки, лежащей на биссектрисе проверяемого игла, на предмет
пересечения с гранями многоугольника. Если такого пересечения не наблюдается,
то значение меньшего угла вычитается из 360 градусов. Когда получены необходимые координаты, можно построить меш
тени. Для этого строятся четырехугольники, вершинами которых являются две
базовые точки и соответствующие их вспомогательные. Так как в последствии
необходимо на этот меш наложить текстуру тени, требуется для каждой вершины
определить UV-координаты этой текстуры.
UV-координаты определяют, какой точке накладываемой
текстуры будет соответствовать данная вершина меша. Каждая координата имеет
значение в промежутке (0;
). Так точка (0, 0) соответствует нижнему-левому углу
текстуры, а (1, 1), соответственно, верхнему-правому. Однако, если задать UV-координаты вершинам
четырехугольника таким образом, на границе двух треугольников возникнет видимый
шов.
Чтобы избежать этого, требуется передавать в вертексный шейдер три
координаты (qu, qv, q), которые будут обратно преобразовываться
в фрагментном шейдере делением на q [17].
Допустим, задан четырехугольник p0p1p2p3.
Тогда q вычисляется следующим образом. Введем
вектора a, b и c. Они будут равны соответственно В итоге, получается четыре значения q, тогда UV-координаты
для каждой вершины будут представлены в виде Данные координаты задаются при создании каждой новой вершины. Так
как итоговый меш состоит из нескольких четырехугольников, необходимо умножать u-координату на некоторый коэффициент, определяющий какая
часть текстуры соответствует этому полигону. Для того, чтобы найти этот
коэффициент, предлагается вычислить угол между первой крайней точкой,
соответствующей UV-координате (0, 0), и данной вершиной и
разделить это значение на общий угол между крайними точками.
Так как вершины многоугольника соединяются прямой гранью, при
определенных значениях угла между крайними точками может возникать ситуация,
что сформированная фигура не заполняет карту целиком. Чтобы предотвратить это,
формируются дополнительные треугольники между соседними вершинами и точкой
привязки одного из них. Точкой привязки является ближайшая вершина
четырехугольника карты тени.
Сформировав итоговый меш тени, необходимо наложить на него
соответствующую текстуру. Если у освещаемого объекта задана форма тени,
выбирается она, в противном случае, данная текстура является полностью черным
изображением. Для того, чтобы сформировать области затенения, текстура
накладывается, используя простой мультипликативный шейдер, благодаря чему все
точки затененные до этого, или находящиеся в тени в сформированной карте,
остаются таковыми.
Данный метод позволяет передать в шейдер объекта ту
информацию об источнике, которая является уникальной для данного типа. В случае
Point Light это позиция источника и
его тип, радиус, матрицы трансформации для cookie и карты теней, текстура cookie.
Позиция источника передается в виде четырех координат, первые
три из которых соответствуют положению источника на сцене, а последняя
определяет его тип. Радиус источника передается в виде числа с плавающей
запятой.
Матрица трансформации cookie является перемножением
трёх матриц: переноса, поворота и масштабирования. Стандартная функция SetTRS () перемножает матрицы в
порядке "перенос, поворот, масштабирование", что не подходит для
данного случая, так как поворот осуществляется относительно нуля координат.
Из-за этого каждая матрица создаётся отдельно и после этого перемножается с другими
таким образом, чтобы сначала повернуть объект, и лишь потом перенести и
масштабировать. Матрица трансформации карты теней использует те же компоненты,
но итоговая матрица не умножается на матрицу поворота.
Матрица трансформации карты теней получается перемножением
матриц переноса и масштабирования, так как не зависит от вращения источника
освещения.
Данный метод позволяет исключить некоторые объекты,
неосвещаемые данным источником, из расчета карты теней. Объект считается
освещенным Point Light, если хотя бы одна из вершин его фигуры находится на меньшем
расстоянии от источника, чем радиус.
Класс Spot Light наследуется от Point Light. С точки зрения расчетов
освещения этот тип источника освещения отличается от точечного только тем, что
освещает объекты, расположенные в пределах конкретного сектора, заданного углом
(
Таблица 3). Если угол равен 360 градусам, то Spot Light
полностью идентичен Point Light.
Таблица 3
Уникальные атрибуты класса Point Light
Имя атрибута
Тип
Значение по умолчанию
Модификатор доступа
Отображение в инспекторе
Angle
float
30
public
Да
Рассмотрим только те методы, которые отличаются от
родительского класса.
Весь алгоритм расчета теней остается неизменным, за
исключением метода очистки карты теней. Если перед формированием карты в Point Light текстура полностью
заливалась белым цветов, то здесь вся часть изображения, не попадающая в
освещаемый сектор, заполняется черным. Для этого формируются неосвещенные
треугольники из точки центра карты, соответствующей положению источника, точек,
вектор к которым образует с вектором, направленным вертикально вниз угол,
равный половине сопряженного угла заданному, и углов текстуры.
Помимо проверки нахождения как минимум одной из точек объекта
внутри радиуса источника, метод определяет, попадает ли данная точка в
освещаемый сектор. Это верно тогда, когда угол между вектором, образованными
проверяемой точкой и положением источника и осью симметрии меньше значения
половины угла, заданного параметром Spot Light.
Directional light моделирует источник
освещения, удаленный на бесконечное расстояние от объекта, свет которого
распространяется равномерно вдоль бесконечного числа лучей, направленных под
заданным углом. Дополнительных атрибутов этот источник не имеет, так как угол
поворота, как и положение в пространстве, задается компонентом Transform, прикрепленным ко всем
объектам на сцене. Directional light имеет значение type, равное 0, а ширина и
высота карты теней соответствуют габаритам области видимости камеры.
Общий алгоритм построения карты теней Directional Light похож на Point Light. Однако, в данном случае
нет необходимости проверять нахождение источника внутри объекта. Кроме того, перенос
вспомогательных точек осуществляется вдоль вектора, направленного под углом,
заданным источником. Таким образом, точки переносятся параллельно друг другу.
Набор передаваемых значений данным типом источника
существенно меньше набора Point Light. В шейдеры передается лишь информация о позиции
источника в пространстве (требуется для определения, располагается объект ниже,
выше или на одном уровне с источником и матрица трансформации карты теней.
Directional Light освещает всю область сцены. Поэтому проверка
заключается в определении, находится ли данный объект в видимой камерой
области.
Пример теней, сформированных данным классом, представлен на Ошибка!
Источник ссылки не найден..
В данной работе Area Light представляет собой
равномерно освещенную область, заданную прямоугольником. Свет направлен
параллельно взгляду наблюдателя, соответственно, данный тип источника не
формирует тени объектов. Индивидуальные атрибуты этого класса представлены в
Таблица 4 и отвечают за определение прямоугольной области, которая
и освещается данным источником.
Таблица 4
Уникальные атрибуты класса Area Light
Имя атрибута
Тип
Значение по умолчанию
Модификатор доступа
Отображение в инспекторе
AreaWidth
float
5
public
Да
AreaHeight
float
5
public
Да
Значение переменной type для Area light равно 2.
Так как объекты, освещенные Area Light, не отбрасывают тени, то
карта теней представляет собой белую текстуру 1x1 пиксель.
Area Light кроме общих атрибутов также передает в шейдер
значения ширины и высоты освещаемой области.
Объект считается обрабатываемым Area Light, если хотя бы одна его
вершина находится внутри образованного источником прямоугольника. Таким
образом, необходимо проверить, что разность координат x данной точки и положения
источника меньше половины заданной ширины, а разность координат y, соответственно, высоты.
Тем не менее, данный метод используется для предотвращения
обработки лишних объектов в ShadowMap (), и, учитывая, что Area Light не формирует теней,
таким образом его реализация может быть сведена к возврату константного
значения true.
Для реализации системы планов используется встроенная в Unity система наследования.
Для всех объектов, принадлежащих данному плану, он является родителем в
иерархии Unity. Таким образом, возможно использовать встроенные функции, чтобы
получить их количество и список.
Каждому объекту-плану прикрепляется скрипт менеджера
освещения. Сначала этот компонент собирает информацию об источниках и
освещаемых объектах этого плана. Для этого при помощи встроенной функции Unity в два массива
записываются все компоненты Renderer и LightSource, прикрепленные к объектам-наследникам. После
этого каждый кадр менеджер передает шейдерам всех объектов информацию об Ambient Light. Далее для каждого
освещаемого объекта выбираются ближайшие восемь источников освещения. Для
каждого из этих источников вызывается метод MaterialSettings, описанный ранее,
который передает все необходимые параметры материалу. Затем в шейдер передаются
параметры, наличие которых не зависит от реализации источника. Ими являются
цвет, интенсивность и карта теней. Последняя перед этим формируется вызовом
соответствующего метода источника.
Шейдеры 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.
Для всех расчетов используется модель затенения Ламберта. Согласно этой модели
результирующее освещение точки вычисляется по формуле Таким образом, написание шейдера, работающего с разработанной
системой требует подключение дополнительного файла, но также предоставляет
набор заранее описанных методов.
Для примера был написан шейдер, использующий данные функции и рассчитывающий
освещение объекта от восьми ближайших источников. Первые четыре рассчитываются
попиксельно, следующие - повертексно. Данный шейдер, принимая данные от
менеджера освещения, определяет тип источника, после чего и вызывает
соответствующую функцию.
За отображение в редакторе источников освещения отвечают
отдельные скрипты. Эти компоненты наследуются от класса Editor, и позволяют как
рисовать на экране какие-либо элементы, так и создавать контроллеры, при помощи
которых можно изменять значения каких-либо переменных. В отличии от метода OnDrawGizmos класса источников,
данная графическая информация отображается только если объект выделен
пользователем.
Редактор Point Light строит на сцене окружность с центром в точке
положения источника. Эта окружность имеет радиус и цвет равные радиусу и цвету Point Light, что дает наглядно
видеть, какая область освещается этим источников. Справа на окружности
располагается управляющий элемент, перетаскивая который, можно изменять радиус
источника в окне редактора.
Редактор Spot Light аналогичен редактору Point Light за исключением того, что
дополнительными линиями ограничивается освещаемый сектор. Управляющий элемент
располагается на окружности заданного радиуса, на равном расстоянии между
ограничивающими сектор линиями.
Редактор Directional Light не позволяет изменять
какие-либо атрибуты источника, так как поворот можно задавать встроенной
системой управления компонентами Unity. Данный компонент рисует пять параллельных линий
от точки расположения источника. Эти линии имею цвет равный цвету Directional Light. Кроме того, они
направлены под соответствующим углом так, чтобы можно было понять, в каком
направлении движется свет от источника.
Редактор Area Light формирует прямоугольник (Ошибка!
Источник ссылки не найден.), соответствующий области освещения, а также
управляющие элементы для изменения высоты и ширины.
Так как предполагается, что данной системой будет
пользоваться сторонний разработчик, необходимо обеспечить сопутствующую
документацию к ней.
Документация включает в себя:
- Перечень компонентов системы с описанием
их назначения, порядка добавления на сцену и настройки;
- Перечень доступных для использования
классов и их публичных атрибутов и методов;
- Перечень и назначение описанных в 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
Приложение Р.
Реализация шейдера аддитивного наложения текстуры на карту теней
Приложение
С. Реализация базового шейдера для работы с системой
Приложение Т.
Ссылка на интернет ресурс с пользовательской документацией системы
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
Поиск крайних точек
.2.2.1.4 Формирование
четырехугольников
5.2.2.1.5
Поиск корректирующих коэффициентов для задания UV координат
![]()
, ![]()
, ![]()
, тогда:
,
,
,
,
,
![]()
, где i - номер вершины.
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 Шейдер
![]()
, где I - результирующее значение отраженного
света, L - направление источника, N - нормаль поверхности, C - цвет источника освещения, IL - интенсивность источника. Это значение
интенсивности перемножается со значениями карты теней и Cookie в данной точке, и складывается с
аналогичным освещением от других источников, включая окружающее освещение.
Затем получившаяся сумма умножается на значение цвета данной точки поверхности,
зависящее от текстуры объекта [18].
5.5 Интерфейс
5.5.1 Point
Light
5.5.2 Spot
Light
5.5.3
Directional Light
5.5.4 Area
Light
5.6
Документация
Заключение
Список
использованных источников