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: различные исправления в последнюю минуту.

Комментарии закрыты.

  1. 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.

    1. The lighting treatment took next to no time. What took time was authoring the geometry, textures, effects and sound. We did everything from scratch in order to be able to give this project out to users for free via the asset store.

  2. Thats pretty amazing!! :)

  3. Is my computer or is this blog entry incorrect? I can’t see anything except for a repeating screen capture.

    1. The page takes some time to load. Give it a moment.

  4. Is this page corrupted? I can only see 4 screenshots.

    1. Alright. Now I can read it. Took some time to load correctly though.

  5. Can i use the demo on a school project? I’ll put your names in credits.

    1. You can use the demo for pretty much anything you like ;-)

  6. 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.

    1. Hmm, I just tried. It downloads and unzips fine here. We used 7zip to zip it. Try this alternate location: https://goo.gl/1TPxjd

    2. 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.

  7. 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.

  8. For me this demo doesn’t work. I see only a lot of pink color on the screen which I presume is a missing shader?

    1. Is it the executable or the project? If it is the project please try using 5.2.2p2 or above: http://unity3d.com/unity/qa/patch-releases

      1. It is the executable. I will check out the project today.

      2. The project works as expected. Do you have any idea why executable renders in pink?

        1. I’ve downloaded executable again and it’s working now.

  9. 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?

    1. You need Unity 5.2.2p2, it’s available on the download page under patch releases: http://unity3d.com/unity/qa/patch-releases

      1. Thanks, got it!

  10. 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.

    1. Thanks for the heads up!

  11. Amazing work!

  12. Tesseract did this 5 years earlier, with much higher quality: http://tesseract.gg/

    And it’s open-source for everyone to try and modify.

    1. Enlighten is a general lighting SDK and has been in development since 2004. It runs on pretty much any platform including mobile. But yes, Tesseract looks like a nice game.

    2. Thanks for the info! I’ll go check it out. Although I do think you’re comparing apples and oranges here.

  13. Any ETA on mixed mode lighting working in U5 ? Full realtime or full precomp is pretty limited.

    1. 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.

  14. 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.

    1. Sorry to hear that. We’ve mainly been testing on Macbook Pro. Will see if we can source an iMac for testing this.

      1. you surely can, but if you test on a recent model it will preform just fine
        problem is with older models which are still capable of running latest OS but on which the demo is unusable
        older means ~ 4-5 and more yrs old which can still run latest OS just fine …

      2. On the macbook pro — Did you test it on Mac OS X or Windows bootcamp?

  15. where is the demo?

    1. Check out the section titled «How do I get this demo?»

  16. How can we precompute lighting in a scene that requires both static GI and precomputed GI?

    1. Whether lighting ends up in a baked lightmap (static in the player) or in a realtime lightmap is a property on an emitter. That can be a light source, emissive geometry or the sky lighting. So you can easily mix baked and precomputed realtime GI, the shader will take care of reading from both lightmaps for a given pixel.

      An example of this could be a street scene where all the streetlights are baked and the traffic lights and car headlights use precomputed realtime GI lights.

      A light is using precomputed realtime GI if it is set to «Realtime» and its «Bounce Intensity» is non-zero. Emissive materials and the sky has toggles for realtime vs. baked too.

  17. 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.

  18. 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.

    1. 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’ ;)

    2. @Rich — see my post. (tried but failed to make it reply to you :)

    3. The lighting is not precomputed. The paths the light could take are, but the actual lighting itself is not.

    4. High quality indirect lighting in scenes undergoing unstructured motion/deformations at realtime framerates on a significant slice of the hardware in the wild *is* an unsolved problem. We have solved part of the problem by assuming that portions of the geometry will stay static and allowing the lights/materials/environment lighting to be fully dynamic. Dynamic objects will receive full realtime GI lighting but they will not participate in this simulation. This means for many game scenarios realtime GI will be possible.

      We are working on Enlighten features that will allow some pre-authored destruction. This will allow for having dynamic portals/doors that let bounced lighting through when they open in the game.

      We are also experimenting on tech that will do realtime GI in fully dynamic environments in order to support procedural worlds and the like.

      The future will be brightly lit;-)

      1. «We are also experimenting on tech that will do realtime GI in fully dynamic environments in order to support procedural worlds and the like.»

        This is of the highest interest to me and our team for our game Solitude. Fingers crossed for your experiments to progress well =).

      2. «We are also experimenting on tech that will do realtime GI in fully dynamic environments in order to support procedural worlds and the like.»

        You guys really need to outshine Unreal in the lighting department, it’s one of the few features they can still tout as superior to Unity’s system. Iteration in Unreal’s lighting workflow is far, far faster than in Unity’s, and that needs to be resolved ASAP.

      3. Hello Jesper,

        “We are also experimenting on tech that will do realtime GI in fully dynamic environments in order to support procedural worlds and the like.

        We have a game set in a procedural open world that will make perfect use of this system, can you kindly contact me in order to share more info? I think it will be quite interesting for you and the team. (It’s on PC, Xbox One and PS4)