Содержание

0. Введение

Овещение уровня является результатом взаимодействия трех типов воздействия на текстуры, которые он содержит:

  1. эмбиент (англ. ambient light - рассеянный свет);
  2. точечные источники света (light entity);
  3. свечение текстур посредством шейдеров.

1. Эмбиент-освещение

Эмибент - простейший способ освещения. Он заключается в том, что все текстуры на уровне освещают себя с одинаковой интенсивностью. Эмбиент-освещение на уровне устанавливается с помощью параметра _ambient (или ambient) объекта worldspawn (о том, как это сделать, можно прочитать в статье работа с entities).

Key Value
_ambient N

N - параметр, который определяет яркость устанавливаемого освещения.

К примеру, при компиляции карты с параметром -meta и без параметра -light в любой его форме на уровне устанавливается освещение, по технологии схожее с эмбиентом (различия проявляются только при освещении игрока) с параметром N=128 (значение получено опытным путем); при N=0 эмбиент-свет отсутствует.

Уровень, освещенный только с помощью эмбиента выглядит некрасиво не зависимо от того, насколько хорошо он отдекорирован. Поэтому использовать только этот способ не рекомендуется, за исключением случаев, когда внешность уровня не важна.

Значительно лучше выглядит уровень, при освещении которого эмбиент либо не использовался вовсе, либо комбинировался с другими способами освещения. Последний метод особенно эффективен по соотношению трудоемкость/результат, благодаря чему пользуется большой популярностью среди мапперов, включая автора настоящей статьи. В этом случае следует устанавливать эмбиент с мощностью N=5..20 и доосвещать слишком темные участки другими способами.

2. Точечные источники света (light entity)

Точечные источники света (далее лампочка) - специальные entity, «говорящие» BSP-компилятору о расстановке lighmap'ов на уровне. Для создания лампочки нужно:

  1. кликнуть правок кнопкой по рабочей области и выбрать в entity menu пункт light;
  2. задать яркость света (по умолчанию 300; можно изменить в любое время, не обязательно сразу).

Параметры лампочки

1. Яркость

Основным параметром любого источника света является его яркость; не является исключением и лампочка. Яркость задается с помощью параметра _light (или light) в лампочке (именно этот параметр генерируется в лампочке по факту ее создания и вводится пользователем в окошко, подобное тому, что показано выше).

Устанавливая яркость лампочки следует учитывать то, что освещенность текстуры, на которую падает свет от лампочки, уменьшается (по умолчанию) пропорционально квадрату расстояния до нее (закон обратных квадратов, известный из физики). К примеру, текстура, освещаемая лампочкой с яркостью 300, расположенной на расстоянии 500 u от нее будет в своей центральной части выглядеть так же, как и текстура, освещаемая лампочкой с яркостью 300*2^2=1200 с расстояния 500*2=1000 u.

Это знание поможет правильно выбирать парамерты light лампочек, а также выгодно менять несколько «маленьких» лампочек на одну «большую».

Установка флага linear ламппочки заставляет яркость света от нее уменьшается линейно, то есть пропорционально расстоянию (устанавливать не рекомендуется, так как выглядит не реалистично).

2. Цвет

Цвет света, который дает лампочка, задаётся параметром _color, значение которого является строкой вида ”R G B” в нормализованных величинах (0≤R,G,B≤1). К примеру, значение ”1. .0 .0” - это красный цвет, ”.98 .8 .55” - телесный и т.д. Для перевода строки из ненормализованного формата (где 0≤R,G,B≤X) следует поделить значения R, G и B на X (”201 124 12” (X=255) ⇒ ”.78 .48 .04”), аналогично и из hex-формата (”#FAFE81” ⇒ | FAh=250, FEh=254 | ”250 254 81” ⇒ ”.98 .99 .31”).

Чтобы не мучаться с подбором и переводом цветов из одного вида в другой, в GtkRadiant версии 1.5.0 встроен инструмент Select Color, вызываемый клавишей K при наличии выделения какого-нибудь объекта, способного содержать параметр _color (их довольно много).

В этом интуитивно понятном инструменте установить нужный цвет лампочки не составляет труда. Правда, за исключением экстремальных случаев, он выдает значения с точностью до 6-го знака после запятой, так что для уменьшения размеров map-файла незначащие цифры можно смело удалять вплоть до 2-го знака :-)

3. Направление

По умолчанию лампочка светит во все стороны равномерно (по крайней мере, насколько это позволяет движок q3). Для создания направленного источника света следует соединить лампочку с target_position. Для этого существую два способа:

Обычный
  1. создать target_position (с помощью того же entity menu);
  2. связывать их, выделив (любыми способами) сначала лампочку, потом target_position и нажав CTRL+K (хоткей для selection/connect entities).
Продвинутый
  1. создать target_position;
  2. задать ему параметр targetname, равный spotlight1;
  3. установить в лампочке параметр target равным spotlight1 (разумеется, имена меток можно менять).

Теперь лампочка светит в направлении, задаваемом target_position'ом и накладывает на текстуры в этом направлении lightmap определенного радиуса, изменить который можно, задав лампочке параметр radius (по умолчанию он счается равным 64).

Динамический мигающий свет

Авторы: GT-Agressor и Dyxxx

Также в компиляторе q3map2 есть функция создания мигающего источника света. Для этого в свойствах лампочки следует прописать

Key Value
style N

Значение N может быть любым от 1 до 32. Число означает периодичность и характер мигания:

  1. Нормальный
  2. Мерцающий (первый вариант)
  3. Медленый жесткий пульсирующий (яркий)
  4. Свечка (первый вариант)
  5. Быстрое мигание
  6. Слабая пульсация 1
  7. Мерцающий (второй вариант)
  8. Свечка (второй вариант)
  9. Свечка (третий вариант)
  10. Медленое мигание (четвертый вариант)
  11. Флюорицирующий мерцающий
  12. Медленая пульсация не затухающая до темноты
  13. Быстрая пульсация
  14. Смешаный (Тест)

После компиляции в папке baseq3/maps создается папка [название_вашей_карты]. В ней лежат несколько текстур (lightmap'ы), которые обязательно нужно включать в пак с картой. Также в папке baseq3/scripts создается .shader файл с названием q3map2_[название_карты]. Его тоже нужно положить в пак с картой.

Внимание: этот .shader файл при каждой компиляцией содается заново с разными именами текстур, поэтому в пак нужно положить именно тот файл, который был скомпилирован вместе с .bsp.

Ограничения: источник света не может быть скажем тригерируемым, то есть его нельзя запустить или остановить тригерами. Так просто можно использовать сколько угодно много таких лампочек (в разумных пределах), но все они будут моргать так же как и первая из них.

Дополнение: Что-бы на одной карте уместить лампочки с разными свойствами мерцания, нужно в свойства worldspawn добавить свойство _styleНомерСтиляЛампыrgbGen и\или _styleНомерСтиляЛампыalphaGen со значениями волн по типу

wave sin 0.3 0.4 0.33 1.7

wave square -0.5 1.5 1 3.3

Пример карты можно взять здесь

3. Шейдерный свет

Последний источник лайтмэпов на уровне - свечение самих текстур, которое описывает соответствующий имени текстуры шейдер. Применительно к q3 шейдер можно определить как специальный файл с расширением shader, находящийся в папке название_мода/scripts/ , со специальной структурой, содержащий параметры прорисовки текстур на уровне.

Шейдеры - большая тема, в данной же статье нас интересуют параметры, относящиеся к свету. Автор статьи сам редко использовал многие параметры и статья будет «обрастать» подробностями по мере их изучения.

Некоторые описания являются переводом выписок из крупнейшего мануала по q3map2 шейдерам, находящемся здесь (особенно это касается редко используемых параметров).

1. q3map параметры

Группа параметров, с которыми непосредственно оперирует q3map2, когда компилирует уровень с ключем -light. Для того, чтобы изменения одного из этих параметров «запечатлелись» в BSP, нужно перекомпилировать уровень. Эта группа параметров следует сразу после фигурной скобки, открывающей шейдер (подробней о структуре шейдеров можно прочитать в статье шейдеры).

1. q3map_lightImage texturename.tga

texsturename.tga - собственно та текстура, с помощью которой q3map2 будет рассчитывать цвета лайтмэпов. Если параметр не определен, свет будет рассчитываться из (я не знаю откуда!!!). Применяется параметр в том случае, если текстуры, входящие в шейдер, не генерируют тот цвет, который задумывал дизайнер.

2. q3map_surfaceLight N

Яркость свечения текстуры. Значения N соответствуют значениям параметра light в лампочках, но он должен рассчитываться исходя из размера освещающей текстуры. То есть для маленьких лампочек следует выставлять N больше, чем для длинных светящихся полос.

3. q3map_lightStyle N

Параметр эквивалентен ключу style в лампочках и действует таким же образом, т.е. задает стиль свечения, генерируемого шейдером. Параметр N может варьироваться от 1 до 31.

4. q3map_lightRGB R G B

Самый высокоприоритетный способ задать цвет лайтмэпов, создаваемых шейдером. Цвет задается в нормализованном виде и выставляется независимо от значения параметра q3map_lightimage или цвета текстур, входящих в шейдер.

5. q3map_sun R G B I D E

Создает «солнечный» источник например, от неба (sky) или скайбокса (skybox).

Параметры:

Как видно, D отвечает за отбрасывание теней по оси Y, а E - по X. Как и настоящее Солнце, солнечно-подобный источник в q3 светит так, что интенсивность свечения не зависит от расстояния до освещаемой текстуры, но зависит от положения «солнца».

6. q3map_sunExt R G B I D E Ds S

Работает аналогично q3map_sun, но определяет еще два параметра: Ds (deviance) и S (samples), описывающие полутени в лайтмэпах:

7. q3map_skyLight A I

Альтернативный способ задать яркость света от неба (sky). Параметр имеет более высокий приоритет, чем 3map_surfacelight и позволяет создавать более однородное освещение, приближенное к реальности.

Параметры:

8. q3map_lightmapFilterRadius S O

Позволяет управлять размыванием лайтмэпов для большей реалистичности. Параметры S (self) и O (other) задают область размытия в игровых юнитах: S размазывает лайтмэп, а O - смягчает (устраняет эффект «стадионных теней», который может производить q3map_skyLight). Для небесных источников следует устанавливать S=0 (по неизвестной мне причине).

Если параметр I (iterations) в q3map_skyLight более 4, то q3map_lightmapFilterRadius вообще не требуется, но рассчитывается он быстрее.

2. Специфические параметры текстур

Группа параметров, начинающихся с ключевого слова surfaceparm и определяющих свойства поверхности, на которую наложена текстура, определяемая соответствующим шейдером. Если проводить аналогию между структурой шейдера и праметрами entity, то q3map-параметры - ее ключи, а surfaceparm'ы - флаги.

1. surfaceparm alphashadow

Позволяет q3map2 рассчитывать тени с помощью альфаканала текстуры (подробней об этом рассказано в параграфе про детальные тени).

2. surfaceparm lightfilter

Позволяет создавать лайтмэпы на основе цветов и альфаканалов данной текстуры.

3. surfaceparm nodlight

“nodlight” = “no dynamic light”, то есть поверхность с этим параметром не будет подвергаться воздействию динамического света (например, эффектам от пушек).

4. surfaceparm sky

Текстуру с этим ключем q3map2 делает небом (sky или skybox).

4. Детальные тени

Автор: Kirk Barnes

Одна из основных проблем при картостоении под quake3 является сложность с установкой хорошего освещения. Однако поставить хорошо свет это половина дела. На уровне все равно будут невыразительные, теряющиеся в общей массе тени. Причина состоит с малом размере карты освещения (lightmap). К сожалению Quake 3 в отличии от Enemy Territory не имеет поддержки карт освещения высокого разрешения (до 1024х1024; стандартый размер lightmap в q3 - 128×128). Но тем не менее есть способ значительно улучшить качество света и теней на уровне. Для компиляции небходим q3map2.

Редактирование шейдера

Немного отредактируем один из шейдеров текстур. Открываем шейдер base_floor.shader и ищем в нем описание текстуры proto_grate4. В нем меняем строку surfaceparm nonsolid на surfaceparm alphashadow, то есть убираем «неплотность» текстуры на функцию, позволющий компилятору рассчитывать тень через альфаканал текстуры.

Открываем в радианте карту-пример и компилируем ее. На выходе мы получаем невыразительную картинку:

Теперь, чтобы сделать тени более детальными, следует прописать в объекте worldspawn параметр _lightmapscale со значением 0.1. Хотя, в общем, достаточно значения 0.256, при условии что не надо сильно детализировать альфа тени.

Особенности компиляции

В BSP фазе необходим ключ -meta, в противном случае скейл лайтмэпов не заработает. Теперь главное - расчет освещения. Поскольку мы, не меняя размера лайтмэпа, просто меняем его маштаб, то при сильном маштабировании (значение менее чем 0.256) начинает вылезать «лесенка», которую необходимо сгладить. Для этого вы используем ключ -filter. В результате мы имеем на выходе вот такой результат

пример можно взять тут