Работа С Освещением В Unity – Теория И Практика

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

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

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



Работа с освещением в Unity – теория и практика

За последние пару лет мне пришлось много работать с картами освещения, как на работе, так и над собственным инди-проектом.

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

Теория освещения



Отраженный свет

Давайте определимся с терминологией.

Освещение в компьютерной графике делится, условно говоря, на две категории:

  • Прямое освещение.

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

  • Косвенное освещение.

    Лучи отражаются от поверхности, рассеиваются и образуют мягкий заполняющий свет.

Существует множество методов расчета отраженного освещения, два наиболее известных — это Global Illumination (GI) и Final Gather (FG).

Их можно использовать по отдельности, но вместе они дают особенно хорошие результаты.

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

Глобальное освещение (GI) — самый «честный» способ имитации отраженного света.

Источник света испускает фотоны — частицы, несущие информацию о цвете и яркости света.

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

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

Это происходит несколько раз в зависимости от настроек рендерера.

Финальный сбор (ФГ) раскидывает по сцене точки — финальные точки сбора — от которых лучи вылетают в разные стороны.

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

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

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

Он не такой «справедливый», как GI, но дает хорошие результаты и часто используется для заполнения сцен приятным мягким освещением.

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



Работа с освещением в Unity – теория и практика



Окружающая окклюзия

Помимо отраженного света нас интересует так называемый Окружающая окклюзия (АО).

Это эффект затемнения в углах, трещинах, узких проемах.

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

Чем дальше в угол, тем меньше света туда попадает. Обычно Ambient Occlusion используется для художественного подчеркивания эффекта затенения — в действительности лучи света не теряют энергию так быстро, что углы комнаты становятся такими темными, как нам показывают в играх.

Если вы визуализируете физическое освещение, ваш движок сам вычисляет скорость, с которой луч света теряет энергию, и вам не нужно отдельно визуализировать карту (текстуру) Ambient Occlusion. Но вы можете сделать это, если необходимо реализовать свое художественное видение.



Работа с освещением в Unity – теория и практика

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



Работа с освещением в Unity – теория и практика



Атласы текстур

Следующий термин, который вам следует знать, это текстура сатин .

Грубо говоря, это одна большая текстура, содержащая в себе несколько мелких текстур.

Чаще всего текстурные атласы создаются для экономии вычислительных ресурсов.

Приведу крайне упрощенный пример: специалисты, прячьте факелы и вилы! Допустим, в вашей игре есть таверна с 20 деревянными предметами (столами, стульями, ложками.

), каждый со своей текстурой.

В результате ЦП будет контактировать с графическим процессором 20 раз, что потребует рендеринга каждого объекта отдельно.

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

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

Потом много-много маленьких текстур разных объектов помещаются в большие текстурные атласы.

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

Работа с Юнити

Общая информация

Но вернемся к «мэппингу освещения» в самом Unity. Прежде всего наберитесь терпения и по возможности имейте мощный компьютер.

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

Таким образом, я возвращаюсь к компьютеру как раз в тот момент, когда рендеринг уже завершен.

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

Если вы видите, что потеряли 10 гигабайт места на системном диске, то это оно.

Для настройки кэша вам необходимо перейти по адресу: Изменить - Настройки - GI Cache .

Здесь вы можете указать, где он сохраняется и его максимальный размер.

Можно убрать компрессию, он будет «весить» больше, но работать быстрее.

Здесь вы можете очистить кеш, но имейте в виду, что если у вас открыта сцена с готовой «картой освещения», она также будет удалена, будьте осторожны.

В Unity доступно 5 типов источников света:

  • Направленный свет .

    Самый простой, имитирует солнечный свет. Он состоит из бесконечного числа лучей, параллельных друг другу.

  • Точечный свет .

    Точечный источник света, то есть лучи расходятся во все стороны от одной точки.

    Хорошим примером такого источника света может служить обычная лампочка.

  • Зона света .

    Источник света, имеющий площадь.

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

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

  • Окружающий свет .

    Заполняющий свет, не имеющий источника.

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

  • Световые зонды .

    Специальный источник света, воздействующий исключительно на динамические объекты.

    Технически это не источник света, но для простоты назовем его так.

В Unity все объекты разделены на динамичный (динамический) и статический (статический).

