1NTERRUPTOR

1NTERRUPTOR 

Разработчик модификации The Third Prophecy

3subscribers

15posts

Showcase

1
goals2
0 of 150 paid subscribers
Поддержка основного развития проекта - ваша подписка позволяет мне посвятить проекту максимум времени и реализовать весь задуманный контент.
$0 of $886 raised
Благодаря вашим донатам я могу активно работать над проектом, ускоряя выпуск рабочей демо.

Переработка освещения. Часть 1 — Ванильная система освещения

Эта статья — часть исследования системы освещения оригинальной игры, которое я сделал уже достаточно давно. Сейчас я завершаю переработку освещения в рамках мода, поэтому решил оформить всё в виде обширной серии материалов. Данная статья является неким вступлением.
Для начала: из чего вообще состоит освещение в игре?
Вы удивитесь (возможно), но всё затенение управляется всего двумя вещами:
  1. Погодный сет
  2. Статические источники света
Теперь добавим щепотку ограничений:
  1. На каждый объект — только одна тень. Она формируется от направленного источника objectLight — импровизированного «солнца».
  2. Тень отбрасывается только на террейн и статические объекты, являющиеся его частью.
  3. Нестатические анимированные объекты освещаются только одним источником света — тем же «солнцем».
А теперь посмотрим, какие богатые «возможности» при таких ограничениях предлагает редактор карт через погодный сет:
  1. Управление интенсивностью тени (по сути, прозрачностью). Полезно — безусловно. Жёсткие тени в ясную погоду, мягкие — в облачную.
  2. Отдельное управление value финального общего затенения. Здесь и далее под value я понимаю яркость цвета — компоненту value в модели HSV.
  3. Затенение для террейна и для объектов выполняется отдельно (через terrainLight и objectLight соответственно). То есть можно сделать ночной террейн и при этом засветить объекты ярким полуденным солнцем. Круто! Где еще встретишь такую возможность (см. скриншот ниже).
  4. Туман. Их здесь 2 типа — обычный по дальности, и еще один — по высоте (см. видео ниже). Но использовать одновременно можно только один из них (эту проблему я уже решил).
  5. Особый цвет ambient light. Никогда не догадаетесь для чего он. Заинтригованы?... так вот, он влияет на... цвет партиклей снега и дождя. Оказалось довольно полезным. Например, я это использовал для "подсветки" дождя во время грозы.
  6. У террейна есть два цвета: terrain material и terrain light. Причём у terrain material есть особый, больше нигде не встречающийся зверь — цвет emissive.
Погодный сет на самом деле содержит довольно гибкие настройки освещения. Жаль только, что большинство из них бесполезны, если мы говорим о реалистичном визуальном дизайне.

Никому не нужный terrain material

Возможно разработчики хотели далеко пойти и придумали (но не реализовали) кучу вещей. Мы не знаем.
В целом terrain material можно охарактеризовать как модификатор базового цвета террейна, независимого от terrain light. А цвет terrain light "модифицируется" направлением вектора terrain light.

Значит все-таки нужен?
Нет. Тот же эффект можно получить через ambient-компоненту terrainLight, которая логично не зависит от вектора.
То есть всё сводится к: цвет₁ + цвет₂ + … + цветₙ. Да, если солнечный свет полностью отсутствует, terrain material мог бы пригодиться. Но тогда пропадает рельефное затенение, и по графике мы откатываемся немного назад, что неприемлемо. А я напоминаю, что речь идет об игре 2004 года.
В итоге вопрос — к чему весь этот зоопарк цветов?

Особенности смешивания цветов


Diffuse и ambient смешиваются с обрезкой по максимуму 255 (в представлении движка). Я называю это «насыщением».
Если объект освещён цветом rgb(255,255,255), он выглядит так, будто освещения нет вообще — движок просто накладывает исходную текстуру на меш.
Specular при этом аддитивно складывается с цветом текстуры.
Собственно, вот и вся "цветовая" база движка.
В таких условиях множество компонент просто суммируются без какой-либо связи с игровой логикой. Фактически их можно заменить одним итоговым цветом.
Вы можете подумать, что я излишне критикую технологии далекого 2004 года. Возможно. Надо отметить, что даже такая ограниченная система позволяет делать вполне солидный визуальный дизайн локаций (особенно для постановочных сцен).

Математика освещения


Разберём, как работает этот «суповой набор», на примере юнита (для зданий и объектов алгоритм немного отличается).
Разделим поверхность на две зоны:
— освещённую
— неосвещённую

Освещённая получает свет «солнца», неосвещённая — нет.

