Различия

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

Ссылка на это сравнение

q3:работа_со_светом [10.09.2009 17:53]
Nt-kop4ik
q3:работа_со_светом [25.12.2012 23:56] (текущий)
Строка 1: Строка 1:
 +==== 0. Введение ====
 +
 +Овещение уровня является результатом взаимодействия трех типов воздействия на текстуры, которые он содержит:
 +  - эмбиент (англ. //ambient light// - рассеянный свет);
 +  - точечные источники света (light entity);
 +  - свечение текстур посредством //шейдеров//.
 +
 +
 +==== 1. Эмбиент-освещение ====
 +
 +Эмибент - простейший способ освещения. Он заключается в том, что все текстуры на уровне освещают себя с одинаковой интенсивностью.
 +Эмбиент-освещение на уровне устанавливается с помощью параметра **_ambient** (или **ambient**) объекта **worldspawn** (о том, как это сделать, можно прочитать в статье [[работа_с_entities|работа с entities]]).
 +
 +^ Key     ^ Value       ^ 
 +| _ambient    | N     |
 +
 +**N** - параметр, который определяет яркость устанавливаемого освещения.
 +
 +К примеру, при компиляции карты с параметром //**-meta**// и без параметра //**-light**// в любой его форме на уровне устанавливается освещение, по технологии схожее с эмбиентом (различия проявляются только при освещении игрока) с параметром //**N=128**// (значение получено опытным путем); при //**N=0**// эмбиент-свет отсутствует.
 +
 +Уровень, освещенный только с помощью эмбиента выглядит некрасиво не зависимо от того, насколько хорошо он отдекорирован. Поэтому использовать только этот способ не рекомендуется, за исключением случаев, когда внешность уровня не важна.
 +
 +{{:q3:cpm_full.jpg|}}
 +
 +  * Уровень (-cpm-.bsp, автор Nt-kop4ik) с только эмбиент-освещением (**//N=20//**)
 +
 +Значительно лучше выглядит уровень, при освещении которого эмбиент либо не использовался вовсе, либо комбинировался с другими способами освещения.
 +Последний метод особенно эффективен по соотношению трудоемкость/результат, благодаря чему пользуется большой популярностью среди мапперов, включая автора настоящей статьи. В этом случае следует устанавливать эмбиент с мощностью //**N=5..20**// и доосвещать слишком темные участки другими способами.
 +
 +{{:q3:cpm_ambient_only.jpg|}}
 +
 +  * Тот же уровень с тем же эмбиент-освещением, но с добавлением точечных источников и шейдерных лампочек
 +
 +
 +
 +==== 2. Точечные источники света (light entity) ====
 + 
 +Точечные источники света (далее //лампочка//) - специальные //entity//, "говорящие" BSP-компилятору о расстановке //lighmap//'ов на уровне. Для создания лампочки нужно: 
 +
 +  - кликнуть правок кнопкой по рабочей области и выбрать в //**entity menu**// пункт //light//;
 +  - задать яркость света (по умолчанию 300; можно изменить в любое время, не обязательно сразу).
 +
 +
 +
 +{{:q3:работа_со_светом.gif|}}
 +
 +
 +=== Параметры лампочки ===
 +
 +
 +
 +== 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**// (их довольно много).
 +
 +{{:q3:select_color.jpg?300x200|}}
 +  * **Select Color tool**
 +
 +
 +
 +В этом интуитивно понятном инструменте установить нужный цвет //лампочки// не составляет труда. Правда, за исключением экстремальных случаев, он выдает значения с точностью до 6-го знака после запятой, так что для уменьшения размеров map-файла незначащие цифры можно смело удалять вплоть до 2-го знака :-)
 +
 +== 3. Направление ==
 +
 +
 +По умолчанию //лампочка// светит во все стороны равномерно (по крайней мере, насколько это позволяет движок //q3//). Для создания направленного источника света следует соединить //лампочку// с //target_position//. Для этого существую два способа:
 +
 +
 +== Обычный ==
 +
 +
 +    - создать //target_position// (с помощью того же //**entity menu**//);
 +    - связывать их, выделив (любыми способами) сначала лампочку, потом //target_position// и нажав **CTRL+K** (хоткей для **//selection/connect entities//**).
 +
 +== Продвинутый ==
 +
 +
 +    - создать //target_position//;
 +    - задать ему параметр //**targetname**//, равный //**spotlight1**//;
 +    - установить в //лампочке// параметр //**target**// равным //**spotlight1**// (разумеется, имена меток можно менять).
 +
 +
 +
 +Теперь //лампочка// светит в направлении, задаваемом //target_position//'ом и накладывает на текстуры в этом направлении //lightmap// определенного радиуса, изменить который можно, задав лампочке параметр //**radius**// (по умолчанию он счается равным **64**).
 +
 +{{:q3:spotlight_radius.jpg?377x200|}}
 +
 +
 +  * **иллюстрация действия параметра** //**radius**// (расстояние от всех //лампочек// до текстуры в направлении, определенном //target_position//'ом приблизительно равно //**490 u**//, мощность //лампочек// равна **//600//**)
 +
 +
 +=== Динамический мигающий свет ===
 + 
 +Авторы: **GT-Agressor** и **Dyxxx**
 +
 +
 +Также в компиляторе //q3map2// есть функция создания мигающего источника света. Для этого в свойствах //лампочки// следует прописать 
 +
 +^ Key     ^ Value       ^ 
 +| style    | N     |
 +
 +Значение **//N//** может быть любым от **//1//** до **//32//**. Число означает периодичность и характер мигания:
 +
 +  - Нормальный
 +  - Мерцающий (первый вариант)
 +  - Медленый жесткий пульсирующий (яркий)
 +  - Свечка (первый вариант)
 +  - Быстрое мигание
 +  - Слабая пульсация 1
 +  - Мерцающий (второй вариант)
 +  - Свечка (второй вариант)
 +  - Свечка (третий вариант)
 +  - Медленое мигание (четвертый вариант)
 +  - Флюорицирующий мерцающий
 +  - Медленая пульсация не затухающая до темноты
 +  - Быстрая пульсация
 +  - Смешаный (Тест)
 +
 +
 +После компиляции в папке //**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**//
 +
 +
 +Пример карты можно взять [[http://www.defrag.ru/forum/index.php?act=attach&type=post&id=6250|здесь]]
 +
 +
 +==== 3. Шейдерный свет ====
 +
 +
 +Последний источник лайтмэпов на уровне - свечение самих текстур, которое описывает соответствующий имени текстуры //шейдер//. Применительно к q3 //шейдер// можно определить как специальный файл с расширением //shader//, находящийся в папке //название_мода/scripts/ //, со специальной структурой, содержащий параметры прорисовки текстур на уровне.
 +
 +//Шейдеры// - большая тема, в данной же статье нас интересуют параметры, относящиеся к свету. Автор статьи сам редко использовал многие параметры и статья будет "обрастать" подробностями по мере их изучения.
 +
 +Некоторые описания являются переводом выписок из крупнейшего мануала по //q3map2// шейдерам, находящемся [[http://members.lycos.co.uk/quakeroats/q3map2/shader_manual/contents.html|здесь]] (особенно это касается редко используемых параметров).
 +
 +=== 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//).
 +
 +**Параметры:**
 +
 +  * //R G B// - цвет лайтмэпов (не обязательно в нормализованном формате, компилятор сделает все сам);
 +
 +  * //I// (intensity) - интенсивность (аналогично //q3map_surfacelight//). Рекомендуемые значения //**50..200**//;
 +
 +  * //D// (degrees) //E// (elevation) - значения углов, определяющие положение "солнца" на "небе".
 +
 +{{:q3:sky_angles.jpg|}}
 +
 +  * Освещение комнаты с помощью "солнца" (//q3map_surfacelight 0//; //q3map_sun 1 1 1 150 D E//) при различных значениях углов //D// и //E//. Слева показаны оси //X Y Z// теми цветами, которыми они обозначены в Радианте (//X// красная, //Y// зеленая, //Z// синяя)
 +
 +Как видно, //D// отвечает за отбрасывание теней по оси //Y//, а //E// - по //X//.
 +Как и настоящее Солнце, солнечно-подобный источник в //q3// светит так, что интенсивность свечения не зависит от расстояния до освещаемой текстуры, но зависит от положения "солнца".
 +
 +**6.** //**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**//.
 +
 +**7.** //**q3map_skyLight**// //A I//
 +
 +Альтернативный способ задать яркость света от неба (sky). Параметр имеет более высокий приоритет, чем //3map_surfacelight// и позволяет создавать более однородное освещение, приближенное к реальности.
 +
 +**Параметры:**
 +
 +  * //A// (amount) - аналогичен параметру //I// (intensity) в //q3map_sun//;
 +
 +  * //I// (iterations) - экспоненциальный фактор размытия лайтмэпов. Рекомендуется устанавливать //**I=3**//, т.к. меньшие значения не очень заметны, а большие - слишком долго рассчитываются и не сильно улучшают результат.
 +
 +
 +**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// - 128x128). Но тем не менее есть способ значительно улучшить качество света и теней на уровне. Для компиляции небходим q3map2. 
 +
 +== Редактирование шейдера ==
 +
 +
 +Немного отредактируем один из шейдеров текстур. Открываем шейдер //base_floor.shader// и ищем в нем описание текстуры //proto_grate4//. В нем меняем строку //surfaceparm nonsolid// на //surfaceparm alphashadow//, то есть убираем "неплотность" текстуры на функцию, позволющий компилятору рассчитывать тень через альфаканал текстуры.
 +
 +Открываем в радианте карту-пример и компилируем ее. На выходе мы получаем невыразительную картинку:
 +
 +{{:q3:работа_со_светом_2.jpg|}}
 +
 +Теперь, чтобы сделать тени более детальными, следует прописать в объекте //worldspawn//  параметр //**_lightmapscale**// со значением //**0.1**//. Хотя, в общем, достаточно значения 0.256, при условии что не надо сильно детализировать альфа тени. 
 +
 +
 +==Особенности компиляции ==
 +
 +
 +В //BSP// фазе необходим ключ //-meta//, в противном случае скейл лайтмэпов не заработает. Теперь главное - расчет освещения. Поскольку мы, не меняя размера лайтмэпа, просто меняем его маштаб, то при сильном маштабировании (значение менее чем 0.256) начинает вылезать "лесенка", которую необходимо сгладить. Для этого вы используем ключ //-filter//. В результате мы имеем на выходе вот такой результат 
 +
 +{{:q3:работа_со_светом_4.jpg.jpg|}}
 +
 +пример можно взять [[http://q3mapping.on.ufanet.ru/prim/54/dshadows.pk3|тут]] 
 +
  
 
За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki