ZDoom. Между светом и тьмой. Часть 1.

Открываем серию статей по работе с освещением. Без этого мир будет казаться менее живым, правильно? Планируется 3 статьи. Если надо, потом сделаю анимационные превьюшки и переоформлю, а пока, как обычно, качаем карту и запускаем в редакторе.

КЛАССИКА.

Итак, первый выпуск — это освещение, на котором зиждется классический Дум, поэтому оно должно быть максимально производительным , но потребует больше секторов и более кропотливого рисования в случаях, если хотим добиться максимальной детализации. Насколько это вообще возможно с Думом 1/2/64.

Не спрашивайте, почему мы начинаем с нуля. Это.. это… ну… это массив, вот!

0). Brightness.

Здесь и далее будут рассмотрены сектора-участки карты, подписанные нарисованными красными цифрами и содержащие в себе примеры. Пункт в статье соответствует сектору с такой цифрой.

Самый примитивный параметр — яркость сектора. В режиме трёхмерной навигации его можно менять, нацелившись на сектор, зажав Ctrl и крутя колёсиком. Влияет на всё сразу: степень освещённости текстур в секторе, акторов в нём же и… всё. Небо, если оно есть, не затрагивается никак. На примере показано, как с помощью изменения яркости секторов мы создали тёмную пещеру и вход в неё, который постепенно перестаёт пропускать фотоны. Просто и красиво.

Посмотрите в параметры текстур пола/потолка и стен. Параметр Brightness позволяет менять яркость текстуры независимо от яркости сектора. Манипулируя этим параметром, можно создать зоны, где темно, хоть глаз вырви, а пол сияет, как радиоактивный. Или стены.

Есть одна такая подстава, которую можно использовать в своих целях, но зачем — не знаю. Если потолок будет небом (F_SKY1), и в настройках текстуры потолка напротив Brightness поставить галочку Absolute, то яркость всех предметов под этим небом (кроме вашего оружия) будет такой, какое значение вы выставите (от 0 до 255). То есть, если у вас вдруг под открытым небом ходят чёрные-пречёрные все, проверьте, не сделали ли вы яркость потолка «абсолютным» (или отпускающим грехи, не знаю).

Нарисуем фонарь-прожектор так:

Фонарей тут несколько, и все они — результат изменения яркости секторов целиком, либо текстур. По ситуации.

Обратите внимание, что у нас их несколько.

Слева сверху (1) — затухающий по длине луча, но яркость освещения затрагивает и потолок, поэтому выполнен в виде колонны высотой до потолка (если потолок — небо, принцип не распространяется, так как на небе F_SKY всегда одна яркость).

Справа сверху (2) — луч затухает по краям. Также затрагивает потолок.

Слева снизу (3) — низкий фонарик, луч которого сделан на основе изменения яркости текстуры пола. У неё в стандартном режиме своеобразный алгоритм — увидите, когда попробуете.

Правее и ниже (4) — такой же фонарь на потолке. Там яркость текстур регулировалась в режиме Absolute — в этом случае значение яркости текстуры соответствует значению освещения сектора. То есть, если освещённость такого сектора равна 192, то и brightness текстуры тоже надо выставить в 192, иначе, если меньше 192, текстура будет тёмной, а если больше 192 — светлой. Так как раз удобнее.

И последний (5) — такой выпуклый многосекторный фонарь, где луч затухает и в длину, и в ширину. Так можно хоть лицо Анджелины Джоли в векторном стиле нарисовать.

Итак, этот свет — постоянный, значения можно менять скриптами, функциями вроде Light ChangeToValue. У самого навороченного фонаря (5) там кнопочка. Нажмите её, фонарь потухнет, ибо Light_ChangeToValue(8, 192), где 8 — это тэг сектора, а 192 — значение яркости.

Но дело в том, что у нас есть ещё всякий заскриптованный динамический свет. Напишите скрипт из 3 строчек:

Light_ChangeToValue("тэг сектора", random(192, 255));

delay(1); //это важно, а то скрипт зависнет. В скобках значение также отвечает за скорость мигания

restart;

Освещение будет мерцать. Непронумерованный фонарь — как раз с этим скриптом.

На эту тему есть уже готовые пресеты в редакторе. Очень полезны, когда лень скрипты писать на каждый кусок пола, но, увы, функциональность их ограничена. Ниже — их описание.

