Arseny Kapoulkine:
Ох, что-то я устал. У меня осталось 3 доклада, давайте я один поменьше быстренько расскажу, а дальше завтра-послезавтра или на следующей неделе добью два остальных (оставшиеся - про next-generation mobile графику интересное, и про то как использовали Mantle в движке Nitrous)

Solving Visibility and Streaming in the The Witcher 3: Wild Hunt with Umbra 3 (Presented by Umbra Software)

Speakers: Jasin Bushnaief (Umbra Software), Przemyslaw Czatrowski (CD Projekt RED)
Я думал будут интересные детали, в итоге интересных деталей на докладе было очень мало, но я чуть пообщался с инженером из Умбры после и хоть представляю теперь как оно работает примерно.
Итак, есть всем известное middleware для куллинга Umbra, и есть серия Witcher, и будет Witcher 3 (ура!)
Umbra - финская компания, в ней работают 14 человек (не понял, программистов или всего)
Пишет middleware, вы отдаете в middleware на препроцессе polygon soup.
Оно вам отдает т.н. tome data.
В рантайме вы можете у tome спросить - а какие объекты видны с учетом occlusion из текущей камеры?
Как работает Умбра? В общих чертах примерно так (это информация выяснена после доклада)
  • 1. Геометрия сцены вокселизируется.
  • 2. В результирующей воксельной сетке выделяются пустые регионы и преобразуются в геометрические объекты. Видимо регионы convex.
  • 3. На границе регионов генерируются порталы.
  • 4. В рантайме используется информация о регионах и их связности через порталы чтобы растеризовать то ли порталы то ли те регионы с помощью софтверной растеризации в depth buffer и потом по нему проверить, попадают ли объекты в видимые области.
Проблема в том, что регионы и их связность запекаются в tome data.

А теперь посмотрим на Witcher

Огромный открытый мир означает, что нам нужен стриминг.
Т.е. нам нужно разбить мир на тайлы.
И в каждом тайле иметь независимые от других тайлов данные.
В Witcher 3 размер региона в среднем около 200x200 метров.
Umbra такое конечно не умела, поэтому по запросу от Witcher они дописали поддержку стриминга.
Работает примерно так -
  • 1. Оффлайн на каждый тайл строится воксельное представление, из которого собираются регионы и их связность - в пределах тайла.
  • 2. На границах тайлов сохраняется вокселизация в файл.
Но только на границах.
  • 3. В рантайме когда стримится регион, то по вокселизации на границах соседних с ним регионов восстанавливается информация о порталах между регионами.
(все *очень* расплывчато потому что это то что мне рассказывали после доклада за 3 минуты, я думал на докладе будут рассказывать про такое подробно)
Вторая проблема - огромный открытый мир означает что нам нужны LODы.
Если просто в Umbra отдать геометрию LOD-ов, то окажется что один LOD закрывает другой и на препроцессе что-то там пойдет не так.
Хотели мержить воксельные сетки LOD-ов в одну, но вроде использовали только LOD0 для генерации occluder информации.
Ну и в Umbra пришлось встроить поддержку LOD-ов как я понимаю т.к. она отдает движку информацию "какие фрагменты мешей видимы из камеры".
И почему-то не хотели LOD selection делать после Умбры.
LOD selection тупо по расстоянию от точки.
Либо от позиции камеры, либо от измененной позиции камеры (эту точку твикали в зависимости от FOV итп)
Хотели screen space area, поленились.
Peter Sikachev:
как я понял из их доклада на MIGS - всего.
инженеров из них половина вроде как.
Peter Sikachev:
Умбра 3, надо заметить. Умбра 2 работала совсем по-другому, но они все выкинули и переписали с нуля.
Peter Sikachev:
если лоды вложены один в другой, то можно как окклюдер подсовывать самый маленький лод, нет?
Arseny Kapoulkine:
Я думаю нет гарантии вложенности.
Arseny Kapoulkine:
Данные occlusion запекаются на билд ферме как минимум раз в день, плюс в редакторе есть функция "перезапечь кусочек".
Один тайл запекается от секунд до десятков минут в зависимости от количества объектов и геометрии внутри.
Чтобы отлаживать окклюжен были написаны всякие тулзы дебажной визуализации.
В т.ч. detachable camera.
Это возможность зафризить "рендер" камеру (по которой ведется окклюжен) и полетать вокруг другой камерой.
Очень кстати полезно для ряда вещей даже если окклюжен куллинга нет...
Ну и собственно числа, больше в докладе ничего интересного не было:
Есть в Witcher 3 город Novigrad.
Это локация 8.5x8.5 километров.
  • В ней порядка 100k "объектов" (сабмешей)
  • В среднем 2-5% из них видны в зависимости от камеры.
  • Occlusion data занимает 250 Mb на диске.
  • Из-за стриминга в памяти occlusion data занимает порядка 60 Mb.
  • Данные которые поддерживают границы между регионами - примерно четверть от суммарного объема.
По такому датасету occlusion query работает около 2 ms.
Они пока что используют occlusion только для главной камеры, и работают над окклюженом для shadow camera.
А, в команде разработчиков Witcher 3 - 16 engine программистов. Больше чем вся Умбра, что неудивительно.
Все, я в докладе был несколько разочарован но может кто-то например знает подробно как работает Умбра и прокомментирует где я неправ итп!
Peter Sikachev:
так они больше и не рассказывают.
они же sponsored :)