Статические объекты – это те, которые всегда стоят на месте и никуда не перемещаются.

Именно для них «запекается» освещение.

Динамические объекты – это те, которые, наоборот, находятся в движении.

Сюда входят такие элементы сцены, как герой, монстр, развевающийся флаг или камень, падающий со скалы.

«Lightmapping» для этих объектов не подходит; они освещаются либо источниками света реального времени, либо с помощью световых зондов, о которых я расскажу в конце статьи.



Параметры источника света

Хотелось бы обратить ваше внимание на ключевые настройки источников света (доступные настройки различаются в зависимости от типа источника света):
  • Выпечка .

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

    Для карт освещения установите значение «Запеченный».

  • Цвет .

    Собственно, цвет источника света.

  • Радиус .

    Параметр Point Light, отвечающий за то, как далеко летят лучи света.

  • Интенсивность .

    Просто яркость источника света.

  • Интенсивность отскока .

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

  • Тип тени .

    Определяет отображение теней.

    Советую использовать Soft Shadows, они дают красивые тени ценой увеличения времени рендеринга.

  • Угол запеченной тени .

    Доступно только для мягких теней.

    Представьте себе длинную тень.

    Чем дальше он удаляется от бросающего его объекта, тем размытее он становится.

    Если параметр установлен на «0», то тень практически не будет размыта.

    Если установлено значение больше «0», появится размытие.



Работа с освещением в Unity – теория и практика



Настройка освещения сцены

Окно настройки освещения сцены вызывается через Окно - Освещение и состоит из трех вкладок: Объект , Сцена , Карты освещения .

Чтобы начать рендеринг освещения, используйте кнопку «Создать» в самом низу окна.

Также имеется флажок «Авто», который автоматически запускает рендеринг каждый раз, когда вы вносите изменения в сцену; используйте его, если у вас мощный компьютер.

Еще ниже находится информация о количестве и размере «лайтмап», которая появится после завершения процесса «лайтмэппинга».



Раздел - Объект

В Объект отображаются настройки для конкретного объекта.

Если вы выберете элемент среды в своей сцене, вы увидите ряд настроек и опций.

При условии, что объект статический, будет установлен флажок Lightmap Static. Чаще всего здесь вы будете использовать поле Scale in Lightmap. Как я уже говорил ранее, для каждого объекта освещение «запекается» в отдельную небольшую текстуру, которая затем помещается в большой атлас «карты освещения».

С помощью параметра «Масштаб в Lightmap» вы можете настроить, сколько места будет занимать эта текстура.

Разумеется, чем меньше места под него отведено, тем хуже будет качество «вшитого» в него освещения.

По умолчанию здесь установлено значение «1», но если вы знаете, что объект редко будет находиться в поле зрения или находится далеко на заднем плане, вы можете смело уменьшить этот параметр до 0,1 или даже меньше.



Раздел - Сцена

В Сцена Здесь расположены ключевые настройки рендеринга освещения.

Я рассказываю об основах работы со светом, а также делюсь опытом «мэппинга освещения» специально для мобильных платформ, поэтому намеренно пропускаю такие вещи, как GI в реальном времени или использование HDR-текстуры в качестве источника света.

В Ambient Source вы настраиваете заполняющий свет Ambient Light, о котором я уже упоминал.

Вы можете выбирать между текстурным небом, одноцветным небом или небом, созданным из цветового градиента.

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

Ambient Intensity определяет яркость этого света.

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

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

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

Когда вы более-менее удовлетворены результатом, вы можете повысить качество рендеринга и включить Final Gather. Это займет много времени, поэтому имеет смысл включить этот рендеринг, прежде чем отойти от компьютера на относительно длительный период времени.

Настройки на вкладке «Запеченный GI» работают с такими единицами измерения, как тексел.

Если говорить проще, то тексел — это пиксель, но не на экране, а в текстурном пространстве трёхмерной модели.

Но не волнуйтесь — сложно сказать, как Unity обрабатывает текселы и как они зависят от масштаба объектов, поэтому просто экспериментируйте.

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

Пиксельная текстура.

Проще всего объяснить значение термина «тексел» на примере трехмерных игр.

