Как сделать мигающий свет в unity

Добавил пользователь Валентин П.
Обновлено: 10.09.2024

Приветствую всех друзья! В прошлой статье мы познакомились с тем, как в Unity представлены вращения и ориентация в пространстве игровых объектов. Сегодня мы обзорно поговорим о камерах и типах источников света в Unity. В будущих статьях мы еще вернемся и более детально рассмотрим каждую тему отдельно.

Свет.

Свет является неотъемлемой частью каждой сцены. В то время как модели и их текстуры определяют форму и внешний вид сцены, свет определяет цвет и настроение вашей среды. Скорее всего, вы будете работать с более чем одним источником света в каждой сцене. Чтобы заставить их работать вместе, требуется немного практики, но результаты могут быть удивительными!

Свет можно добавить к вашей сцене из контекстного меню в верхней части редактора по пути GameObject\Light . В появившемся подменю можно выбрать необходимый формат источника освещения. В Unity существует четыре источника освещения, которые мы можем расставить по сцене и пятое, которое работает на всю сцену в целом. В этой статье я вкратце расскажу, что они собой представляют. Позже я также напишу отдельную статью, которая более углубленно расскажет о каждом из них. Итак, начнем:

1. Point Light – это точечный свет который мы можем настроить по радиусу действия. Например, с помощью такого источника освещения мы можем сделать свет для лампочки или факела.

2. Spot Light – представляет из себя направленный конус света, с помощью него можно сделать свет от фонарика или прожектора.

3. Directional Light – представляет из себя направленный источник освещения и имитирует свет от солнца.

4. Area Light – представляет из себя прямоугольник, который светит впереди себя. С его помощью можно сделать, например, свет от телевизора/монитора.

5. Ambient Light – это рассеянный свет который в отличие от остальных видов освещения – присутствует во всей сцене и не исходит от какого то конкретного объекта. Он предназначен чтобы задавать яркость сцене, или же, например, создать настроение светом для нее. Для его настройки перейдите по пути в контекстном меню Window\Rendering\Lighting Settings . Секция Environment Lighting это и есть рассеянный свет. Поиграйте с её настройками, и поймете, как он воздействует на сцену.

Помимо создания готовых игровых объектов со светом, вы также можете добавить источник освещения (он же компонент Light ), к любому игровому объекту, находящемуся на сцене. Для этого нужно выбрать интересующий вас игровой объект и в контекстном меню выбрать Component\Rendering\Light после чего он добавится к компонентам игрового объекта.

Данный компонент имеет множество настроек, которые вы можете увидеть в окне инспектора.

В настоящее время я пытаюсь создать эффект светлячка в темном лесу. Уровень имеет очень слабое освещение, и игрок является одним из немногих источников света. Чтобы игрок лучше видел уровень, я стараюсь, чтобы светящиеся светлячки появлялись на карте случайным образом. Одним из способов является использование системы частиц. Но я не могу заставить частицы излучать свет вокруг. Есть ли способ сделать это?

@ Draco18s Там не будет десятков светлячков. Они только появятся в поле зрения игрока. Это сверху вниз и как таковой легко контролировать. И в любой момент времени должно быть не более 10 светлячков. Я не думаю, что 10 динамический точечный свет стоит дорого?

По умолчанию Unity позволяет только двум активным динамическим источникам света освещать геометрию за раз (хотя это может отличаться для 2D-установки). Конечно, вы можете увеличить это, но имейте в виду, что +1 свет в 2 раза влияет на колл-коллы.

Светоизлучающие частицы теперь являются встроенной функцией Unity в 5.5.

Просто включите источники света в инспекторе частиц, добавьте ссылку на готовый источник света (работают как точечные, так и точечные источники света) и измените соотношение на 1.

введите описание изображения здесь

И вуаля, частицы, которые излучают свет:

Оказывается, это довольно оптимизированная установка, работающая со скоростью 1500+ кадров в секунду на моей установке даже при максимальном освещении в сотни.

