Как сделать темноту в unity

Добавил пользователь Владимир З.
Обновлено: 05.10.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 после чего он добавится к компонентам игрового объекта.

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

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

tonemapping

Для имитации этого эффекта в играх используется механизм, называемый tonemapping.

tonemapping – процесс проекции всего бесконечного интервала яркостей (HDR, high dynamic range, от 0 и до бесконечности) на конечный интервал восприятия глаза/камеры/монитора (LDR, low dynamic range, ограничен с обоих сторон).

Для того, чтобы работать с HDR, нам понадобится соответствующий экранный буфер, поддерживающий значения больше единицы. Наша же задача будет состоять в правильной конвертации этих значений в диапазон [0..1].

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

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

Ужмем нашу картинку до ближайшего квадрата со стороной, равной степени двойки и обесцветим ее. Затем будем каждый раз сжимать ее вдвое, пока не останется один пиксель:

Downsampling

Для сжатия картинки, будем брать четыре соседних пикселя и выбирать из них средний (для нашего случая – вместо него максимальный). Для ускоренного вычисления среднего геометрического воспользуемся формулой:

Формула


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

На каждом шаге уменьшения в нашей текстуре хранится минимальное ( R ), максимальное ( G ) и среднелогарифмическое ( B ) значение яркости.

AdaptationCoefficient — коэффициент порядка 0.005, который определяет скорость адаптации к яркости.

Здесь мы восстанавливаем значение яркости из логарифма, вычисляем коэффициент масштабирования (scaled), и делаем поправку на уровень белого (_White).

Статья опубликована с согласием автора Евгения Панькова.
Источник: Блог Евгения Панькова

Сегодня в выпуске — рассказ 3D-художника Киммо Каунела о своей работе с физически обоснованным рендерингом в Unity 5. Автор даёт несколько полезных советов по оптимизации сцен в играх.

Я 3D-художник и живу в Финляндии. Сейчас я работаю в студии Rammin Speed и являюсь частью талантливой команды, работающей над проектом мобильной игры, — отвечаю за вовлечение игроков и общий визуальный стиль. Это работа моей мечты, и этот проект по-настоящему вдохновляет меня.





Я играл в игры почти всю жизнь, и счастлив быть частью этой индустрии. Поскольку я художник-самоучка, то стараюсь быть в курсе новых технологий, во многом из-за этого я и решил заняться Zero Gravity. 3D-графика сочетает в себе красивую визуализацию и технические препятствия, которые нужно каким-то образом преодолевать, и мне всё это очень нравится.

Меня радует, что моя работа получила хорошие отзывы и принесла пользу некоторым начинающим художникам. Это был очень интересный проект, и я бы хотел продолжить работу над ним.

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

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

О Marmoset Toolbag 2


Начав работать над этим проектом, я занялся изучением физически обоснованного рендеринга. В то время Marmoset Toolbag 2 был для этого лучшим инструментом. Я видел его потенциал, но мне хотелось самому проверить, чего я смогу добиться с его помощью. Этот инструмент отлично подходил для простых моделей, но никто до меня не использовал его для создания окружения.

Я до сих пор использую его для тестирования своих моделей и текстур. Это действительно быстрый и простой в использовании инструмент, который в реальном времени выдаёт результаты, сравнимые с офлайновым рендерингом.

О физически обоснованном рендеринге





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

Многие думают, что физически обоснованный рендеринг можно использовать только для создания фотореалистичный графики, но это не так. Просто намного проще полагаться на физические величины. Это не исключает художественный стиль, но позволяет получать более реалистичные и последовательные результаты. Чем больше созданные вами модели напоминают реальный мир, тем лучше они вовлекают пользователей, а это очень важно для игр и кинофильмов. В качестве примера можно привести студию Pixar с их удивительным пакетом программ RenderMan.


Сейчас физически обоснованный рендеринг поддерживают такие движки, как Unreal Engine 4, CryEngine 3.6 и Unity 5. PBR обеспечивает более качественную графику и, как показывает мой опыт, иногда позволяет работать быстрее по сравнению со старым подходом к шейдингу и текстурированию

Один из ключевых элементов, позволяющих получить красивую графику, — это правильное освещение. Но его расчёт в реальном времени — дорогое удовольствие. Решить эту проблему помогает IBL — Image Based Lighting, освещение, основанное на изображении. Это один из элементов концепции PBR. Смоделировать правильное естественное освещение очень трудно, а IBL позволяет это сделать намного проще.

Ещё одно преимущество PBS (физически обоснованного шейдинга) — то, что он позволяет более точно представить материал. Металл выглядит как настоящий металл, а кроме того, вы можете использовать один и тот же шейдер для многих объектов. До того, как появился PBS, нам приходилось создавать огромное количество шейдеров для разных объектов.

