Search Unity

REALTIME GLOBAL ILLUMINATION ДЛЯ ДЕСКТОПОВ И КОНСОЛЕЙ

, 5 ноября, 2015

Мы вновь объединяем усилия с Алексом Лаветтом, автором Shrine Arch-viz! Наш новый совместный проект — The Courtyard, цель которого — показать работу компонента Precomputed Realtime GI, добавленного в Unity с выходом версии 5.x, с высокой частотой кадров. Посмотрите видео:

Алекс создал сборку The Courtyard, по которой был снят этот ролик, за восемь недель. В ней используются только ресурсы, входящие в набор Unity 5.2 по умолчанию, без обращения к Asset Store.

В этой сцене нет запеченного света

Всё освещение, присутствующее в показанной сцене, обрабатывается в реальном времени с помощью Precomputed Realtime GI. The Courtyard использует полный цикл смены дня и ночи, геометрические источники света, около сотни анимированных прожекторов, которые зажигаются ночью, а также несколько «заливающих» прожекторов и фонарик, прикрепленный к камере. Цикл дня и ночи использует анимированный скайбокс, синхронизированный с движением солнца. В доступную для загрузки версию был добавлен пользовательский интерфейс, с помощью которого можно управлять различными элементами освещения. Вот несколько снимков, сделанных в разное время суток:

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

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

Разработка уровней с применением Realtime GI

Демо The Courtyard было создано для настольных ПК и приставок. В этой статье описано приложение Transporter, предназначенное для мобильных платформ.

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

Быстродействие зависит от разрешения, выбранного для карт непрямого освещения реального времени. Разрешение, выбранное Алексом, позволяет добиться достаточно высокого качества освещения — в том числе и на участках, освещаемых отраженным светом — при сохранении быстродействия.

The Courtyard использует следующие разрешения для карты непрямого освещения:

  • Один тексель на две единицы (0,5 на единицу) в центральном участке.
  • Один тексель на 10 единиц в дюнах вокруг центра.
  • Один тексель на 32 единицы в дюнах, далеких от центра.

Средний показатель разрешения составил 0,25 текселей на единицу.

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

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

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

use_normals_4_texels_ptx

Карта освещения реального времени этого участка лестницы изначально занимала 70×72 текселя: каждая ступенька — участок 4×4, и каждый скошенный угол — ещё один участок, как минимум 4×4. Казалось бы, каждый участок мог бы занимать всего 1 тексель, однако Enlighten оптимизирован для обработки блоков по 2×2 текселя. Кроме того, Enlighten по умолчанию использует функцию «сшивания» участков для сглаживания округлых объектов, которая требует, чтобы каждый край участка имел направленность. При этом данные о направленности хранятся для каждого блока, поэтому сшиваемый участок должен состоять как минимум из 2×2 блоков — то есть 4×4 текселей.

Так как для лестницы сшивание не нужно, можно уменьшить участки до одного блока, то есть 2×2 текселей. С этой целью была введена возможность выбора минимального размера участка в разделе «Свойства»:

params - Copy

Доступные значения — 4 (для использования функции сшивания) или 2 (для компактности). После установки размера 2 карта освещения рассматриваемого участка лестницы уменьшилась до 44×46 текселей:

use_normals

Скошенные углы все ещё занимают собственные участки. Это неожиданно, так как в UV-развертке они интегрированы в ступеньку:

stairs_uv

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

stairs_uv4

Скошенные углы занимают отдельные участки потому, что UV-развертка, используемая для расчета освещения в реальном времени, каждый раз должна быть перестроена для актуального разрешения. Алгоритм перестройки использует границу в 0,5 текселя вокруг участков, чтобы избежать появления артефактов.

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

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

params

Включение этой возможности позволило интегрировать скошенные углы в ступеньки. Размер карты освещения уменьшился до 22×24:

final

2015-10-26_1555

Таким образом, время построения возможных путей прохождения света было снижено с полутора часов (70×72) до 15 минут (22×24).

О быстродействии

