Переработка освещения. Часть 1 — Ванильная система освещения
Эта статья — часть исследования системы освещения оригинальной игры, которое я сделал уже достаточно давно. Сейчас я завершаю переработку освещения в рамках мода, поэтому решил оформить всё в виде обширной серии материалов. Данная статья является неким вступлением.
ᅟ
ᅟ
Для начала: из чего вообще состоит освещение в игре?
Вы удивитесь (возможно), но всё затенение управляется всего двумя вещами:
Вы удивитесь (возможно), но всё затенение управляется всего двумя вещами:
- Погодный сет
- Статические источники света
Теперь добавим щепотку ограничений:
- На каждый объект — только одна тень. Она формируется от направленного источника objectLight — импровизированного «солнца».
- Тень отбрасывается только на террейн и статические объекты, являющиеся его частью.
- Нестатические анимированные объекты освещаются только одним источником света — тем же «солнцем».
А теперь посмотрим, какие богатые «возможности» при таких ограничениях предлагает редактор карт через погодный сет:
- Управление интенсивностью тени (по сути, прозрачностью). Полезно — безусловно. Жёсткие тени в ясную погоду, мягкие — в облачную.
- Отдельное управление value финального общего затенения. Здесь и далее под value я понимаю яркость цвета — компоненту value в модели HSV.
- Затенение для террейна и для объектов выполняется отдельно (через terrainLight и objectLight соответственно). То есть можно сделать ночной террейн и при этом засветить объекты ярким полуденным солнцем. Круто! Где еще встретишь такую возможность (см. скриншот ниже).
- Туман. Их здесь 2 типа — обычный по дальности, и еще один — по высоте (см. видео ниже). Но использовать одновременно можно только один из них (эту проблему я уже решил).
- Особый цвет ambient light. Никогда не догадаетесь для чего он. Заинтригованы?... так вот, он влияет на... цвет партиклей снега и дождя. Оказалось довольно полезным. Например, я это использовал для "подсветки" дождя во время грозы.
- У террейна есть два цвета: terrain material и terrain light. Причём у terrain material есть особый, больше нигде не встречающийся зверь — цвет emissive.
Погодный сет на самом деле содержит довольно гибкие настройки освещения. Жаль только, что большинство из них бесполезны, если мы говорим о реалистичном визуальном дизайне.
ᅟ
ᅟ
Никому не нужный terrain material
Возможно разработчики хотели далеко пойти и придумали (но не реализовали) кучу вещей. Мы не знаем.
В целом terrain material можно охарактеризовать как модификатор базового цвета террейна, независимого от terrain light. А цвет terrain light "модифицируется" направлением вектора terrain light.
В целом terrain material можно охарактеризовать как модификатор базового цвета террейна, независимого от terrain light. А цвет terrain light "модифицируется" направлением вектора terrain light.
Значит все-таки нужен?
Нет. Тот же эффект можно получить через ambient-компоненту terrainLight, которая логично не зависит от вектора.
То есть всё сводится к: цвет₁ + цвет₂ + … + цветₙ. Да, если солнечный свет полностью отсутствует, terrain material мог бы пригодиться. Но тогда пропадает рельефное затенение, и по графике мы откатываемся немного назад, что неприемлемо. А я напоминаю, что речь идет об игре 2004 года.
В итоге вопрос — к чему весь этот зоопарк цветов?
Особенности смешивания цветов
ᅟ
Diffuse и ambient смешиваются с обрезкой по максимуму 255 (в представлении движка). Я называю это «насыщением».
Diffuse и ambient смешиваются с обрезкой по максимуму 255 (в представлении движка). Я называю это «насыщением».
Если объект освещён цветом rgb(255,255,255), он выглядит так, будто освещения нет вообще — движок просто накладывает исходную текстуру на меш.
Specular при этом аддитивно складывается с цветом текстуры.
Собственно, вот и вся "цветовая" база движка.
В таких условиях множество компонент просто суммируются без какой-либо связи с игровой логикой. Фактически их можно заменить одним итоговым цветом.
Specular при этом аддитивно складывается с цветом текстуры.
Собственно, вот и вся "цветовая" база движка.
В таких условиях множество компонент просто суммируются без какой-либо связи с игровой логикой. Фактически их можно заменить одним итоговым цветом.
Вы можете подумать, что я излишне критикую технологии далекого 2004 года. Возможно. Надо отметить, что даже такая ограниченная система позволяет делать вполне солидный визуальный дизайн локаций (особенно для постановочных сцен).
Математика освещения
ᅟ
Разберём, как работает этот «суповой набор», на примере юнита (для зданий и объектов алгоритм немного отличается).
Разделим поверхность на две зоны:
— освещённую
— неосвещённую
ᅟ
Освещённая получает свет «солнца», неосвещённая — нет.
ᅟ
Алгоритм расчёта итогового цвета:
Разберём, как работает этот «суповой набор», на примере юнита (для зданий и объектов алгоритм немного отличается).
Разделим поверхность на две зоны:
— освещённую
— неосвещённую
ᅟ
Освещённая получает свет «солнца», неосвещённая — нет.
ᅟ
Алгоритм расчёта итогового цвета:
- Diffuse и ambient компоненты objectLight покомпонентно складываются для освещённой части
- Неосвещённая часть получает только ambient
- Результат нормируется к диапазону 0…1 и применяется как множитель к RGB текстуры меша
- Значения выше 1 обрезаются
- Далее добавляется specular для освещённой части (для неосвещённой — фиг вам)
- Итог умножается на unit_intensity, который в пределах 0...1.У objectLight есть цвет и вектор: он задаёт угол освещения юнита и направление тени.Статические источники на освещение юнитов не влияют вообще.
Из приведенного выше алгоритма следует один важный вывод: без specular-компоненты нельзя получить яркость объекта больше, чем яркость, определяемую текстурой объекта. Для неосвещенной части — это в принципе невозможно. У террейна это обходится: specular есть в цвете terrain material. Так что он всё же оказался хоть где-то полезен (на практике я его все равно не использую).
Статические источники
ᅟ
Diffuse цвет определяет цвет освещения в пределах min radius…max radius, в пределах которых интенсивность падает до нуля на max radius линейно. specular цвет определяет цвет освещения в пределах max radius. На картинке ниже приведена демонстрация как это работает на примере источника света с min radius = 2 и max radius = 5.
Diffuse цвет определяет цвет освещения в пределах min radius…max radius, в пределах которых интенсивность падает до нуля на max radius линейно. specular цвет определяет цвет освещения в пределах max radius. На картинке ниже приведена демонстрация как это работает на примере источника света с min radius = 2 и max radius = 5.
Иногда освещение может не совпадать с формулой из-за повертексного освещения террейна и его низкого разрешения. Размер ячеек сопоставим с размером юнитов, цвет интерполируется между вершинами треугольников. Вот наглядный пример, это демонстрирующий (min radius = max radius = 2):
Понятно, что чем больше разница между min radius и max radius, тем эта проблема менее заметна.
Относительно террейна статические источники работают так же, как terrainLight (аналог objectLight), но без ambient-компоненты — что логично.
ᅟ
Несколько практических замечаний для "реалистичного" дизайна:
- ambient не должен быть ярким
- diffuse может и часто должен быть ярче ambient
- Нужно избегать выхода за диапазон 0…1 при суммировании (насыщения). Контролируем худший случай: (ambient + diffuse) от terrainLight + diffuse всех статических источников на вертексе < 1 по каждому RGB. Иначе получаем искажение цвета. Как контролировать? Визуально, разумеется. Насыщение на террейне показал на видео ниже.
- specular должен быть слабым по value, иначе появляются некрасивые пересветы (показал на скриншоте ниже).
На самом деле проблема specular не в том, что он "агрессивно" засвечивает участки террейна. Дело в том, что у него отсутствует затухание: в пределах 0…min radius яркость specular не меняется, а значит, однозначно определяется value.
Почему в оригинальной игре все время используется "нейтральный" цвет
Мое предположение: это самый простой способ сохранить целостность картинки. Представьте: закат, погодный сет даёт реалистичное затемнение моделей. И тут же яркий огонь или мощное заклинание, которые выбиваются из общей гаммы. По этой причине разработчики использовали нейтральную гамму в погодных сетах, с минимальным отходом от "стандарта". Даже подземные локации выглядят весьма "светлыми". В таких условиях незатененные модели выглядят действительно не так сильно выбивающимися из общей картинки.
Впрочем, если вы присмотритесь к любым скриншотам из игры, то обнаружите, что достаточно "светлые" и "стандартные" места обычно находятся в местах, где проходят юниты. Это видно и на скриншотах, которые я привел выше. Места, где юниты никак не могут появиться, оформлены как раз таки весьма красиво и "разнообразно".
А еще всегда можно напустить немного тумана, чтобы дешево "забустить" качество картинки.
ᅟ
Имея представление как это устроено, можно делать выводы и выдвигать гипотезы о том, как можно нестандартно использовать имеющиеся инструменты для существенного (!) улучшения освещения.
Но это уже тема следующей части серии.
armies of exigo
исследование
длиннопост