Редактировать: После некоторого наблюдения, мне кажется, что частицы света переключаются между освещением каждого фрагмента и освещением вершины (предположительно для оптимизации?). Это может привести к небольшому количеству визуальных артефактов, если максимальное освещение установлено слишком высоко.

Edit2: как указывает DMGregory, артефакты являются побочным продуктом оптимизации прямого рендеринга. Отложенное освещение решает проблему. Добавлен лучший подарок

Поведение освещения вершин, которое вы видите, звучит немного похоже на некоторые оптимизации, которые Unity применяет при прямом рендеринге. Видите ли вы то же поведение при использовании отложенного пути?

Берегись:

Этот ответ устарел. Unity теперь поддерживает точечные световые частицы. Пожалуйста, смотрите этот ответ для более подробной информации.

Вот быстрый пример, который я приготовил:

Я использую этот сценарий для динамического появления достаточного количества света для моих максимальных частиц (убедитесь, что вы настроили параметры системы частиц так, чтобы максимальное значение было разумным - значение по умолчанию 1000 не сделает вашу видеокарту очень счастливой), а затем обновляет их, чтобы следовать активным частицы:

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

Тем не менее, вы можете обнаружить, что у вас есть лучший контроль над полетом светлячков, если вы сделаете каждый из них своим собственным GameObject с квадратом с билбордом и источником света, прикрепленным с помощью специального сценария движения / бликинга, поскольку для получения убедительного блуждания требуется больше мастерства системы частиц, чем Я знаю. ;)

На самом деле . хотя я сказал не использовать тенистую передачу для светлячков, я просто попытался включить ее в моем примере сцены, и это не вызвало никаких проблем. То, как тени вращаются вокруг светлячков, проходящих мимо объектов, действительно круто и может добавить в жуткую атмосферу. Ваш пробег может варьироваться в зависимости от сложности вашей сцены и вашего целевого оборудования, поэтому профиль, чтобы быть уверенным, но это может быть случай преждевременной оптимизации с моей стороны. :)

Кроме того, по какой-то причине ParticleSystem.Particle ссылается на устаревшую частицу. Для него нет метода GetCurrentColor или GetCurrentSize.

@DarkDestry Я добавил примечание к ответу о создании префабов. Что касается отсутствующих функций, это может быть проблемой версии - я работаю в 5.3, в более ранних версиях Unity вы могли бы сделать это по-другому. Давайте обсудим детали реализации в чате , используя комнату, любезно созданную Хамзой Хасаном.

Таким образом, легкий сборный домик такой же, как и обычный сборный дом. Был смущен, когда это упоминается как легкий сборный дом.

Несколько лет назад, до того, как динамические источники света стали доступны по цене, мы просто использовали эффект частиц с двумерным билбордом с аддитивным смешиванием. Это осветлит сцену в сторону белого. Рисуя его с правильной глубиной светлячка, вы получаете почти правильную сортировку. Аддитивная альфа не нуждается в сортировке при перерисовке по сравнению с альфа смешиванием. Он не осветит ВСЕ сцены, но осветит область, окружающую светлячка. Затем вы можете взять динамический свет и выбирать одну из светлячков каждые несколько секунд, чтобы фактически осветить сцену, если вам это нужно.

Уже есть вопрос и ответ об эффектах свечения. Как добиться такого освещения в Unity для 2D-игр?

К сожалению, у меня не было большого опыта работы с Unity в его нынешнем виде (я играл с ним много лет назад), поэтому я не знаю точно, с какими наборами функций вы должны работать в движке.

В любом случае, независимо от того, с каким двигателем вы работаете, динамические фары - это то, чего вы всегда должны избегать. Они очень дороги в вычислительном отношении и, как правило, добавляют сложность сцены очень экспоненциальным образом. Однако, как правило, для большинства 3D-рендеринга существует множество способов достижения аналогичных эффектов путем обмана;