Список используемых в The Courtyard пост-эффектов достаточно велик: Filmic Vignette, Bloom, Tonemapping, Lens Distort, Screen Space Ambient Occlusion, Color Correction Curves, Noise And Grain, Color Grading Properties, Antialiasing. Несмотря на это, приложение работает с частотой 60 кадров в секунду на настольном компьютере с хорошей видеокартой. Realtime GI достаточно экономичен по отношению к аппаратной части, особенно с использованием ускоряющих возможностей:

Ускоренное освещение внешней среды

Система глобального освещения может напрямую использовать скайбокс для управления освещением внешней среды. Однако для этого нужно получать текстуры скайбокса от видеокарты, чтобы вносить изменения в освещение, управляемое центральным процессором. Из-за этого возникает замедление в тех случаях, когда внешнее освещение изменяется с каждым кадром — например, когда используется симуляция смены времени суток, как в The Courtyard. Решение — вычислять параметры освещения внешней среды в зависимости от времени, в виде градиента освещения и показателя интенсивности. Так выглядит участок панели управления, используемый для настройки внешнего освещения:

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

tod_1sec

Фрагмент кода, используемый для обновления параметров внешнего освещения:

[csharp]
using System;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

[ExecuteInEditMode]
public class EnvironmentUpdater : MonoBehaviour {

public Gradient groundGradient, equatorGradient, skyGradient;
private TimeOfDayManager m_TimeOfDayManager;

void OnEnable () {
m_TimeOfDayManager = FindObjectOfType<timeofdaymanager> ();
}

void Update () {
float currentTime = m_TimeOfDayManager.time;
RenderSettings.ambientGroundColor = groundGradient.Evaluate(currentTime);
RenderSettings.ambientEquatorColor = equatorGradient.Evaluate(currentTime);
RenderSettings.ambientSkyColor = skyGradient.Evaluate(currentTime);
}
}
[/csharp]

Здесь используется TimeOfDayManager для управления циклом дня и ночи. Интерфейс The Courtyard позволяет настраивать этот компонент.

Ускоренное освещение от объектов-источников света

Карта освещения для объектов-источников света составляется с учетом светимости материалов, для чего также требуется получение текстур от видеокарты. Для того, чтобы снизить нагрузку на видеопроцессор, можно использовать привязку светимости к объекту в качестве фиксированного цвета (DynamicGI.SetEmissive). В таком случае Realtime GI полностью обрабатывает светимость объектов внутри симуляции глобального освещения, выполняемой с помощью ЦП, и не загружает видеопроцессор:

emissive

Для больших миров

Карта The Courtyard невелика, и поэтому возникает вопрос: как масштабируется Realtime GI?

Один из способов достижения требуемого отлика системы освещения и рационального использования оперативной памяти — разделение большого мира на несколько частей, которые загружаются и выгружаются по мере передвижения игрока по карте. Для этого используются компоненты LoadLevelAdditive и UnloadLevel. Следует с осторожностью использовать выгрузку уровней, так как геометрия соседнего уровня может влиять на отраженный свет. Мы собираемся добавить возможность «гашения» отраженного света между уровнями, чтобы избежать внезапного изменения освещения. Мы также собираемся добавить систему настройки приоритетов обновления для различных участков внутри уровня.

Система подгрузки-выгрузки уровней, а также компонент Multi-Scene Editing, который станет доступен с выходом Unity 5.3 (8 декабря), позволят разработчикам создавать миры любого размера, великолепно освещенные с помощью Realtime GI.

Где скачать The Courtyard?

Доступны собранные версии для OSX, Win64 и Linux. Кроме того, проект доступен в Asset Store. Требуется Unity 5.2.2p2 либо более поздние версии. Управление описано в приложенном файле.

Мы запускали The Courtyard на настольном компьютере с ЦП Intel i7-4790 3.6GHz, 16GB ОЗУ, видеокартой NVIDIA GeForce GTX 780 и установленной ОС Windows 10.

В разработке участвовали

