- Спрайты (SpriteRenderer);
- Полигоны (MeshRenderer), то есть quad и plane.
В зависимости от задач разрабатываемого приложения, могут использоваться объекты любой из групп, поэтому необходимо обеспечить работу разрабатываемой системы с обоими типами. Предполагается, что у объектов задан некоторый материал, к которому прикреплен соответствующий шейдер, отвечающий за расчет внутреннего освещения компонента.
Так как двухмерный объект представлен на сцене четырехугольной фигурой с наложенной на неё текстурой, определение формы освещаемого изображения на основе координат четырех вершин приведет к появлению неточностей в формировании области затенения. Таким образом, необходимо опираться либо на значение альфа-канала текстуры, либо на заданную отдельно геометрию объекта. Так как предполагается, что в разрабатываемой системе будет возможность задать форму тени, а для этого требуется знать координаты вершин, определяющих тень, о чем будет описано далее, был выбран второй вариант.
Освещение любого объекта зависит от источников света,
расположенных на сцене. По аналогии с системой освещения Unity можно выделить следующие
типы источников.
Ambient light симулирует освещение, полученное за счет многократного отражения света от поверхностей окружающих объектов. Технически, Ambient light освещает все точки сцены с одинаковой интенсивностью и как правило является константой. В разрабатываемой системе данный источник освещения задается индивидуально для каждого плана.
Основным параметром Ambient Light является цвет.
Directional light излучает свет в виде бесконечного множества бесконечно удаленных от объектов и направленных под определенным углом лучей (Рис. 6). Как правило, Directional Light используется для моделирования солнечного света.
Данный тип источника не имеет позиции в пространстве, радиуса
действия, и интенсивность освещения не падает с удалением объекта от источника.
Рис. 6 Направление распространения света Directional Light
Основными параметрами Directional Light являются угол поворота, цвет и интенсивность.
Point light
излучает свет одинаково во всех направлениях из определенной точки
пространства. Интенсивность света падает с удалением от этой точки (Рис. 7).
Данный источник используется для моделирования света от ламп, костров и
подобных ненаправленных источников.
Рис. 7. Распространение света в пределах радиуса Point Light
Основными параметрами Point Light являются позиция, радиус, цвет и
интенсивность.
Spot light очень похож на Point light. Отличие заключается в
том, что в данном источнике освещения есть приоритетное направление излучения
света. То есть, если освещаемую область point light можно представить в виде
сферы (круга в 2D пространстве), то spot light освещает только некоторый заданный сектор. Этот
тип может моделировать свет фонаря, прожектора и других направленных
источников.
Рис. 8 Распространение света в пределах радиуса и заданного угла Spot Light
Основными параметрами Spot Light являются позиция, угол поворота, радиус, угол освещаемого сектора, цвет и интенсивность [12].
В отличие от ранее описанных типов источников, Area Light излучает свет равномерно по определенной площади.
Поэтому у освещенных объектов появляются области как полной тени, так и полутеней. Расчет освещения от такого источника - достаточно ресурсоемкая задача, из-за этого принимаются различные упрощения, как например расчет нескольких теней с их последующим размытием [13].
С точки зрения расчетов, интенсивность света затухает подобно Point light по мере удаления от области, освещаемой источником (Рис. 9) [14].
Рис. 9 Область затухания света Area Light
В данной работе, предполагается, что Area Light освещает некоторую область равномерно, подобно Directional Light, направленному параллельно лучу наблюдения. Таким образом, основными параметрами данного источника будут цвет, интенсивность, позиция, а также длина и ширина освещаемой площади.
Некоторые поверхности сами по себе представляют источники освещения. Это значит, что их освещенность всегда максимальна, независимо от наличия рядом других источников. Для достижения данного эффекта применяются специальные шейдеры [13]. В данной работе подобный тип освещения не рассматривается.
Кроме позиции, цвета и интенсивности, все источники освещения имеют еще один общий атрибут - Cookie. Он представляет собой черно-белую текстуру, задающую уровень освещенности в конкретной точке. Так, если точке в пространстве соответствует белая область Cookie, она освещается полностью, если черная, находится в тени, независимо от того, действительно ли попадает эта точка в тень от какого-то объекта. Такая маска позволяет задавать источники нестандартной формы, или тени от объектов, неотображаемых на сцене.
Одним из самых важных элементов системы освещения является система расчета теней. Существует два типа теней:
- Hard-edged (жесткие тени)
- Soft-edged (мягкие тени)
Мягкие тени состоят из двух регионов: полутень и полная тень. Полная тень представляет собой неосвещенные регионы, в то время как полутень отображает частично затененные области. Жесткие тени включают в себя только полные тени [13].
Так как в работе будут представлены точечные источники освещения, то будут рассмотрены только жесткие тени.
Дополнительно, в 2D пространстве тени можно классифицировать на внешние и внутренние. Под внешними подразумеваются затененные области на других объектах, находящихся в тени от рассматриваемого. Внутренние - те тени, которые объект отбрасывает сам на себя. Так как двухмерные объекты по определению являются плоскими фигурами, второй класс теней реализуется шейдерами при помощи дополнительных карт, задающих рельеф объекта.
Существует два основных способа формирования теней от источника [12]:
- При помощи Shadow Maps
- Используя Stencil Shadows
Карты теней (Shadow Maps) получаются за счет пофрагментного теста глубины из точки видимости камеры. Сначала, сцена рендерится из зоны видимости источника освещения, и полученные результаты записываются в буфер глубины. После это, сцена отображается как обычно, но по сгенерированной на предыдущем этапе карте определяется, находится ли данный пиксель в тени или нет.
Для каждого вертекса каждого треугольника считается его позиция в относительно источника света. Если этот фрагмент располагается дальше, чем соответствующий ему фрагмент карты теней, то он находится в тени [13].
Так как эта техника основана не на геометрии объектов, а на их отображении, она может быть использована для работы с объектами, имеющими альфа-канал [12].
Stencil Shadows (или Shadow Volumes) - техника, формирующая области, затененные отбрасывающими тени объектами. Она позволяет отображать высоко детализированные тени, качество которых зависит только от полигонального представления объектов [12]. Силуэт объекта, отбрасывающего тень, как бы вытягивается в сторону от источника света. Иными словами, на основе видимой источником геометрии объекта формируется объем, точки внутри которого находятся в тени.
Первый метод подходит и для работы в двухмерном пространстве, однако он не позволяет определять непосредственно точки, формирующие область тени объекта. Используя эти точки можно было бы задавать тени определенную форму.
Второй способ требует наличия полигонов у обрабатываемых объектов. Однако, 2D спрайты состоят из двух треугольников, чего не достаточно для формирования теней не четырехугольных фигур. Так как у пользователей нет доступа к потоку передачи информации в шейдеры Unity, и получить данные о сцене из шейдера не представляется возможным, то расчеты затененных областей приходится производить заранее. Таким образом, необходимо сформировать карту теней одним из двух методов:
- При помощи трассировки лучей;
- При помощи детализации геометрии объекта.
При помощи трассировки лучей, можно искать переходы от пустых
областей к объектам и наоборот (Рис. 10.1 - 10.5) и запоминать эти точки. После
этого, для каждого объекта формируется четырехугольник, у которого две вершины
имеют координаты найденных на предыдущем шаге точек, а две расположены таким
образом, чтобы лежать на одной прямой с соответствующей точкой из первых и
центром текстуры (Рис. 10.7 - 10.8).
Рис. 10 Алгоритм расчета теней методом трассировки лучей
Однако данная технология работает достаточно эффективно только,
если объекты представлены выпуклыми многоугольниками, и на одном спрайте
расположен только один объект. В противном случае, алгоритм сформирует тени,
которые не будут соответствовать действительности. (Рис. 11.1 - 11.5) На Рис. 11.6
красным цветом выделены возникающие ошибки в данном случае.
Рис. 11 Ошибки при формировании теней
Для того, чтобы избежать подобной ситуации, предлагается использовать вышеописанный алгоритм для нахождения точек начала и конца затененных областей, но расчет теней внутри производить непосредственно методом трассировки лучей. Для этого из каждой точки найденного ранее сектора, следует пустить луч по направлению к источнику освещения. Если этот луч пересечет какой-либо объект, это будет значить, что точка находится в тени. В противном случае, ничего не загораживает точку от источника, и, соответственно, она считается освещенной. Результат представлен на Рис. 12.
Использование трассировки лучей для каждого пикселя изначально
возможно, однако это добавляет определенное количество лишних вычислений. Кроме
того, определяемые алгоритмом точки необходимы для формирования теней заданной
формы.
Рис. 12 Корректные тени от объектов
Несмотря на то, что 2D объекты не имеют как таковой геометрии, можно, определив края объектов, создать несколько ключевых точек, которые будут заменять в алгоритме расчета теней вершины трехмерных моделей. (Рис. 13.1).
Проводя лучи от источника освещения к этим точкам, можно по
наличию пересечения с контуром какого-либо объекта судить, находится ли эта
точка в тени. После этого, останется только построить тень, используя точки для
формирования полигонов (Рис. 13.2 - 13.4).
Рис. 13 Расчет теней методом детализации геометрии объекта
Так как в двухмерном пространстве зритель смотрит на сцену
преимущественно под одним углом, может возникнуть ситуация, при которой будет
практически невозможно однозначно сказать, какую форму имеет объект. Несколько
трехмерных объектов могут иметь одинаковую по форме проекцию на плоскость
камеры. Например, на Рис. 14.1 представлены две фигуры: параллелепипед (слева)
и цилиндр (справа), однако без теней их сложно отличить друг от друга (Рис. 14.2).
Но по форме тени (Рис. 14.3) можно сделать вывод о скрытой от глаз части объекта
и, тем самым, более точно определить форму фигуры. Более того, то же самое
касается наличия в объекте, например, каких либо отверстий (Рис. 15.1 - 15.3).
Рис. 14 Форма теней двух разных объектов
Рис. 15 Форма теней для объекта с отверстием
Для того, чтобы получить тень заданной текстурой формы (Рис. 16.2),
требуется знать четыре точки, по которым будет сформирован меш. Предполагается,
что эти точки будут получены в результате работы алгоритма предыдущего шага. На полученный полигон
накладывается текстура тени. (Рис.
16.1 - 16.3)
Рис. 16 Задание формы тени текстурой
Освещение самих объектов вычисляется шейдерами, прикрепленными к ним.
Шейдеры должны, получая параметры необходимых источников, обеспечивать освещение объектов. Формула расчета освещенности зависит от выбранной модели.
Предполагается, что функции расчета освещения в разных моделях, использования карт нормалей и др. будут описаны в специальном cginc файле, который будет подключаться к шейдерам. Cginc файлы в Unity являются по сути заголовочными для шейдеров, написанных на языке Cg. В них предполагается описывать необходимые для использования в системе переменные и реализовывать требуемые функции. Таким образом, процесс написания непосредственно шейдера объекта будет заключаться в подключении этого файла и выборе соответствующих правил расчета освещения. Для получения оптимального списка функций следует ориентироваться на cginc файлы Unity.
Достаточно часто объекты и источники на сцене статичны, и рассчитывать освещение для них каждый кадр представляется довольно затратной операцией. В таких случаях используется система запекания света, заключающаяся в том, что карты теней статичных источников относительно статичных объектов сохраняются в виде карт освещения. Последние используются для определения освещенности объектов без необходимости повторных вычислений.
Несмотря на то, что в данной работе не предусматривается разработка полноценной системы запекания света, статические источники, единожды рассчитав карту теней для статических объектов, не будут повторять этот процесс далее.
Менеджер освещения - необходимый компонент для организации работы системы. Предполагается, что каждому плану соответствует свой объект-менеджер. Так как из шейдера мы не можем получить информацию о расположенных на сцене компонентах, менеджер является единственным объектом на сцене, который хранит информацию, какой объект каким источником освещен. В задачи этого компонента входит передача необходимых параметров от источников в шейдеры. Кроме того, менеджер следит за тем, чтобы освещение рассчитывалось только для динамичных объектов и источников, которые в данный момент попадают в угол обзора камеры.
Для удобства работы с системой необходимо обеспечить эффективный инструмент для настройки её компонентов. Для этого:
- создание объектов должно быть доступно из меню редактора;
- параметры, не предполагающие ручной настройки, должны быть скрыты;
- необходимо обеспечить возможность настраивать некоторые параметры источников освещения в окне сцены. Такие параметры должны иметь графическое отображение;
- Для удобства поиска источников освещения на сцене, они должны иметь собственную иконку.