Возможный способ добиться аналогичного эффекта - сопоставить предварительно созданную текстуру свечения с рельефом ниже ваших светлячков (при условии, что система координат Y = вверх / вниз) с позициями X и Z, контролирующими местоположение свечения на местности и смещение Y от местности, контролирующей альфа текстуры (ярче = ближе к местности)

Конечно, у этого метода есть несколько недостатков. Вы не будете отбрасывать тени, поскольку свет не используется, и вы не будете влиять на любую другую геометрию в мире (реквизит, листва и т. Д.)

Используйте Light в начале огня и поиграйте с его размером в сценарии, чтобы получить эффект горения. И используйте свою систему частиц :)

Там нет огня в сцене. У меня дефицитные частицы появляются и исчезают. Там нет никакого фиксированного положения для частиц вообще. Пожалуйста, прочитайте вопрос.

Итак, в чем же дело? вы можете прикрепить свет к вашему префабу с частицами, а не по заранее определенным позициям

Вопрос в том, как это сделать. Я использую систему частиц единства. И я не вижу там сборного дома. Если только вы не попросите меня просто создать сборный, который будет иметь подсветку и создать базу на основе сценария

Итак, у вас есть частица gameObject на сцене. Прикрепите источник света к тому же игровому объекту и создайте его заранее, перетащив этот игровой объект в Unity File Explorer.

Lights придаст вашей игре изюминку и индивидуальность. Используйте источники света для освещения сцены и объектов, тем самым создавая особое визуальное настроение. Источники света могут быть использованы для моделирования солнца, света от горящей спички, ручного фонарика, выстрелов из оружия, или взрывов, и это только часть вариантов применения источников света.


В Unity существует четыре типа источников света:

  • Источник света типа Directional lights расположен бесконечно далеко и оказывает влияние на все объекты сцены. Эффект схож с солнечным светом.
  • Источник света типа Point lights светит со своего местоположения одинаково во всех направлениях, как лампочка.
  • Источник света типа Spot lights светит из точки в некотором направлении и освещает объекты только внутри конуса - как автомобильные фары.
  • Источник света типа Area lights (доступно только с запеканием карт освещения) светит во всех направлениях на одной стороне прямоугольной области плоскости.

Источники света могут порождать Shadows . Свойства теней могут быть настроены для каждого источника света в отдельности.

Свойства

Свойство: Функция:
Type Текущий тип источника света:
Directional Источник света данного типа расположен бесконечно далеко. Оказывает влияние на все объекты сцены.
Point Источник света данного типа излучает свет во все стороны из своего местоположения, а также освещает все объекты внутри сферы радиуса Range .
Spot Источник света данного типа излучает свет внутрь конуса. Конус задается свойствами Spot Angle и Range . Источник света оказывает воздействие только на объекты внутри данной области.
Area Источник света данного типа светит во всех направлениях на одной стороне прямоугольной области плоскости. Прямоугольная область задается свойствами Width и Height . Данный тип освещения работает только во время запекания световых карт и не оказывает никакого эффекта на объекты во время игры.
Range Дальность излучения света из центра объекта. Только для источников света типа Point и Spot .
Spot Angle Задает угол конуса в градусах. Используется только для источника света типа Spot .
Color Цвет излучаемого света.
Intensity Яркость света. По умолчанию для Point , Spot и Area это значение равно 1. Для Directional это значение по умолчанию равно 0.5.
Cookie Альфа-канал данной текстуры используется как маска, которая задает яркость света в разных местах. Для источника света типа Spot или Directional эта текстура должна быть 2D. В случае Point это должен быть Cubemap .
Cookie Size Масштабирует проекцию куки. Только для Directional источника света.
Shadow Type (только для версии Pro) No , Hard или Soft тени, которые будут порождены данным источником света. Мягкие тени (недоступны на Mobile) более ресурсозатратны.
Strength Глубина тени. Значение от 0 до 1.
Resolution Уровень детализации теней.
Bias Сдвиг используется при сравнении позиции пикселя в световом пространстве с значением из карты теней. Смотрите ниже карты теней и свойство Bias.
Draw Halo Если включено, будет нарисован сферический ореол света с радиусом Range . Для получения дополнительной информации смотрите ореол и настройки рендера.
Flare Опциональная ссылка на блик, который будет рендериться в позиции источника света.
Render Mode Важность данного источника света. Данная настройка может повлиять на правильность освещения и производительность. Данный вопрос подробно рассматривается ниже в Вопросах производительности. Содержит следующие опции:
Auto Метод рендеринга определяется автоматически в зависимости от яркости ближайших источников света и текущих настроек качества.
Important Источник света рендерится пиксельным методом. Используйте данную опцию только для очень важных источников света (таких как, фары автомобиля игрока).
Not Important Источник света рендерится быстрее всех предыдущих режимов рендеринга. Вершинный/объектный режим освещения.
Culling Mask Используется для выборочного освещения групп объектов; для получения дополнительной информации смотрите слои.
Lightmapping Режимы световых карт: RealtimeOnly , Auto или BakedOnly . Для получения дополнительной информации читайте описание двойных световых карт.
Width (Только для плоских источников света) Ширина прямоугольной области освещения.
Height (Только для плоских источников света) Высота прямоугольной области освещения.

