- PVSM.RU - https://www.pvsm.ru -
Всем привет. Как известно, Unity3D отсутствует поддержка освещения для 2D игр. В Asset Store можно найти такую систему [1], но у неё есть один недостаток — она работает на CPU и потребляет весьма много ресурсов (64-4096 рейкастов за кадр на каждый источник света). Поэтому я решил сделать своё освещение, производительности которого хватило бы для мобильных устройств. Для этого вычисления были перенесены на GPU. Получилось что-то похожее свет Terraria или Starbound.
Ссылка на демку. [2] Скриншоты взяты из неё.
Всё освещение считается на небольших текстурах, в примере используются 160х88 пикселей. При повышении разрешения можно добиться очень мелкой сетки, которую будет сложно заметить, правда это уже не для мобильных платформ. Из-за того, что вычисления производятся на таких небольших текстурах можно использовать довольно тяжелые шейдеры.
Для работы освещения используются 3 камеры, каждая из которых отвечает за свою часть системы: источники света, препятствия света, свет окружения. Затем источники света и свет окружения смешиваются и накладываются на игровую камеру.
Теперь подробнее, в порядке отрисовки.
Текстура препятствий света. RGB каналы. Эта и последующие похожие текстуры имеют масштаб 400%
Вот такую текстуру выдает камера. Черные области полностью прозрачны, белые — полностью непрозрачные. Также поддерживаются цветные области, например, полностью красный пиксель будет блокировать красную часть света и пропускать зеленую и синюю.
Источники света окружения
Источники света окружения. Альфа канал
Итеративно генерируемая текстура света окружения
Так выглядит немного усиленный свет окружения, без обычных источников освещения
Тут всё несколько сложнее. Такой тип освещения я реализовал для того, чтобы добавить слабый свет на то пространство, где нет источников света. В примере с помощью него реализована неяркая подсветка всего свободного пространства. RGB канал управляет цветом, альфа канал силой свечения. Главное отличие этого типа света от обычных источников состоит в том, что он считается итеративно и не имеет направления.
Алгоритм расчета для одного пикселя:
Источники света
Обычные источники — главная часть системы освещения. Для их рисования используется нечто похожее на спрайты. Весь цвет исходит из центра, хотя при желании точку можно перенести куда угодно.
Для источников света доступно несколько шейдеров с трассировкой пути и один без неё. Шейдеры с трассировкой различаются по количеству трассируемых точек. Я использую два таких — один на 9 точек, работающий с Shader Model 2.0, другой на 20 точек для Shader Model 3.0. Шейдер без трассировки пути используется для систем частиц, так как ему не нужна какая-либо дополнительная информация для работы.
Алгоритм трассировки путя:
Свет источников + свет окружения
После того, как свет источников и свет окружения отрендерен можно смешивать их друг с другом. Для этого текстуры умножаются на свою альфу и складываются. Затем всё это накладывается на изображение игры и выводится на экран.
[3] [4] [5] [6]
Скриншоты результата, большее разрешение по клику.
Плюсы:
Минусы:
P.S. При наличии интереса сообщества доработаю и выложу в Asset Store.
Автор: SSS135
Источник [7]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/gamedev/79878
Ссылки в тексте:
[1] такую систему: https://www.assetstore.unity3d.com/en/#!/content/3787
[2] Ссылка на демку.: http://light2d.comule.com/Light2D_Rocket/WebPlayer.html
[3] Image: http://habrastorage.org/files/a5c/50e/2ab/a5c50e2ab60e4a11b965617c51559e9a.png
[4] Image: http://habrastorage.org/files/044/92f/627/04492f6274b14954a5c6049dd846dc48.png
[5] Image: http://habrastorage.org/files/dfe/728/89c/dfe72889c8e548f5aeebb8ca6bc9484f.png
[6] Image: http://habrastorage.org/files/d20/53b/6c6/d2053b6c68bb4cc0b24a35b34db3ea58.png
[7] Источник: http://habrahabr.ru/post/248149/
Нажмите здесь для печати.