Welcome, guest. You can be a Login или register
Author
Topic title
DOOMer
Offline
Хранитель и могильщик Врат
1544 posts
Karma 101
[list][list][list]Введение

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

  1. эмбиент (англ. ambient light - рассеянный свет);
  2. точечные источники света (light entity);
  3. свечение текстур посредством шейдеров (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'ов на уровне. Для создания лампочки нужно:

  1. кликнуть правой кнопкой по рабочей области и выбрать в entity menu пункт light;
  2. задать яркость света (по умолчанию 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. Для этого нужно сделать следующее:

  1. создать target_position (с помощью того же entity menu);
  2. связывать их, выделив (любыми способами) сначала 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).
Вертексы должны образовывать конвексный браш
My Quake Maps

Core i5 4210U 1.7 Ghz, 8 Gb RAM, GeForce 840M
Ubuntu 15.04 x86_64 [



сохранись перед дверью...два раза =)
DOOMer
Offline
Хранитель и могильщик Врат
1544 posts
Karma 101
[list]Детальные тени в Quake 3

Автор: 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. В результате мы имеем на выходе вот такой результат



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

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

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

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

Key - style
Value - 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


Пример карты можно взять здесь
Вертексы должны образовывать конвексный браш
My Quake Maps

Core i5 4210U 1.7 Ghz, 8 Gb RAM, GeForce 840M
Ubuntu 15.04 x86_64 [



сохранись перед дверью...два раза =)