Овещение уровня является результатом взаимодействия трех типов воздействия на текстуры, которые он содержит:
Эмибент - простейший способ освещения. Он заключается в том, что все текстуры на уровне освещают себя с одинаковой интенсивностью. Эмбиент-освещение на уровне устанавливается с помощью параметра _ambient (или ambient) объекта worldspawn (о том, как это сделать, можно прочитать в статье работа с entities).
Key | Value |
---|---|
_ambient | N |
N - параметр, который определяет яркость устанавливаемого освещения.
К примеру, при компиляции карты с параметром -meta и без параметра -light в любой его форме на уровне устанавливается освещение, по технологии схожее с эмбиентом (различия проявляются только при освещении игрока) с параметром N=128 (значение получено опытным путем); при N=0 эмбиент-свет отсутствует.
Уровень, освещенный только с помощью эмбиента выглядит некрасиво не зависимо от того, насколько хорошо он отдекорирован. Поэтому использовать только этот способ не рекомендуется, за исключением случаев, когда внешность уровня не важна.
Значительно лучше выглядит уровень, при освещении которого эмбиент либо не использовался вовсе, либо комбинировался с другими способами освещения. Последний метод особенно эффективен по соотношению трудоемкость/результат, благодаря чему пользуется большой популярностью среди мапперов, включая автора настоящей статьи. В этом случае следует устанавливать эмбиент с мощностью N=5..20 и доосвещать слишком темные участки другими способами.
Точечные источники света (далее лампочка) - специальные entity, «говорящие» BSP-компилятору о расстановке lighmap'ов на уровне. Для создания лампочки нужно:
Основным параметром любого источника света является его яркость; не является исключением и лампочка. Яркость задается с помощью параметра _light (или light) в лампочке (именно этот параметр генерируется в лампочке по факту ее создания и вводится пользователем в окошко, подобное тому, что показано выше).
Устанавливая яркость лампочки следует учитывать то, что освещенность текстуры, на которую падает свет от лампочки, уменьшается (по умолчанию) пропорционально квадрату расстояния до нее (закон обратных квадратов, известный из физики). К примеру, текстура, освещаемая лампочкой с яркостью 300, расположенной на расстоянии 500 u от нее будет в своей центральной части выглядеть так же, как и текстура, освещаемая лампочкой с яркостью 300*2^2=1200 с расстояния 500*2=1000 u.
Это знание поможет правильно выбирать парамерты light лампочек, а также выгодно менять несколько «маленьких» лампочек на одну «большую».
Установка флага linear ламппочки заставляет яркость света от нее уменьшается линейно, то есть пропорционально расстоянию (устанавливать не рекомендуется, так как выглядит не реалистично).
Цвет света, который дает лампочка, задаётся параметром _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-го знака
По умолчанию лампочка светит во все стороны равномерно (по крайней мере, насколько это позволяет движок q3). Для создания направленного источника света следует соединить лампочку с target_position. Для этого существую два способа:
Теперь лампочка светит в направлении, задаваемом target_position'ом и накладывает на текстуры в этом направлении lightmap определенного радиуса, изменить который можно, задав лампочке параметр radius (по умолчанию он счается равным 64).
Авторы: GT-Agressor и Dyxxx
Также в компиляторе q3map2 есть функция создания мигающего источника света. Для этого в свойствах лампочки следует прописать
Key | Value |
---|---|
style | N |
Значение N может быть любым от 1 до 32. Число означает периодичность и характер мигания:
После компиляции в папке 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
Пример карты можно взять здесь
Последний источник лайтмэпов на уровне - свечение самих текстур, которое описывает соответствующий имени текстуры шейдер. Применительно к q3 шейдер можно определить как специальный файл с расширением shader, находящийся в папке название_мода/scripts/ , со специальной структурой, содержащий параметры прорисовки текстур на уровне.
Шейдеры - большая тема, в данной же статье нас интересуют параметры, относящиеся к свету. Автор статьи сам редко использовал многие параметры и статья будет «обрастать» подробностями по мере их изучения.
Некоторые описания являются переводом выписок из крупнейшего мануала по q3map2 шейдерам, находящемся здесь (особенно это касается редко используемых параметров).
Группа параметров, с которыми непосредственно оперирует 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 вообще не требуется, но рассчитывается он быстрее.
Группа параметров, начинающихся с ключевого слова surfaceparm и определяющих свойства поверхности, на которую наложена текстура, определяемая соответствующим шейдером. Если проводить аналогию между структурой шейдера и праметрами entity, то q3map-параметры - ее ключи, а surfaceparm'ы - флаги.
1. surfaceparm alphashadow
Позволяет q3map2 рассчитывать тени с помощью альфаканала текстуры (подробней об этом рассказано в параграфе про детальные тени).
2. surfaceparm lightfilter
Позволяет создавать лайтмэпы на основе цветов и альфаканалов данной текстуры.
3. surfaceparm nodlight
“nodlight” = “no dynamic light”, то есть поверхность с этим параметром не будет подвергаться воздействию динамического света (например, эффектам от пушек).
4. surfaceparm sky
Текстуру с этим ключем q3map2 делает небом (sky или skybox).
Автор: 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. В результате мы имеем на выходе вот такой результат
пример можно взять тут