Alex Lovett (@heliosdoublesix): написание большей части кода, дизайн уровня, дизайн освещения, анимация, режиссерская работа, неоценимый вклад в тестирование системы глобального освещения для Unity.

Thomas Pasieka и Plamen «Paco» Tamnev: трехмерные модели.

Music Mark: музыка для демо-ролика.

Dave Dexter: внутриигровая музыка.

Silvia Rasheva: продюсер.

Morgan McGuire: исправление отражений.

Jesper Mortensen, Kuba Cupisz, Kasper Storm Engelstoft: поддержка разработки.

Plamen «Paco» Tamnev: различные исправления в последнюю минуту.

48 replies on “REALTIME GLOBAL ILLUMINATION ДЛЯ ДЕСКТОПОВ И КОНСОЛЕЙ”

So you needed 4 Level Designers/Artists and 3 Programmers (graphics engineers of Unity) to create this rather small scene (visually) that has no meaningful gameplay?
That doesn’t sound like Enlighten is a viable solution for small indie teams and mobile development.

[…] แหล่งที่มา http://blogs.unity3d.com/2015/11/05/awesome-realtime-gi-on-desktops-and-consoles/ […]

I’m facing a problem with the Win x64 download. I’ve redownloaded it three times and always face the same error — the .zip is invalid, or empty. I’ve tried with both Windows and 7zip. Neither can extract them.

Was having the same issue, the archive was corrupted and after repairing the game ran with geometry, ui and gi correct — though materials all had strange artifacts. Anyway, alternative download worked for me.

[…] สำหรับบท 2 นี้ก็หมดเพียงเท่านี้แล้วละจ้า หากใครไม่เข้าใจ หรือสงสัยตรงไหนสามารถเข้าไปอ่านเพิ่มเติมได้ที่นี่นะจ๊ะ (T^T) […]

The desktop pc demo crashes for me a few seconds after the «Made with Unity» logo disappears. This is on a Windows7-64 Ultimate system with 6Gb RAM with GeForce GTS 250 and nVidia driver 341.92 . Let me know if you need more details.

Hi,

I can’t find «Ignore Normals» and «Min Chart Size» in Object properties of the lighting panel in 5.2x. Is this a feature of 5.3 to be released?

[…] [31] Mortensen, J., “Awesome Realtime GI on Desktops and Consoles”, Unity Technologies featuring Geomerics Enlighten. Available Online. […]

Nice demo and cool to see a realtime version of it as well. However I found some issues. There are a few stairs where you can walk under the structure into a small room. One of the room illustrates some lighting leaks, where a blue light is cast in the room, while there is no source of light. Also the hotkey ‘K’ should make a screenshot. While Unity hangs to create one, there is not actual .png created as all.
Also I saw that there are props all over the place, but they do not appear in the reflection of the water.

Would be cool to have these issues being fixed.

Fixes for mixed mode lighting are ready and in the queue, which mean they will go into the Unity 5.4 alpha. If no issues are found, we can backport the fixes to 5.3.

On my machine (iMac running OS X 10.10), the demo takes a while to load, performs like crap for about 3 frames, and then crashes. I’ll be honest, this does not inspire confidence.

It’s not the lighting that is precomputed. It’s information about how light *would* bounce from one surface to another, from all possible angles, throughout all the static objects in the scene.

The scene would still be pitch black if there were no realtime lights present, because there’s no actual light data baked.

However when you introduce a realtime light into the scene at runtime, at any position or rotation, it automatically knows from the pre-computed data where the bounced light would end up. And if you move it, rotate it, or change the colour or intensity of the light, the indirect illumination automatically matches. And as demonstrated, it’s fast enough to have a lot of animated lights running at the same time.

By definition, precomputation of lighting is not «realtime» lighting….

«The realtime GI system works by precomputing all of the paths that light takes….» from your own description.

In the Editor it does say Precomputed Realtime GI though, maybe the spelling was not perfect that time… Anyway, I hope you didn’t expect realtime GI ‘by definition’ ;)

Comments are closed.