Алгоритм расчёта итогового цвета:
  • Diffuse и ambient компоненты objectLight покомпонентно складываются для освещённой части
  • Неосвещённая часть получает только ambient
  • Результат нормируется к диапазону 0…1 и применяется как множитель к RGB текстуры меша
  • Значения выше 1 обрезаются
  • Далее добавляется specular для освещённой части (для неосвещённой — фиг вам)
  • Итог умножается на unit_intensity, который в пределах 0...1.У objectLight есть цвет и вектор: он задаёт угол освещения юнита и направление тени.Статические источники на освещение юнитов не влияют вообще.
Из приведенного выше алгоритма следует один важный вывод: без specular-компоненты нельзя получить яркость объекта больше, чем яркость, определяемую текстурой объекта. Для неосвещенной части — это в принципе невозможно. У террейна это обходится: specular есть в цвете terrain material. Так что он всё же оказался хоть где-то полезен (на практике я его все равно не использую).

Статические источники


Diffuse цвет определяет цвет освещения в пределах min radiusmax radius, в пределах которых интенсивность падает до нуля на max radius линейно. specular цвет определяет цвет освещения в пределах max radius. На картинке ниже приведена демонстрация как это работает на примере источника света с min radius = 2 и max radius = 5.
Иногда освещение может не совпадать с формулой из-за повертексного освещения террейна и его низкого разрешения. Размер ячеек сопоставим с размером юнитов, цвет интерполируется между вершинами треугольников. Вот наглядный пример, это демонстрирующий (min radius = max radius = 2):
Понятно, что чем больше разница между min radius и max radius, тем эта проблема менее заметна.
Относительно террейна статические источники работают так же, как terrainLight (аналог objectLight), но без ambient-компоненты — что логично.
Несколько практических замечаний для "реалистичного" дизайна:
  1. ambient не должен быть ярким
  2. diffuse может и часто должен быть ярче ambient
  3. Нужно избегать выхода за диапазон 0…1 при суммировании (насыщения). Контролируем худший случай: (ambient + diffuse) от terrainLight + diffuse всех статических источников на вертексе < 1 по каждому RGB. Иначе получаем искажение цвета. Как контролировать? Визуально, разумеется. Насыщение на террейне показал на видео ниже.
  4. specular должен быть слабым по value, иначе появляются некрасивые пересветы (показал на скриншоте ниже).
На самом деле проблема specular не в том, что он "агрессивно" засвечивает участки террейна. Дело в том, что у него отсутствует затухание: в пределах 0…min radius яркость specular не меняется, а значит, однозначно определяется value.

Почему в оригинальной игре все время используется "нейтральный" цвет

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

Впрочем, если вы присмотритесь к любым скриншотам из игры, то обнаружите, что достаточно "светлые" и "стандартные" места обычно находятся в местах, где проходят юниты. Это видно и на скриншотах, которые я привел выше. Места, где юниты никак не могут появиться, оформлены как раз таки весьма красиво и "разнообразно".
А еще всегда можно напустить немного тумана, чтобы дешево "забустить" качество картинки.
Имея представление как это устроено, можно делать выводы и выдвигать гипотезы о том, как можно нестандартно использовать имеющиеся инструменты для существенного (!) улучшения освещения.
Но это уже тема следующей части серии.
Subscription levels3

Хронист

$4.5 per month
Для тех, кто хочет следить за разработкой и поддерживать проект.
Вы получаете доступ к регулярным отчётам о ходе разработки, эксклюзивным материалам (концепты, наработки, идеи) и участию в голосованиях. Также вы получаете роль Boosty supporter на Discord-сервере проекта.
+ chat

Испытатель Круга

$10.4 per month
Вы получаете:
- Все из уровня Хронист
- Доступ к тестированию незавершённых билдов (новые фичи и изменения) через закрытый Discord-канал
- Доступ к подробному журналу изменений
- Роль Circle Trialist на Discord-сервере
- Упоминание в титрах YouTube-видео проекта
Внимание: тестирование не равно раннему доступу. Незавершённые билды могут содержать ошибки и баги и не предназначены для комфортного игрового опыта.
+ chat

Пророк

$22.2 per month
Вы получаете:
- Все из уровней Хронист и Испытатель Круга
- Ранний доступ к стабильным обновлениям и релизам
- Приоритетное общение с разработчиком в закрытом Discord-канале
- Доступ к todo-листу текущей стадии разработки
- Возможность предлагать и обсуждать идеи для внедрения в закрытом Discord-канале.Внимание: если вы не принимаете, что финальное решение при обсуждении фичи всегда остаётся за автором проекта - этот уровень не для вас
- Роль The Prophet на Discord-сервере
- Упоминание в титрах релизов
+ chat
Go up