Я привёл всего несколько примеров того, как физически обоснованный рендеринг помогает улучшить графику. Было бы здорово посмотреть, как эта технология работает на мобильных устройствах. PBR требует определённой мощности, и некоторые мобильные устройства пока к этому не готовы.

Работа с Unity 5


Когда я завершил сцену Zero Gravity в Marmoset Toolbag 2, мне захотелось протестировать визуальные возможности Unity 4.6, и я решил построить в нём ту же сцену. Довольно скоро я понял, что это невозможно. Я старался как мог, но, в конце концов получилась обычная сцена из Unity 4. Так случилось потому, что мне нужны были сложные шейдеры и освещение, чтобы повторить результат визуализации, полученный в Toolbag 2.

Я с нетерпением ждал появления Unity 5, потому что знал, что этот движок будет поддерживать PBR и сможет понимать тот язык, который я использовал в Toolbag 2. И действительно, с Unity 5 не было никаких проблем. Я просто импортировал туда свои модели и за несколько часов получил красивый результат. Новая система освещения сделала свою работу замечательно, после того как я разместил в сцене Light probe (зонды освещения) и Reflection probe (зонды отражения). Особенно впечатлила новая система освещения (GI) в реальном времени.

Я использовал те же текстуры, что и в Marmoset Toolbag 2. Всё, что мне пришлось сделать, — это добавить к моделям коллайдеры и контроллер для камеры, и можно было нажимать на кнопку play. За несколько дней я сделал всё, что нужно, со всеми деталями и дополнительными эффектами. Это был настоящий прорыв по сравнению со старой версией Unity.

Unity 5 поддерживает рабочие потоки Spec/Gloss и Metalness/Roughness подходы к шейдингу, так что вы можете выбрать то, что вам лучше подходит. Визуальное качество просто отличное, и эти сцены идут неплохо даже на моём шестилетнем стареньком компьютере. Именно поэтому я считаю Unity 5 огромным шагом вперёд.

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

Система освещения в Unity 5


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

Light probe'ы и Reflection probe позволяют работать с довольно сложными сценами. Технология глобального освещения добавляет реалистичности. Ещё один интересный момент: в новой системе Unity сама рассчитывает фоновое освещение, пока вы делаете свою работу.

Инструменты оптимизации в Unity 5


Я создал много объектов для мобильных игр, поэтому стараюсь оптимизировать всё, что только можно. Мне хочется создать сцену, которая будет работать не только на персональном компьютере, но и на менее мощных устройствах и даже с виртуальной реальностью. На конечную производительность влияет множество мелочей, но есть некоторые вещи, которые я считаю полезными для оптимизации сцен в Unity.

Одна из таких вещей — постараться по возможности организовать модульную работу. То, что сцена Zero Gravity составлена из многих частей, позволяет поддерживать хорошую производительность. Если вы будете использовать одинаковые модели и материалы, движок сможет использовать батчинг и за счёт этого разгрузить центральный процессор. Конечно, уникальные детали тоже нужны, поэтому конечный результат представляет собой комбинацию модульных и уникальных частей.

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

  • Первый слой — структурный (пол, крыша, стены), поверх него будет лежать средний слой.
  • Средний слой (панели для стен, двери, мебель) должен иметь больше деталей, чем структурный слой, потому что его игрок будет больше рассматривать.
  • Верхний слой должен быть самым проработанным из всех. Этот слой содержит те предметы, которые игрок будет видеть очень близко и с которыми будет взаимодействовать.

Ещё одна вещь, о которой нельзя забывать, — это текстурные разрешения. В моей системе было всего 512 Мбайт видеопамяти, и я старался не превышать этот предел. Чтобы всё гладко работало, лучше заранее планировать работу с текстурами. Сходные элементы в моделях могут занимать одно и то же текстурное пространство, а также несколько моделей могут использовать одинаковые текстуры.

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

Для хорошей производительности идеально подходят повторяющиеся (tiling) текстуры, поэтому по возможности используйте их чаще.


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

Несколько предложений для будущих версий Unity 5

Unity 5 — это действительно большой шаг вперёд во многих отношениях. Мне очень нравится, что все визуальные эффекты и профайлер можно использовать даже в бесплатной версии, хотя раньше они были доступны только в версии PRO. Это делает Unity очень интересным и конкурентоспособным движком.

Я мало что понимаю в программировании шейдеров, поэтому мне бы хотелось иметь в Unity 5 какой-нибудь визуальный редактор, позволяющий создавать простые шейдеры или скрипты, как в UE4. К счастью, в Unity Asset Store есть такие инструменты, но всё же было бы хорошо, если бы они были по умолчанию встроены в Unity 5.