Детали

В Unity существует четыре типа источников света. Источник света каждого типа может быть настроен под ваши нужды.

Вы можете создать текстуру, которая содержит альфа-канал, и присвоить ее переменной Cookie источника света. Куки будет проецироваться от источника света. Альфа-маска куки изменяет количество света, тем самым создавая темные и светлые пятна на поверхностях. Куки это отличный способ добавить сцене сложности и атмосферности.

Все встроенные шейдеры Unity совместимы со всеми типами источников света. Однако, шейдер VertexLit не отображает куки и тени.

В Unity Pro все источники света могут опционально порождать тени. Это достигается выбором одной из опций Hard Shadows или Soft Shadows свойства Shadow Type для каждого источника света. Для получения дополнительной информации о тенях, прочтите страницу тени.

Точечное освещение (Point Lights)


Point light светит во все стороны из одной точки (как лампочка). Это самый распространенный источник света в играх и используются, как правило, для взрывов, светящихся ламп, и пр. Данный тип освещения имеет среднюю ресурсозатратность для графического процессора (хотя тени, порождаемые точечным освещением, самые ресурсозатратные).

Точечное освещение

Точечное освещение

Точечное освещение может иметь куки - Cubemap-текстуру с альфа-каналом. Cubemap проецируется во всех направлениях.

Точечное освещение с куки

Точечное освещение с куки

Освещение лучем (Spot Lights)


Источник света типа луч светит в одном направлении, внутри конуса. Источники света данного типа идеально подходят для ручных фонариков, автомобильных фар или фонарных столбов. Данный тип освещения самый ресурсозатратный.

Световой луч

Световой луч

Направленный луч света также может иметь куки - текстуру, проецируемую на основание конуса. Данный тип источника света идеально подойдет для эффекта изображения световых лучей, проходящих сквозь окно. Текстура с черными краями, обязательно должна иметь опцию Border Mipmaps и wrapping mode должен быть установлен в Clamp . Для получения дополнительной информации, перейдите на страницу, посвященную текстурам.

Световой луч с куки

Световой луч с куки

Направленное освещение (Directional Lights)


Источники направленного света в основном используются для солнечного и лунного света на сценах с открытым пространством. Источники света данного типа влияют на поверхности всех объектов сцены. Также это самый дешевый источник света для графического процессора. Тени от направленных источников света (для всех платформ, поддерживающих тени) подробно объяснены на этой странице.

Источник направленного света

Источник направленного света

При наличии куки у направленного источника света, текстура проецируется вниз из центра оси Z источника света. Размер куки изменяется свойством Cookie Size . Установите wrapping mode куки-текстуры в Repeat .

Направленное освещение проецирует куки текстуру, похожую на облака

Направленное освещение проецирует куки текстуру, похожую на облака

Куки это быстрый и отличный способ добавить большой открытой сцене дополнительных деталей. Вы даже можете медленно передвигать источник света для эффекта движущихся облаков.

Обратите внимание, что использование прямого рендеринга и направленного освещения отключают тени для данного источника света. Однако, в таких случаях можно создать свой шейдер с тегом fullforwardshadows для активации теней; для получения дополнительных деталей ознакомьтесь с этой страницей.

Плоский источник света (Area Lights)

Плоский источник света излучает свет одной из сторон прямоугольной области плоскости.


Данный тип источника света воздействует на объекты внутри области действия. Размер прямоугольника задается свойствами Width и Height, а нормаль плоскости (т.е. с какой стороны будет излучаться свет) совпадает с положительным направлением оси Z. Свет излучается со всей поверхности прямоугольной области, поэтому затенение и тени будут мягче, чем при использовании точечных или направленных источников света.

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

Вопросы производительности

Освещение рендерится двумя методами: vertex освещение и pixel освещение. Вершинное освещение вычисляет свет только в вершинах игровых моделей и интерполирует свет на всю поверхность модели. Пиксельное освещение вычисляет для каждого экранного пикселя, и следовательно, более ресурсоемко. Некоторые старые видеокарты поддерживают только вершинное освещение.

Несмотря на ресурсозатраность пиксельного освещение, оно позволяет применять некоторые эффекты, невозможные при вертексном освещении. Нормал-маппинг, лайт-куки и динамические тени доступны только при пиксельном освещении. Также при пиксельном режиме точечное и лучевое освещение рендерится лучше. В вертексном режиме, три описанных выше типа освещения при рендиренге будут выглядеть примерно следующим образом:

Точечный источник света в вертексном режиме освещения Лучевой источник света в вертексном режиме освещения. Направленный источник света в вертексном режиме освещения.

Режим освещения оказывает большое влияние на скорость рендеринга - поэтому приходится идти на компромисс между качественным освещением и быстродействием игры. Так как пиксельный режим освещения более ресурсозатратен, чем вертексный, Unity будет рендерить в пиксельном режиме только самые яркие источники света. Фактическое число источников света с пиксельным режимом можно указать в настройках качества для webplayer и standalone платформ.

Вы можете явно указать в каком режиме освещения должен рендерится источник света, выбрав соответствующий режим в свойстве Render Mode . По умолчанию Unity будет автоматически выбирать режим освещения, основываясь на количестве объектов, попавших под данный источник света.

Фактически, рендер в пиксельном освещении определяется от объекта к объекту.

Для получения дополнительной информации смотрите страницу оптимизация графической производительности.

Создание куки

Для получения дополнительной информации по созданию куки, пожалуйста, ознакомьтесь с руководством по созданию лайт-куки для лучевого источника света.

Карты теней и свойство Bias

Тени реализуются по технологии карт теней (shadow mapping). Для определения того, какая поверхность заслонена другой, камера использует аналогичную технологию, известную как карты глубины (depth mapping). Для создания карты глубины камера рендерит сцену от позиции источника света внутрь камеры. Карта глубины хранит расстояние до каждой поверхности, освещаемой источником света. Данный тип карт глубины известен как карта теней. После завершения рендеринга сцены для вида из камеры, позиция каждого пикселя данного вида преобразуется в позицию в световом пространстве. Таким образом расстояния можно сравнить при помощи соответствующего пикселя карты теней. Если пиксель более удален, чем пиксель карты теней, то он, возможно, заслонен от источника света другим объектом и не освящен.

Цилиндр с правильным затенением

Цилиндр с правильным затенением

