Как сделать солнце в юнити
games maker Все о создании игр и не только
19 октября 2012 в 14:05
Шаг 1 — Настройка ландшафта.
Поскольку мы не хотим делать слишком большой остров для нашего первого проекта, установите ширину и длину ландшафта (Terrain Width и Terrain Length) равными 1000. После ввода значений, нажмите клавишу Enter, так вы подтвердите их ввод, прежде чем нажать кнопку Set Resolution.
Вы можете не заметить изменений в окне сцены (Scene), так как мы, всего лишь, подняли наш ландшафт немного вверх. Но данная операция экономит много времени – теперь нам достаточно, используя инструмент Raise Height (с зажатым Shift), опустить края ландшафта, оставив в центре возвышенность, которая и будет нашим островом. Это более эффективно, чем начинать с нулевой высоты, ‘рисуя’ на ландшафте целый остров.
Шаг 2 — Контуры острова.
Выберете первую кисть (brush) в палитре, и установите значения Brush Size и Opacity, равными 75 и 50 соответственно (прим. пер.: в книге значение Opacity указанно равным 0.5, но Unity не понимает таких значений, видно у автора диапазон этого значения от 0 до 1, поэтому я изменил на 50).
Измените вид в окне сцены (Scene), на вид сверху-вниз, для этого нажмите на ось Y (зеленая ‘ручка’) инструмента Scene Gizmo (gizmo – штуковина, в правом верхнем углу окна сцены).
Нет необходимости точно копировать созданные мною контуры острова, но постарайтесь не делать их слишком сложными, т.к. в дальнейшем нам понадобиться обширный плоский участок. Результат вашей работы должен выглядеть примерно так:
Теперь, переключитесь обратно на 3D вид в окне сцены, нажав на куб в центре Scene Gizmo, и полюбуйтесь на творение своих рук. То, что получилось у меня, можно увидеть на рисунке ниже:
Сейчас, самостоятельно разнообразьте рельеф вашего острова с помощью инструмента Raise Height, поэкспериментируйте с кистями и настройками, используйте Shift, что бы создать озеро или овраг. Но оставьте нетронутый участок на вашем острове, где-нибудь с краю, там мы создадим вулкан!
Сейчас мы создадим вулкан! Для этого используем следующую комбинацию инструментов Paint Height, Raise Height и Smooth Height. Для начала выберем Paint Height.
На данный момент ваш остров должен выглядеть приблизительно так (3D вид):
Наше плато может выглядеть немного неуклюже, это не страшно – позже ми подправим его, используя сглаживание, но сначала мы должны сделать жерло вулкана. Для этого продолжим использовать Paint Height, только изменим его настройки, установим высоту (Height) в 20, а размер кисти (Brush Size) равным 30.
Теперь, удерживая левую кнопку мыши, начинайте ‘рисовать’ от центра плато к его краям, во всех направлениях, пока не сформируется жерло, оставив узкий хребет по краям, должно получиться приблизительно так:
У нас по-прежнему очень резкие края, а при переключении на вид в перспективе (perspective view) мы можем заметить, что наш вулкан выглядит не совсем красиво. Вот где нам понадобиться инструмент Smooth Height. Выберете Smooth Height и установите его параметры Brush Size и Opacity равными 30 и 100 (прим. пер.: в книге значение Opacity указанно равным 1, изменил на 100) соответственно. Используя этот инструмент, рисуйте по краю хребта с помощью мыши, смягчая его высоту, пока не будут созданы округлые мягкие края, как показано на следующем рисунке:
Сейчас, когда наш вулкан готов, мы можем приступить к текстурированию острова, что добавит ему реалистичности.
Шаг 4 — Добавляем текстуры.
Добавляя текстуры на ваш ландшафт, крайне важно помнить, что первая текстура, которую вы добавляете, покроет его полностью. Имея это в виду, вы должны обеспечить, чтобы первая текстура, добавляемая в палитру текстур (texture palette), была текстурой, которая представляет поверхность большей части вашего ландшафта.
Начиная создавать нашу игру, мы включили в наш проект Standard Assets Package (пакет стандартных ресурсов), в котором находятся различные ресурсы, пригодные для начала создания игр. Таким образом, вы найдете папку Standard Assets в окне вашего проекта (Project). Откройте эту папку, нажав на серую стрелку слева, перейдите к папке Terrain Textures и откройте ее.
Эти четыре текстуры мы будем использовать для окраски ландшафта нашего острова, поэтому давайте начнем добавлять их в нашу палитру. Убедитесь, что объект ландшафта (Terrain game object) все еще выделен, а затем выберите инструмент Paint Texture из компонента Terrain (Script) в инспекторе свойств (Inspector).
Для того, что бы применить эти четыре текстуры, начнем с нажатия на кнопку Edit Textures и выбора Add Textures из выпадающего меню. Откроется диалоговое окно Add Textures, в корм вы сможете выбрать любую текстуру из вашего проекта. Нажмите на стрелочку вниз, справа от параметра Splat, откроется список всех текстур, выберете там Grass (Hill).
Установите параметры Tile Size X/Y равными 15, т.к. эта текстура покроет всю карту, эти малые значения дадут нам более детальный вид травы. Нажмите Add. Эта текстура травы покроет весь наш ландшафт, т.к. мы ее добавили первой. Следующие добавление текстуры придется наносить на ландшафт вручную.
Сейчас у вас в палитре должно находиться четыре текстуры, Выберете текстуру GoodDirt (синее подчеркивание – признак того, что текстура выделена). Установите параметры рисования следующим образом: Brush Size = 60, Opacity = 50 и Target Strength = 1. Теперь вы можете окрасить побережье острова, используя или вид с верху, или вид в перспективе.
По окончании, вы должны иметь что-то вроде этого:
Далее выберем в палитре добавленную текстуру Grass&Rock. Установим Brush Size равным 25, Opacity в 30, а Target Strength присвоим значение 0.5. Окрасьте этой текстурой возвышенности и подножье вулкана. Должно выйти вот так:
Придадим нашему вулкану более реалистичный вид, окрасив его добавленной ранее текстурой Cliff (Layered Rock). Настройки рисования будут следующими: Brush Size = 25, Opacity = 100 и Target Strength = 1.
Жерло вулкана и его вершину красьте с этими параметрами, но, приближаясь к его подножью, постепенно уменьшайте значения Opacity и Brush Size, для более точного сопряжения с текстурой земли.
Когда вы закончите, ваш вулкан должен выглядеть следующим образом:
Шаг 5 — Время для деревьев.
После того как мы покрыли остров текстурами, пора его облагораживать – неплохо было бы посадить на нем деревья. В пакете стандартных ресурсов (Standard Assets package), есть все ресурсы, что бы научить нас работать с редактором ландшафта (terrain editor), тут есть и дерево – это пальма.
Убедитесь, что объект ландшафта (Terrain game object) все еще выделен, а затем выберите инструмент Place Trees из компонента Terrain (Script) в инспекторе свойств (Inspector). Нажмите на кнопку Edit Trees и из выпадающего меню выберете Add Tree.
Откроется диалоговое окно Add Tree. Как и некоторые другие инструменты ландшафта, этот Add-диалог позволяет выбрать любой объект соответствующего типа из нашей папки ресурсов.
Вы не ограничены деревьями доступных в Standard Assets, вы можете создать свои деревья и импортировать их в папку Assets своего проекта, с тем, что бы использовать их в дальнейшем. Тем не менее, мы будим использовать пальму из Standard Assets. Нажмите на стрелочку вниз, справа от параметра Tree и выберете там ресурс Palm.
Bend Factor позволяет нашим деревьям качаться на ветру. Этот эффект влияет на производительность (дорог в вычислительном плане), поэтому мы будем использовать небольшое число. Введите значение 2 и нажмите Enter. Если в дальнейшем, вы заметите что именно этот эффект является причиной падения производительности вашей игры, вы можете в любое время установить этот параметр в ноль. Когда все будет готово – нажмите кнопку Add.
Добавленная в палитру пальма будет отображаться в виде эскиза, синей фон говорит о том, что данное дерево является активным.
Установите Brush Size равным 15 и Tree Density в 10. Установите Color Variation в 0.4(разнообразит оттенки) и Tree Height / Width равными 150 с разбросом в размере (Variation) 30.
С помощью левой клавиши мыши расставьте пальмы вдоль береговой линии. Можно посадить пару пальм и в центре острова.
Помните, что если вы поместили пальму там, где ей не место, Place Trees использует клавишу Shift, что бы стереть деревья с ландшафта, в сочетании с клавишей Ctrl стирает только выбранные в палитре деревья.
Шаг 6 — Расти трава.
Сейчас, после того, как мы добавили на остров несколько деревьев, посадим немного травы, в довесок к текстуре имитирующей ее.
Убедитесь, что объект ландшафта (Terrain game object) все еще выделен, а затем выберите инструмент Paint Details из компонента Terrain (Script) в инспекторе свойств (Inspector). Нажмите на кнопку Edit Details и из выпадающего меню выберете Add Grass Texture.
Мы будем использовать текстуру травы из Standard Assets package, нажмите на стрелочку вниз, справа от параметра Detail Texture и выберете там текстуру с названием Grass (не Grass (Hill)).
После выбора текстуры Grass, оставим значения Min/Max Width и Min/Max Height (мин/макс ширина и высота травы) по умолчанию, и убедимся, что стоит флажок напротив свойства в Billboard (внизу окна). Поскольку наша трава это 2D текстура, мы можем использовать billboarding, прием в разработке игр, при котором текстура травы вращается так, чтобы быть лицом к камере во время игры, так трава будет казаться менее двумерной.
Используя диалог выбора цвета, установите Healthy Color (цвет живой травы) и Dry Color (цвет сухой травы), в соответствие с цветом текстуры травы, т.к. яркая трава на поверхности нашей текстуры будет смотреться крайне не уместно.
Для посадки травы мы также пользуемся мышью, как и в других инструментах.
Установите Brush Size, Opacity, Target Strength в 100, 0.05 и 0.6 соответственно. Так мы посадим траву на большой площади, но с малой плотностью, а выбор пунктирной кисти, см. рисунок ниже, сделает области травы не равномерными.
Шаг 7 — Да будет свет!
Теперь, когда ландшафт острова готов, пора добавить освещения на нашу сцену. Это наше первое знакомство со светом в Unity, поэтому для начала давайте ознакомимся с типами источников света:
• Directional light: Используется в качестве основного источника света, чаще всего, как солнечный свет, Directional light (направленный свет) не исходит из одной точки, он светит в одном направлении;
• Point light: Свет этого источника исходит из одной точки и распространяется во всех направлениях, используется в качестве внутреннего освещения, огня, светящихся объектов и т.п.;
• Spot light: Светит в одном направлении и имеет радиус освещения, т.е. работает, как и указанно в его названии, в качестве прожектора.
“Пусть всегда будет солнце”.
Чтобы имитировать солнце, мы поместим свет высоко над островом и обеспечим его правильное направление.
Наконец мы должны сделать наше ‘солнце’ видимым. Для этого выберем flare (блеск/сияние) света, нажав на стрелочку вниз, справа от параметра Flare компонента Light – сейчас он установлен в положение None, выберете Sun.
Шаг 8 — Что это за звук?
Очень часто при разработке игры забывают уделить звуку достойное внимание. Для полного погружения в игру, игрок не только должен видеть красивое окружение, но и слышать его.
Unity управляет поведением звука, используя Стерео (два канала), как звук с постоянным радиусом слышимости, и Моно(один канал), как звук с переменным радиусом слышимости, зависящим от близости его источника к слушателю в 3D мире.
Например, в следующих целях:
• Музыка в игре. Лучше использовать Стерео, т.к. звук должен оставаться
неизменным, в независимости от положения слушателя-игрока.
• Звуковые эффекты. Лучше использовать Моно – позволит игроку
ориентироваться на звук по мере его затухания/появления, придаст реалистичность.
Звуковые файлы импортируются в Unity, так же как и все остальные ресурсы.
В инспекторе свойств ландшафта (Inspector of the terrain), вы увидите компонент Audio Source, которому вы можете назначить аудио файл для воспроизведения или оставить пустым, если вы планируете воспроизводить звуки по средствам скрипов.
Импорт вашего первого пакета.
Откроется диалоговое окно выбора Import package…, в котором вам будет предложено выбрать файл пакета для импорта, после выбора нужного пакета и нажатия кнопки ‘Открыть’, Unity предоставит список ресурсов содержащихся в пакете, по умолчанию отмечены все ресурсы, что подразумевает импорт всего содержимого пакета, но есть возможность импортировать только часть ресурсов, что очень полезно.
В пакете Sound1 находится папка Sound, в которой находиться один файл формата MP3, под именем hillside.mp3.
Нажмите кнопку Import, для подтверждения добавления этих файлов в проект, и после недолгой индикации хода преобразования, вы должны увидеть их в окне своего проекта (project) – вам надо открыть добавленную папку Sound (серая стрелка слева), что бы увидеть аудио файл hillside. Аудио файлы представлены в окне проекта (Project) значком динамика, как показано на следующем рисунке:
Файл hillside теперь готов к применению в компоненте Audio Source ландшафта.
Нажмите на стрелочку вниз, справа от параметра Audio Clip компонента Audio Source объекта Terrain. Появиться список всех доступных аудио файлов вашем проекте, выберете наш единственный файл hillside.
Дальнейшие настройки аудио.
Компонент Audio Source имеет различные настройки для управления, как звучанием аудио клипа (Audio Clip), так и его воспроизведением. Для нашего звука, просто убедитесь, что установлены флажки для Play On Awake и Loop.
Так как наш звук в режиме стерео, он не зависит от расстояния, параметры Min / Max
Volume и Rolloff Factor не применяются. Однако они важны при использовании моно звука.
Прим. пер.: опишу все свойства компонента Audio Source:
• Audio Clip: Ссылка на воспроизводимый аудио клип;
• Play On Awake: Если включено — звук начинает проигрываться при старте
сцены. Выключено — нужно активировать скриптом через Play();
• Volume: Громкость звука, находящегося на расстоянии 1 единцы (1 метра) от
Audio Listener;
• Pitch: Скорость воспроизведения. Значение «1» — нормальная скорость;
• Min Volume: Минимальная громкость звука;
• Max Volume: Максимальная громкость звука;
• Rolloff Factor: Как быстро затухает звук с увеличением расстояния;
• Loop: Если включено, то Audio Clip будет воспроизведён снова после окончания.
Шаг 9 — Посмотрите на небо!
Шаг 10 — Вода, кругом вода.
Так как мы создаем остров, вполне логично, что б он был окружен водой. Вода в Unity создается путем применения анимированного материала (animated material) к поверхности (surface). Хотя вполне возможно создать дополнительные динамические эффекты для воды с помощью частиц (particles), лучший способ добавить большое водное пространство состоит в том, чтобы использовать один из водных материалов (water materials), предоставляемых Unity.
Перетащите префаб Daylight Simple Water на нашу сцену, переместите его в позицию (500, 4, 500), заполнив соответствующие поля X, Y и Z поля свойств Position компонента Transform в Inspector-е. Для того, что бы вода окружала наш остров необходимо увеличить масштаб префаба воды, увеличьте значения X и Z свойства Scale до 1600.
У вас должно получиться следующее:
Шаг 11 — Прогулки по острову.
В окне нашего проекта (Project), в папке Standard Assets находиться папка Prefabs. Тут вы найдете один префаб (prefab) – готовый объект First Person Controller (управление от первого лица). Его можно разместить на нашей сцене, что позволит вам ходить по острову с помощью клавиатуры и мыши.
Перетащите этот префаб из окна проекта (Project) в окно сцены (Scene).
Переместите First Person Controller в позицию (500, 35, 500). Это место находиться прямо в центре карты, т.к. мы создали ландшафт размером 1000х1000 (ХхZ). Если в центре карты вы создали холм, отрегулируйте значение Y так, что бы персонаж появлялся над поверхностью ландшафта.
Для фокусировки камеры на объекте выборном его в Hierarchy, наведите курсор на окно сцены и нажмите клавишу F, окно сцены будет центрировано и масштабировано по объекту.
Теперь нажав кнопку Play для теста игры, вы будите иметь возможность передвигаться по острову.
По умолчанию управление персонажем такое:
• Up/W: вперед;
• Down/S: назад;
• Left/A: влево;
• Right/D: вправо;
• Mouse: Смотрите вокруг/поворот игрока при ходьбе.
Подымитесь на холм и осмотритесь, пока не увидите сияние (flare) солнца. Тогда повернитесь вправо и вы увидите, что skybox так же имеет свое солнце. Наша задача совместить Directional Light с солнцем на skybox-е.
Остановите тест игры, повторено нажав на кнопку Play. Крайне важно остановить игры, для продолжения работы. В режиме воспроизведения (play mode), изменения, вносимые в любую часть вашей игровой сцены, временные – это задумано, как способ тестирования, при остановке игры, все внесенные изменения будут отменены.
Шаг 12 — Выравнивание солнца и последняя хитрость.
Выберете в окне Hierarchy объект the Directional Light, переместите его, используя компонент в инспекторе свойств, в точку (-500, 500, 500). Поверните (Rotate) объект на 120 градусов вдоль оси Y. Так мы поместим источник света в соответствии с солнцем на skybox-е.
Поздравления, ваш остров готов к исследованию, нажмите кнопку Play и вперед! Только не забудьте снова нажимать Play, когда вы закончите.
Работа с освещением в Unity — теория и практика
В течение последних пары лет мне приходилось много работать с “лайтмаппингом” как по работе, так и на своём собственном инди-проекте. Когда у вашей команды мало производственных ресурсов и вы не можете выделить много времени на создание уникальной графики для игровых локаций, освещение становится одним из ключевых факторов, помогающих оживить и разнообразить картинку.
Теория освещения
Отражённый свет
Давайте определимся с терминологией. Освещение в компьютерной графике делится, условно говоря, на две категории:
Global Illumination (GI) представляет из себя наиболее “честный” способ симуляции отражённого света. Из источника света вылетают фотоны — частички, несущие информацию о цвете и яркости света. Ударяясь о какую-либо поверхность, они освещают её, но теряют часть энергии, вследствие чего их цвет и яркость изменяются. Затем фотоны отскакивают и ударяются о следующую поверхность, повторно теряя часть энергии. Так происходит несколько раз в зависимости от настроек рендерера.
Final Gather (FG) раскидывает по сцене точки, — final gather points, — из которых в разные стороны вылетают лучи. После столкновения с какой-либо поверхностью, лучи возвращают в родительскую точку информацию о цвете и его яркости. Представьте себе такую картину: вечер, солнце почти зашло за горизонт; становится темно, но небольшая часть комнаты ещё залита оранжевым закатным светом. Находящаяся на полу final gather point отправляет в разные стороны несколько лучей, некоторые из них дотягиваются до освещённой части комнаты и с этой информацией возвращаются в исходную точку, тем самым слегка освещая пол «отражённым» оранжевым светом. Это не такой “честный” способ, как GI, но он производит хороший результат, и им часто пользуются, чтобы заполнять сцены красивым мягким освещением.
Для следующей картинки я выкрутил параметры отражённого света до безумных значений, таким образом вы можете наглядно увидеть, как частички света отскакивают от объектов.
Ambient Occlusion
Кроме отражённого света, нам интересен так называемый Ambient Occlusion (AO). Это эффект затенения в углах, трещинах, узких проёмах. Представьте, что луч света залетает в угол комнаты, он несколько раз отражается от обеих стен, постепенно затухая. Чем дальше в угол, тем меньше света туда доходит.
Как правило, Ambient Occlusion используется, чтобы художественно подчеркнуть эффект затенения, — в реальности лучи света не теряют энергию столь быстро, чтобы в углах комнаты сгущалась такая же тьма, как показывают нам в играх. Если вы рендерите физически корректное освещение, ваш движок сам высчитывает скорость потери энергии лучом света, и вам не нужно отдельно рендерить карту (текстуру) Ambient Occlusion. Но вы можете это сделать, если потребуется для реализации художественного замысла.
Текстурные атласы
Следующим термином, который вам следует следует знать, является текстурный атлас. Грубо говоря, это одна большая текстура, в которой содержатся несколько маленьких текстурок. Чаще всего текстурные атласы создаются для экономии вычислительных ресурсов. Приведу крайне упрощённый пример, — спецы, спрячьте факелы и вилы! Пусть у вас в игре есть таверна, в которой 20 деревянных предметов (столы, стулья, ложки. ), у каждого своя текстура. В итоге CPU будет 20 раз обращаться к GPU, требуя отрендерить каждый объект по отдельности. Если мы назначим всем деревянным объектам один материал, обращающийся к одному текстурному атласу, в который зашиты все 20 текстур, то GPU сможет отрендерить 20 объектов за один вызов (он же — draw call, в конце статьи предоставлю интересные ссылки по этой теме).
В случае с “лайтмаппингом”, для каждого объекта создаётся дополнительная маленькая текстурка, в которой “запекается” информация об освещении. Затем много-много маленьких текстурок разных объектов размещаются в крупных текстурных атласах. Как и в случае с деревянной мебелью, мы также получаем прирост производительности.
Работа с Unity
Общая информация
Но вернёмся к “лайтмаппингу” в самом Unity. Прежде всего запаситесь терпением и, по возможности, мощным компьютером. Процесс рендера имеет свойство полностью занимать процессор и оперативную память, поэтому я включаю его перед тем, как ухожу на работу или иду спать. Таким образом, я возвращаюсь к компьютеру как раз в тот момент, когда рендер уже завершён.
Забегая вперёд, предупрежу, что Unity кэширует промежуточные результаты вычислений освещения. Если вы увидите, что на системном диске у вас пропало 10 гигабайт места — это оно. Чтобы настроить кэш надо зайти в: Edit — Preferences — GI Cache. Здесь вы можете указать, куда он сохраняется и его максимальный размер. Можно убрать компрессию, “весить” будет больше, но работать пошустрее. Тут же вы можете почистить кэш, но имейте ввиду, что если у вас открыта сцена с готовым “лайтмапом”, то он тоже будет удалён, будьте внимательны.
В Unity доступно 5 типов источников света:
Параметры источников света
Хочу обратить внимание на насколько ключевых настроек источников света (доступные настройки различаются в зависимости от типа источника света):
Настройка освещения сцены
Окно настроек освещения сцены вызывается через Window — Lighting, и состоит из трёх вкладок: Object, Scene, Lightmaps. Для запуска рендера освещения используется кнопка Build в самом низу окна. Там же есть галочка Auto, которая автоматически запускает рендер каждый раз, когда вы вносите изменения в сцену; используйте её, если у вас мощный компьютер. Ещё ниже находится информация о количестве и размере “лайтмапов”, появится по завершению процесса “лайтмаппинга”.
Раздел — Object
В Object отображаются настройки конкретного объекта. Если вы выделите элемент окружения на вашей сцене, то здесь увидите ряд настроек и параметров. При условии, что объект является статичным, будет стоять галочка на чекбоксе Lightmap Static. Чаще всего вы будете использовать здесь поле Scale in Lightmap. Как я говорил ранее, для каждого объекта освещение “запекается” в отдельную маленькую текстурку, которая потом размещается в крупном “лайтмап”-атласе. Параметром Scale in Lightmap вы можете регулировать, сколько места будет занимать эта текстурка. Разумеется, чем меньше места ей выделяется, тем хуже будет качество “запечённого” в неё освещения. По умолчанию здесь стоит “1”, но если вы знаете, что объект будет редко попадать в поле зрения или он расположен далеко на фоне, вы можете смело уменьшить этот параметр вплоть до 0.1 или даже меньше.
Раздел — Scene
В Scene расположены ключевые настройки рендера освещения. Я рассказываю основы работы со светом, а также делюсь опытом “лайтмаппинга” конкретно под мобильные платформы, поэтому умышленно пропускаю такие вещи, как realtime GI или использование HDR-текстуры в качестве источника света.
В Ambient Source вы настраиваете заполняющий источник света Ambient Light, который я уже упоминал. Вам предлагается выбрать между небом-текстурой, небом из единственного цвета, а также созданным на основе цветового градиента небом. Я предпочитаю выбирать Gradient. Он позволяет настроить три цвета — купол неба, экватор и землю, что создаст для вашей сцены достаточно сложный и интересный заполняющий свет. Ambient Intensity указывает яркость этого света. В зависимости от художественного замысла, вы можете иметь даже очень светлую сцену, освещённую посредством одного Ambient Light.
Во вкладке Baked GI находятся основные настройки качества освещения, как прямого, так и отражённого, включая и GI, и FG.
Прежде чем углубимся в эти настройки, хочу дать один совет. Всегда имейте ввиду, что размещая на сцене источники света, настраивая тени и Ambient Light, после рендера “лайтмапа” вы получите совершенно иную картинку, только отдалённо напоминающую то, что вы делали. Поэтому я рекомендую работать итерациями: вы выставляете минимальное качество освещения, чтобы рендер происходил быстро, смотрите на результат рендера, после чего вносите правки и запускаете повторный рендер. Когда вы более-менее довольны результатом, можно повысить качество рендера и включить Final Gather. Это займёт длительное время, поэтому есть смысл включать такой рендер перед тем, как вы отходите от компьютера на сравнительно долгий отрезок времени.
Настройки во вкладке Baked GI оперируют такой единицей, как texel. Если говорить упрощённо, тексель — это пиксель, но не на экране, а в текстурном пространстве трёхмерной модели. Но не забивайте голову, — трудно сказать, как Unity оперирует текселями и как они зависят от масштаба объектов, поэтому просто-напросто двигайтесь эксперементальным путём. Например, для своей мобильной RPG я делаю финальный рандер с Baked Resolution выставленным в 25.
Тексель (сокращение от англ. Texture element) — минимальная единица текстуры трёхмерного объекта. Пиксель текстуры.
Проще всего объяснить значение термина «тексель» на примере трёхмерных игр. Если подойти вплотную к стене в какой-нибудь старой 3D-игре — (Wolfenstein или Duke Nukem), то можно наблюдать, как текстура стены распадается на однотонные квадраты, которые увеличиваются при приближении и собираются обратно в осмысленный рисунок при отдалении. Эти квадраты и называются текселями, и чем крупнее исходный рисунок текстуры, тем меньше становятся тексели. Для идеального отображения текстуры количество текселей должно совпадать с количеством пикселей на мониторе, но практически все движки разрешают зрителю приблизиться к стене ближе чем того разрешает детальность.
Ниже я расскажу про каждый параметр отдельно, но перед этим вам нужно знать ещё кое-что. Если вы запустите в Unity рендер освещения, то справа снизу будет написано, чем именно движок занят в текущий момент. В самом конце процесса рендера там будет написано Compositing.
Дело в том, что “лайтмап” генерируется послойно. Во время рендера создаются несколько отдельных текстур. Мне неизвестно, какие именно карты делает Unity, но среди них есть либо все, либо часть из списка: Diffuse (прямой свет), GI (Global Illumination), FG (Final Gather), AO (Ambient Occlusion) и другие. После этого движок берёт эти карты и сливает друг с другом. Например, в основе может лежать слой Diffuse, над ним кладётся слой FG в режиме смешивания Lighten (прямо как в Photoshop’е), а повыше кладётся слой AO в режиме Multiply… В итоге эти слои сливаются в одну картинку и на выходе получается финальный “лайтмап”.
Вкладка — Baked GI
Вкладка — General GI
Давайте пройдёмся по интересующим нас настройкам во вкладке General GI:
Вкладка — Fog
И, наконец, туман! Fog, то бишь. К рендеру освещения он не имеет никакого отношения, может включаться и выключаться в любое время. Тут всё предельно просто, поэтому берите и экспериментируйте. Скажу лишь, что туман является крайне мощным художественным средством. Вы можете радикально изменять атмосферу сцены посредством тумана, благодаря ему солнечная сцена станет ярче, мрачная — мрачнее.
Кроме того, туман может использоваться как инструмент повышения производительности. Например, вы хотите вдалеке выключить у всех объектов текстуры и скрыть их за туманом. В более старых версиях World of Warcraft, если вы играли, вы не могли не заметить, какой густой там был туман.
Раздел — Lightmaps
Третьим разделом является Lightmaps, где будут расположены отрендеренные “лайтмапы”. Причем если атласов много, в верхней части вкладки вы не сможете увидеть все атласы, скролл в том окошке неактивен. Поэтому смотрим в нижнее и прокручиваем колесиком мышки.
Здесь нам важно увидеть насколько заполнен последний, самый нижний “лайтмап”-атлас. Если он почти пуст, то либо увеличиваем качество “лайтмапа”, чтобы заполнить весь атлас, либо уменьшаем, чтобы атлас оказался пустым и был удален. На картинке ниже изображены два хорошо заполненных атласа, а один — постольку-поскольку.
“Лайтмапы” хранятся в файлах EXR с глубиной в 32 бита.
Light Probes
Ещё я обещал рассказать про Light Probes. Они представляют из себя небольшие сферы, вбирающие в себя информацию об освещении окружающего пространства. Когда таких сфер много, они создают своебразную карту освещённости вашего уровня или локации. Затем они используются для освещения динамических объектов, в которые не “запекается” свет.
Чтобы лучше понять их смысл, дам пример. На вашей сцене находится один Point Light, у которого стоят настройки Baked, то есть он используется для “запечения” света. Вы не делаете его Real-time, потому что это дорого в плане производительности, причём многие мобильные устройства вообще не поддерживают такой источник света. Далее вы “лайтмапите” сцену и видите, что ваш Point Light освещает окружение. Но если вы возьмёте монстра и поставите рядом с источником света, он останется тёмным, потому что принадлежит к классу динамических объектов, а ваш Point Light влияет только на статические.
Теперь вы расставляете вокруг источника света сетку из Light Probes, снова запекаете освещение. И теперь ваш монстр может ходить вокруг Point Light’а и освещаться им! Это крайне эффективный и недорогой способ имитации освещения. Чтобы добавить “пробы” на сцену, заходите в Game Object — Light — Light Probe Group. На сцене появится кубик из четырёх сфер. Для выбора отдельных сфер, используйте ctrl + click. В Inspector появятся несколько кнопок, позволяющие добавлять или удалять сферы. Вы также можете использовать комбинацию ctrl + D для дублирования сфер.
Расставляйте Light Probes аккуратно, размещайте их там, где вы хотите, чтобы они вбирали в себя информацию об освещении, чтобы потом передавать её динамическим объектам. Во избежание графических артефактов и мерцающего света, следите за тем, чтобы Light Probes образовывали ровную, красивую сетку.
Ниже скриншот корректно выставленной сетки. Если приглядеться, можно заметить, что Light Probes выставлены не в случайном порядке, а окружают источники света, стремясь эффективно поймать переход от света к тени и обратно.
Заключение
Напоследок хочу дать совет по созданию моделей окружения под “лайтмаппинг”. Создавая контент для игры, я знал, с какой стороны будет смотреть игровая камера, поэтому ради сомнительной оптимизации удалял задние стенки некоторых объектов. В то время у меня был опыт рендера “лайтмапов”, но только в Maya, а не в Unity. Выяснилось, что при рендере освещения в Unity возле объектов, имеющих дыры, то есть удалённые полигоны, появляются жесткие, хорошо заметные артефакты. Имейте ввиду.