Эффекты частиц — это то, что тоже хорошо бы усовершенствовать в Unity. Во всём остальном Unity 5 — отличный движок для самых разных платформ.

Если вы работаете на технологии Unity, хотите рассказать о своём опыте разработки или задать вопрос экспертам — оставьте заявку нашим менторам с помощью специальной формы.


В этом посте мы рассмотрим как можно применить подход Двигателя на Тёмной Материи для создания бесконечного 2D фона.

Если вы сталкивались с мобильными играми в общественном транспорте, то наверняка могли заметить, что одними из самых популярных в поездке являются игры жанра Endless runner, например, Subway Surfers, а для любителей археологии примером может послужить Электроника ИМ23 “Автослалом”. Основным признаком данного жанра является бесконечно перемещающийся элемента(персонаж или другой объект), который обычно самостоятельно движется вперёд навстречу препятствиям, а управление даётся только для возможности эти препятствия избегать. Бесконечное перемещение подразумевает бесконечное пространство доступное для движения игрока, создание которых является не самой простой задачей, как могло бы показаться на первый взгляд. Этим постом мы открываем цикл, в котором рассмотрим элементы, которые помогут создать такие бесконечные, в каком-то смысле, миры.

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

Проблематика

Первым что приходит в голову, когда вас просят сделать корабль, который перемещается в пространстве, это добавить модель корабля, задать ему вектор скорости, привязать к нему камеру, подложить фон и начать сдвигать корабль вдоль вектора, помноженного на Time.deltaTime . Если откинуть очевидные вещи с ограниченными размерами фона, которые в любом случае придётся решать, главной проблемой бесконечного перемещения окажется координатное пространство Unity, которое привязано к переменным типа float и с увеличением координат точность будет падать. Для более точного описания проблемы вы можете посмотреть вот это видео "64 Bit In Kerbal Space Program".

Dark Matter Engine

Для решения данного вопроса можно использовать подход, с помощью которого работает Двигатель на Тёмной Материи из “Футурамы”. Если коротко описать принцип его действия, то двигатель двигает не корабль, а пространство вокруг корабля. То есть, в нашем случае вместо того чтобы двигать вдоль вектора скорости наш корабль мы будем двигать все объекты вокруг него в противоположном направлении. Таким образом, если наша камера привязана к кораблю, то мы всегда будем оставаться в точке начала координат и наша точность не будет падать из-за увеличения расстояния. Да и в целом для решения вопроса с бесконечным перемещением, выбрать началом координат наше положение выглядит более красивым решением, нежели привязываться к какой-либо другой точке в пространстве.

Задача

Сделать перемещение космического корабля вдоль бесконечного 2D фона. Корабль можно поворачивать вокруг оси Z при помощи клика по правой/левой стороне экрана. Камера всегда будет сонаправлена с вектором движения корабля.

Решение

Я не буду распространять ассеты, которые используются для примера. Найти подходящие вам ресурсы это тоже большая работа и я предлагаю вам в этом потренироваться, если не знаете с чего начать, то можно посетить бесплатный itch.io или поискать в интернете "Free game assets" .

Нам понадобится текстура для корабля и текстура для фона. Основное требование к фону будет его зацикленность как в вертикальном, так и в горизонтальном направлении.

  1. Добавьте в проект текстуры корабля и фона, для фона необходимо выставить Mesh type - Full rect и Wrap mode - Repeat
  2. Создайте структуру объектов такого содержания
  3. Добавьте текстуру для корабля
  4. Добавьте текстуру для фона, выставите Draw mode - Tiled и Order in Layer = -1
  5. Создайте скрипт UniverseHandler, добавьте его к объекту Universe

Результат

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

Альтернативные решения

Программирование - это такая область, в которой в целом нет абсолютно правильных решений, перед программистом при решении практически любой задачи открывается довольно большой выбор методов, при помощи которых будут выполняться поставленные условия. В данном случае также можно поступить несколькими способами. Например, можно вместо спрайта сделать объект типа quad и настроив материал, который также использует тайловую структуру управлять её смещением, что избавит нас от перемещения объекта совсем. Если же вернуться к более классическому варианту, то можно скомбинировать обычное перемещение объекта и сдвиг центра координат для всей сцены сразу, по достижению каких-либо пределов.

Заключение

Когда мы задумываемся о создании бесконечных пространств подход Двигателя на Тёмной Материи является основным средством обхода ограничений точности для Unity. Совмещённый с обычными передвижениями сдвиг центра координат тоже можно отнести в эту же группу. Приведённый же пример прекрасно подходит для создания фонов и эффекта параллакса. Однако, работа с более сложными объектами требует иных подходов и для создания реальных неограниченных пространств необходимо ввести множество других механик. Эти вопросы мы рассмотрим в следующих статьях цикла про бесконечные миры. Пока! =)

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