Если вы подойдете близко к стене в какой-нибудь старой 3D-игре (Wolfenstein или Duke Nukem), вы увидите, как текстура стены распадается на одноцветные квадраты, которые увеличиваются в размерах по мере вашего приближения и снова собираются в осмысленный узор.

как вы уходите.

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

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

Источник.

Ниже я расскажу о каждом параметре отдельно, но перед этим нужно знать еще кое-что.

Если запустить рендерер освещения в Unity, то справа внизу будет написано, что именно движок делает в данный момент. В самом конце процесса рендеринга будет написано «Композитинг».

Дело в том, что «карта освещения» генерируется слой за слоем.

Во время рендеринга создается несколько отдельных текстур.

Я не знаю, какие карты делает Unity, но среди них есть либо все, либо часть списка: Diffuse (прямой свет), GI (Global Illumination), FG (Final Gather), AO (Ambient Occlusion) и другие.

.

После этого движок берет эти карты и объединяет их друг с другом.

Например, базой может быть слой Diffuse, над ним размещается слой FG в режиме наложения Lighten (так же, как в Photoshop), а над ним — слой AO в режиме Multiply. В результате получаются вот такие слои объединяются в одно изображение, и конечным результатом является «карта освещения».



Вкладка – Запеченный GI

  • Запеченное разрешение .

    Этот параметр можно считать общим качеством «карты освещения», также известной как Diffuse, о которой я говорил в последнем абзаце.

    Чем выше вы его установите, тем четче будет изображение.

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

    В целом важно найти баланс между качеством «запекания» и временем рендера.

  • Запеченная подкладка .

    Расстояние между отдельными текстурами на общем атласе.

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

    В своей игре я обычно ставлю от 1 до 3.

  • Сжатый .

    Почти всегда здесь будет стоять галочка, и Unity будет сжимать атласы «lightmap».

    В несжатом состоянии они «весят» неприличную сумму.

  • Косвенное разрешение .

    Этот параметр можно рассматривать как качество или детализацию слоев GI, FG и, возможно, AO. Здесь нет смысла ставить большую цифру, разницы вы не увидите.

    Например, если в Baked Solution вы ставите 40, то в Indirect можно смело ставить в районе 3-8.

  • Окружающая окклюзия .

    Как я уже писал в самом начале статьи, АО затеняется в разного рода углах и трещинах из-за потери энергии лучом света.

    Этот параметр регулирует скорость потери энергии.

    Чем выше значение, тем темнее будет АО.

    Напомню, АО – это художественный прием, который на самом деле не имеет ничего общего с физически правильным освещением.

  • Макс.

    расстояние .

    По сути, это просто расстояние затемнения для Ambient Occlusion. Если взять в качестве примера угол комнаты, то при высоком Max Distance затемнение начнется очень рано, а при низком Max Distance затемнение будет только в самой-самой глубине угла.

  • Финальный сбор .

    Включает метод отраженного света, описанный в начале статьи.

    По умолчанию рендерится только GI, здесь вы также включаете FG. Нигде нет настроек количества точек, которые ФГ разбрасывает по сцене.

    Я предполагаю, что это как-то зависит от косвенного разрешения.

  • Рэй Граф .

    Количество лучей, излучаемых каждой точкой переднего плана.

    Скорее всего, вашим глазам будет достаточно 32 или 64 лучей.



Вкладка – Общие ГИ

Пройдемся по интересующим нас настройкам во вкладке General GI:
  • Направленный режим .

    Очень специфический параметр, который «запекает» второй атлас для каждой «карты освещения».

    Типичная карта освещения — это простая текстура, которая затем размещается поверх ваших объектов, имитируя их освещение.

    Второй атлас, названный Направленным, содержит информацию о направлении движения световых лучей.

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

    В противном случае рекомендуется брать Non Directional.

  • Косвенная интенсивность .

    Можно сказать, что это яркость слоев при непрямом освещении, в частности ФГ.

    Ранее я уже говорил вам, что «карта освещения» на самом деле состоит из слоев, наложенных друг на друга.

  • Усиление отскока .

    Регулирует яркость отраженных фотонов, информация о которых содержится в слое GI.

  • Размер Атласа .

    Здесь вы можете указать размер текстурных атласов с «запеченным» освещением.

    Если вы делаете игру для мобильных устройств прямиком из 19 века, то имеет смысл поставить 1024, так как текстуры 2048 не поддерживаются очень старыми устройствами.

    В противном случае рекомендую установить 2048; почти все устройства последних лет его поддерживают. Как вы понимаете, чем меньше размер одного атласа, тем больше вам придется изготовить.

    Если вы знакомы с термином Draw Call, то вам не составит труда предсказать, что увеличение количества атласов приведет к снижению производительности.

    Поэтому, если у вас нет особых требований, попробуйте выполнить рендеринг в 2048 году.



