Свет в воксельном мире: настоящие источники или заливка?
Игрок ставит лампу в своей базе. Что происходит технически? Этот невинный вопрос привёл нас к принципиальному решению — а ответ хорошо показывает, что «более современное» решение не всегда лучшее.
Вариант А: настоящие источники света Unity. Каждый светящийся блок становится точечным источником, движок всё считает сам. Выглядит здорово — но не масштабируется. В воксельном мире в поле зрения могут быть сотни светящихся блоков; точечные источники в реальном времени в таком количестве заставят попотеть любую видеокарту, а в браузерной сборке тем более.
Вариант Б: свет по заливке (flood fill). Классика жанра: свет — это число для каждого блока, которое расходится от источника и уменьшается с каждым шагом. Безумно дёшево, источников может быть сколько угодно — но результат выглядит плоским, потому что у света нет направления. Стена рядом с лампой светится так же ярко, как поверхность под ней.
Наш выбор: заливка с направлением. Мы остались на заливке, но научили её информации о направлении: свет знает, с какой стороны он приходит, и поверхности освещаются по-разному. Результат запекается в сетку чанка при её построении — во время игры это почти ничего не стоит, но выглядит заметно объёмнее классического блочного света.
Урок отсюда мы теперь применяем везде: сначала спроси, в чём на самом деле проблема жанра (здесь: очень много источников, статичная геометрия), и только потом выбирай технологию. Настоящие источники света решали проблему, которой у нас не было, — и создали бы такую, которую нам не решить.
Комментарии