Напрямую освященная поверхность иногда частично затеняется. Это происходит потому, что вычисленное расстояние, на котором находится пиксель, не соответствует точно определенному расстоянию в карте теней (использование изображения низкого разрешения для карты теней приводит к такому эффекту). В результате, пиксели оказываются затененными, хотя должны быть освещены. Данный визуальный эффект известен как “теневые прыщи (shadow acne)”.

Теневые прыщи в виде маленьких черных точек на цилиндре

Теневые прыщи в виде маленьких черных точек на цилиндре

Для предотвращения эффекта теневых прыщей можно добавить значение сдвига (bias value) к дистанции в карте теней. Это сделано для гарантии того, что пиксели на границы пройдут сравнение так, как должны. Это значение задается в свойстве Bias источника света со включенными тенями. Задать значение сдвига слишком большим будет ошибкой, т.к. затененные области вблизи объектов могут стать ошибочно освещенными. Этот эффект известен как “Питер Пэннинг” (из-за оторванности тени от объекта, объект выглядит парящим над землей, как Питер Пэн)

Питер Пэннинг заставляет объект выглядеть парящим над землей

Питер Пэннинг заставляет объект выглядеть парящим над землей

Значение сдвига для источника света нужно немного подогнать для гарантии того, что не появился эффект “теневых прыщей” или “Питера Пэннинга”. Как правило, проще определить “правильность” значения на глаз, чем попытаться вычислить его.

LMHPoly на своём сайте опубликовал статью 7 Tips for Better Lightning. Все советы для Unity 5.6 и выше.

1. Используйте Linear Color Space

Перед освещением проекта важно выбрать цветовое пространство. Предпочтительный Color Space для реалистичного рендеринга - Linear. Линейное освещение не поддерживается на ряде мобильных устройств и даже на некоторых игровых консолях. По умолчанию Unity использует Gamma Color Space. Чтобы изменить цветовое пространство, перейдите в Edit > Project Settings > Player. В Other Settings вы увидите Color Space, замените на Linear. Прочитайте подробнее о Gamma и Linear Color Space здесь.

Gamma VS Linear (Без постобработки)

Gamma VS Linear (С постобработкой)

2. Используйте Global Illumination.

Для более реалистичного результата используйте GI. Это система, которая моделирует отскоки света от поверхностей объектов на другие поверхности (Indirect Light), а не ограничивается только светом, который попадает на поверхность непосредственно из источника света. Подробнее о Global Illumination.

Чтобы включить Realtime Global Illumination, перейдите в Window > Lighting > Settings, появится окно Lighting. Откройте вкладку Scene и включите Realtime GI. Вы можете увеличить разрешение, изменив параметр Indirect Resolution.

Как Baked GI, так и Precomputed Realtime GI имеют ограничение: только у статичных объектов может быть indirect освещение, поэтому свет не будет отскакивать от движущихся объектов на статичные и наоборот. Тем не менее, они всё ещё могут отражать свет через Light Probes.

3. Color Harmony

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

Различные цвета могут резко изменить настроение сцены.

4. Используйте Light Colors

Используйте очень светлые цвета, но не используйте перенасыщенные. Светлые цвета намного приятней для глаз, а также выглядят более реалистично. Посмотрите видео Understand Colors ниже, в котором Andrew Price рассказывает про использование разного света, цветовой схемы и так далее.

5. Изменяйте направление света и тени, чтобы получить различные результаты.

6. Используйте Ambient Color для изменения цвета теней.

Вы можете получить неплохой результат, изменяя цвета теней.

Вы можете сделать это, перейдя в Window > Lighting > Settings, появится окно Lighting. В этом окне откройте вкладку Scene и поставьте Environment Lighting Source на Color. Теперь вы можете изменить Ambient Color на любой другой цвет.

7. Используйте пост-обработку изображения

Используя Post-Processing, вы можете мгновенно улучшить освещение сцены в целом. Результат Unity 5.6 представлен ниже. Я использовал бесплатный Post Processing Stack из Asset Store.

Читайте также: