Да будет свет - работа с источниками света при создании карт для Quake

Введение

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

[list=1]

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


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

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

Key - _ambient
Value - N


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

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

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



Уровень (-cpm-.bsp, автор Nt-kop4ik) с только эмбиент-освещением (N=20)

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



Тот же уровень с тем же эмбиент-освещением, но с добавлением точечных источников и шейдерных лампочек

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

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

[list=1]

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




Параметры источника света (light entity keys)

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. Для этого нужно сделать следующее:

[list=1]

  • создать target_position (с помощью того же entity menu);
  • связывать их, выделив (любыми способами) сначала light, потом target_position и нажав CTRL+K (хоткей для selection/connect entities).

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



Иллюстрация действия параметра radius (расстояние от всех источника света до текстуры в направлении, определенном target_position'ом приблизительно равно 490 u, мощность лампочек равна 600)

3. Шейдерно-текстурный свет

Последний источник лайтмэпов на уровне - свечение самих текстур. В первом квейке ничего подобного не было, но уже в Quake 2 текстурам стало возможно присваивать разного рода флаги, отвечающие за свойства повехности. Флаг light с заданным значением освещенности позволил получить свет на картах от неба, водных и лавовых поверхностей, а также от текстур с разного рода светильниками.

Особых тонкостей в настроке свечения текстур в Quake 2 вроде бы и нет - открываем surfase Inspector (предварительно выдели в  окне 3D-просмотра нужную поверхность и наложив на неё нужную текстуру) и устанавливаем флаг light. И задаем значение освещенности (тут все зависит от размера поверхности свечения и желания автора).




GtkRadiant SurfaceInspector в режиме  работы с картами Quake 2.

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

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

q3map-параметры

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

q3map_lightImage texturename.tga

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

q3map_surfaceLight N

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

q3map_lightStyle N

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

q3map_lightRGB R G B

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

q3map_sun R G B I D E

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

  • R G B - цвет лайтмэпов (не обязательно в нормализованном формате, компилятор сделает все сам);
  • I (intensity) - интенсивность (аналогично q3map_surfacelight). Рекомендуемые значения 50..200;
  • D (degrees) E (elevation) - значения углов, определяющие положение «солнца» на «небе».




Освещение комнаты с помощью «солнца» (q3map_surfacelight 0; q3map_sun 1 1 1 150 D E) при различных значениях углов D и E. Слева показаны оси X Y Z теми цветами, которыми они обозначены в Радианте (X красная, Y зеленая, Z синяя)

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

q3map_sunExt R G B I D E Ds S

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

  • Ds - угол разброса полутеней. В жизни Солнце видно с Земли под углом 0.5 градусов, в q3 же рекомендуется устанавливать значения 2..3;
  • S - количество случайных лайтмэпов, образующих полутень (возможно, что преведено не совсем правильно; оригинал: the number of random jitters distributed over the solid arc). Рекомендуемое значение - 16.


q3map_skyLight A I

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

  • A (amount) - аналогичен параметру I (intensity) в q3map_sun;
  • I (iterations) - экспоненциальный фактор размытия лайтмэпов. Рекомендуется устанавливать I=3, т.к. меньшие значения не очень заметны, а большие - слишком долго рассчитываются и не сильно улучшают результат.


q3map_lightmapFilterRadius S O

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

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

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

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

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

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

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

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

Всего комментариев: 857