1). Light phased позволяет секторам мигать по очереди (!) с нулевой яркости до максимальной, но прикол спешела в другом. При его использовании параметр яркости сектора меняет функцию — теперь это т.н. фазовый индекс. Он устанавливает порядок, в котором сектора будут мигать друг за другом. В вики указано, что он может быть от 0 до 63, однако в моём случае работали значения 120-130-140 и так далее. Опыт показывает, что числовая разница этих значений (например, каждое следующее число больше на десятку, как у меня) отвечает за скорость вспышки-затухания. Просто попробуйте и всё. Кстати, этому спешлу по барабану, стыкуются ли сектора, а следующему — нет.

2). Light sequence start и Light sequence special 1/2 — аналогичная штука, но есть ряд отличий.

  • сектора должны стыковаться.
  • LS Start ставим на сектор, в сторону которого будет перетекать наша светомузыка. Иначе он будет мигать сам от 0 до 255
  • LS Special 1 & 2 ставим в последующие сектора по очереди. То есть, например, 5 секторов дорожкой, в первом — старт, в следующем — 1, потом 2, потом опять 1, потом опять 2. Дорожка вспышек будет идти от крайнего сектора (с LS Special) к другому крайнему сектору в дорожке (с LS Start). Красота!

3). Light flicker (+Light fire flicker) вызывают мигание сектора. Оно рандомное и похоже на мигание плохо контачащей лампы. Как раз для этого. Важно — этот сектор должен быть ярче своего окружения, иначе никаких изменений вы не увидите. Нечто аналогичное мы выше скриптом и сделали. Также важно то, что несколько примыкающих друг к другу секторов с таким спешелом мигают не синхронно, поэтому сложных градиентов для одной плохо ввинченной лампочки лучше не делать, тут нам помогут другие штуки. Например,

4). Light Strobe (несколько типов) — стабильное мигание сектора. Если яркость сектора ниже или равна окружающему/примыкающему, мигание происходит от самого тёмного до реального значения яркости. Если сектор ярче — то от яркого до примыкающего. Если вы используете этот спешл на несколько примыкающих секторов разной яркости, их мерцание будет асинхронным. Посмотрите, как это происходит с цифрой 4. Чтобы они мигали одновременно — есть такой же спешел с припиской sync, о котором я писал. Так мигают фонари. Там же есть такой же спешел с «hurt -20 hp», ежесекундно вызывает повреждения игрока на 20 очков здоровья — это на секторе Radiation.

5). Lightning +что-то там — эти спешлы относятся к рандомному миганию на всей карте и в случае с секторами лишь регулируют функцию, которую необходимо врубить в Mapinfo, либо на линии (выключатель я поставил с этой фигнёй). На этом заостряться не буду, так как для создания молнии лучше использовать скрипты или экшены на линиях. А ещё лучше — спавнеры погоды, т.к., если уж гроза, то с дождичком (в четверг). Просто посмотрите в секторе «5», как это выглядит, и попробуйте найти существенные отличия. По-моему, штука так себе.

6). Light Glow — Плавное изменение яркости от одного значения к другому. Я показал 2 варианта. Если спешл на секторе (цифра 6 так мигает), то яркость сектора должна отличаться от окружающего-примыкающего, тогда мигание будет плавно менять освещение от низкого значения к высокому. А вот если использовать спешел на линии (выключатель), и указать сектор, то там мы можем сами задавать верхнее и нижнее значение независимо от яркости самих секторов.

Собственно, чтобы подвести какие-то итоги, скажу, что всеми этими штуками можно управлять самостоятельно, а не просто прицепить на сектор какой-то один эффект. Ведь указанным методом сектору можно задать один спешл, например, ветер, и тогда освещение придётся делать скриптами. Благо, такие экшены, как я расписал выше, есть и для активации с линий или монстров, например. По названию их легко найти. А скриптами — создать. Если есть желание — могу попробовать понаделать скриптов с разными световыми эффектами в будущем.

Если есть какие-то вопросы, неточности, пожелания — не стесняйтесь, укажите это. Вдруг чего забыл. А в след. статьях распишем колоризацию и динамические источники света, да и как с этим всем играться.

Продолжение следует. Rip and tear!

avatar

Пожалуйста отключи блокировщик рекламы, или внеси сайт в белый список!

Please disable your adblocker or whitelist this site!