Вкладка - Туман

И наконец, туман! Туман, то есть.

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

Позвольте мне только сказать, что туман — чрезвычайно мощное художественное средство.

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

Кроме того, туман можно использовать как инструмент повышения производительности.

Например, вы хотите отключить текстуры всех объектов на расстоянии и скрыть их за туманом.

В старых версиях World of Warcraft, если вы играли, вы не могли не заметить, насколько густым был туман.



Раздел - Лайтмапы

Третий раздел Карты освещения , где будут расположены визуализированные «карты освещения».

При этом, если атласов много, вы не сможете увидеть все атласы вверху вкладки; прокрутка в этом окне неактивна.

Поэтому смотрим вниз и листаем колесиком мыши.

Здесь нам важно увидеть, насколько заполнен последний, самый нижний «лайтмап» атласа.

Если он почти пуст, то мы либо увеличиваем качество лайтмапы, чтобы заполнить весь атлас, либо уменьшаем его, чтобы атлас опустел и удалился.

На картинке ниже показаны два хорошо заполненных атласа, и один — постольку.

«Лайтмапы» хранятся в файлах EXR глубиной 32 бита.



Работа с освещением в Unity – теория и практика



Световые зонды

Я также обещал рассказать вам о Световые зонды .

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

Когда таких сфер много, они создают своеобразную карту освещения вашего уровня или локации.

Затем они используются для освещения динамических объектов, в которые не встроен свет. Чтобы лучше понять их смысл, приведу пример.

На вашей сцене есть один Point Light, у которого есть настройки Baked, то есть он используется для «запекания» света.

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

Затем вы создаете «световую карту» сцены и видите, что ваш точечный свет освещает окружающую среду.

Но если вы возьмете монстра и поместите его рядом с источником света, он останется темным, поскольку относится к классу динамических объектов, а ваш Point Light влияет только на статические.

Теперь вы размещаете сетку световых зондов вокруг источника света и снова запекаете освещение.

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

Чтобы добавить «тесты» на сцену, перейдите в раздел Игровой объект — Свет — Группа световых зондов .

На сцене появится куб из четырех сфер.

Чтобы выбрать отдельные сферы, используйте Ctrl + щелчок.

В Инспекторе появится несколько кнопок, позволяющих добавлять или удалять сферы.

Вы также можете использовать комбинацию Ctrl + D, чтобы дублировать сферы.

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

Чтобы избежать графических артефактов и мерцающего света, убедитесь, что световые зонды образуют гладкую красивую сетку.

Ниже скриншот правильно настроенной сетки.

Если присмотреться, то можно заметить, что Световые Зонды расставлены не в случайном порядке, а окружают источники света, стараясь эффективно уловить переход от света к тени и обратно.



Работа с освещением в Unity – теория и практика



Заключение

Напоследок хотелось бы дать совет по созданию моделей окружающей среды для светового картографирования.

Создавая контент для игры, я знал, с какой стороны будет смотреть игровая камера, поэтому ради сомнительной оптимизации удалил задние стенки некоторых объектов.

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

Иметь ввиду.



Полезные и интересные ссылки

  • Объяснение физически корректные системы освещения и рендеринга, написанные для 3D-художников.

  • Если вы хотите узнать больше о вызовах отрисовки и оптимизации графики, есть отличный материал, предназначенный для непрограммистов — рендеринг ада 2.0 .

  • На сайте Unity есть кое-что хорошее.

    описание их системы освещения, местами перекликаются с моим материалом.

  • В этом маленьком примечание На примере Diablo III мы демонстрируем, как разработчик ААА-игр использует тот же прием — существенно меняя атмосферу уровней одним лишь освещением, не меняя при этом графику окружения.

Теги: #освещение #освещение #gamedev #игры #инди #Разработка игр #Разработка мобильных приложений #Разработка игр #unity
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.