Publish @Yuriy O’Donell: Voxel GI techniques

Продолжаем сеять доброе мудрое вечное. Вот @Yuriy O’Donell из Creative Assembly жжот про Light Propagation Volumes против Sparse Voxel Octrees.

Simon Kozlov: @Yuriy O’Donnell
Расскажи про LPV vs Cone tracing подробнее плз? Т.е. какие за и против, почему спекулар лучше делать одним, чем другим?

Yuriy O’Donnell: reply @Simon Kozlov
В LPV есть regular grid или несколько вложеных (cascaded). Для каждой ячейки есть информация о потенциальных окклудерах и есть освещённость (irradiance).
Освещённость итеративно передается из одной ячейки в соседние.
Первоначальная освещённость вводится либо через RSM, либо просто в лоб для простых (non shadow casting) источников.
В лоб = взять все point & spot источники и посчитать их contribution для каждой ячейки.
Я это делал рендеря квады в слои volume texture, например.
После первоночального освещения и передачи (propagation), в каждой ячейке у нас будет приблизительная информация об интенсивности и направлении.
(directional irradiance)
ну или можно SH
DI лучше чем SH
к сожалению, DI дает некое среднее направление
одно для каждой ячейки
specular reflection поэтому тоже получается *очень* приблизительно
то есть это не reflection совсем
а как бы агрегатный источник света для каждого вокселя
Теперь про cone tracing. Вместо regular grid есть дерево (sparse voxel octree). В ячейках опять освещённость + немного информации о геометрии. Но ячейки только там, где есть геометрия.
Поэтому sparse.
Отражения считаются per-pixel. Вокруг вектора отражения строится конус (параметры зависят от материала).
Для этого конуса находятся ячейки которые с ним пересекаются.
Отражение получается гораздо более “faithful”
На всякий случай: http://www.youtube.com/watch?v=fAsg_xNzhcQ
Построение дерева — довольно дорогая операция. Трейсинг — тоже.
Построение LPV сравнительно дешевая операция (особенно если сравнивать с SVOT)
LPV lookup — совсем дешевая операция
LPV вполне current gen технология. SVOT/VCT — не уверен что мы увидим скоро повсеместно.
Вот пример отражений которые невозможно получить в LPV: http://www.youtube.com/watch?feature=player_detailpage&v=fAsg_xNzhcQ#t=182s
Но в принципе SVOT/VCT — очень и очень крутая технология. Я большой фанат.
Кстати, еще есть один большой недостаток у VCT — очень дорого multiple bounce делать.
Думаю, надо совмещать VCT с чем-то другим. VCT для отражений и first bounce. Нечто другое для multiple bounces.
Еще думаю что Geomerics Enlighten и похожие технологии будут гораздо более привлекательны с точки зрения производительности и качества в ближайшем будущем.
Надо делать гибрид из этих двух, вобщем.
Строить SVOT из Enlighten лайтмапы и делать VCT *только* для отражений.

Simon Kozlov: reply @Yuriy O’Donnell
Я правильно понимаю, что главная разница в том, что в SVOT итоговое разрешение значительно больше? Т.е. в LPV сетка очень coarse по сравнению с SVOT?
А так алгоритм в общем тот же – заполнить воксельную информацию светом, начиная с RSM или тупо источников и продолжая клеточным автоматом, а при рендере – делать трейсинг лучей (или конусов) в этой воксельной информации?

Yuriy O’Donnell: reply @Simon Kozlov
Нет. Не в этом разница.
В LPV в каждом вокселе получается нечто вроде среднего направления и интерсивности света.
Попиксельно мы читаем эту информацию, основываясь только на world space position.
То есть ничего мы не трейсим при рендере с LPV.
А в SVOT — трейсим. Поэтому получаем “настоящее” отражение попиксельно.
А не какое-то среднее.

Simon Kozlov: reply @Yuriy O’Donnell
А, ок, я понял наверное. Т.е. главное отличие в том, что в LPV в вокселе считается некое усредненное распределение для освещения любого объекта, который в эту точку попал. А в SVOT запоминается именно первый баунс для всего, а второй и более – трейсится непосредственно во время рендера. Я правильно понимаю?

Yuriy O’Donnell: reply @Simon Kozlov
Ага. Примерно так.

Simon Kozlov: reply @Yuriy O’Donnell
А разрешение таки примерно одинаковое или в SVOT нужно больше?

Yuriy O’Donnell: reply @Simon Kozlov
SVOT — иерархическая структура, там есть “мипы”. Чем выше разрешение (ниже уровень “мипа”) — тем чётче отражения.

Simon Kozlov: reply @Yuriy O’Donnell
Интересно на практике, требуется ли большее разрешение

Yuriy O’Donnell: reply @Simon Kozlov
На сколько я понимаю, если нужны только blurry отражения или только диффузный свет — можно примерно такое-же разрешение как и LPV. Думаю 0.5m^3 подойдет.

Simon Kozlov: reply @Yuriy O’Donnell
Спасибо за ответы!

Yuriy O’Donnell: reply @Simon Kozlov
Есть еще, кстати, идея упрощения/ускорения SVOT. Можно попробовать запечь такую-же информацию, как в LPV.
directional irradiance

Simon Kozlov: reply @Yuriy O’Donnell
Вообще, идея предрассчитать распределение по сторонам в LPV очень притягательна, да
Особенно когда статики много, а динамики мало
Что совсем хорошо – динамику не обязательно определять сразу, можно двигать что угодно

Simon Kozlov: reply @Yuriy O’Donnell
И перессчитывать инкрементально

Yuriy O’Donnell: reply @Simon Kozlov
Чтобы не надо было попиксельно трейсить. Думаю этого вполне будет достаточно для diffuse indirect light + approximate specular.

Simon Kozlov: reply @Yuriy O’Donnell
А как предлагается хранить этот DI конкретно?
Т.е. это же какая-то BRDF-like функция

Yuriy O’Donnell: reply @Simon Kozlov
DI это тупо направление + цвет
хранить опять в SVOT :)

Simon Kozlov: reply @Yuriy O’Donnell
А, ок, я неправильно понял идею. Ты хочешь наоборот, в voxel octrees хранить DI. А чем это поможет трейсить?

Yuriy O’Donnell: reply @Simon Kozlov
Идея сначала построить SVOT для directly lit поверхностей. А потом второй SVOT для видимых поверхностей в кадре. Когда строим второе дерево, трейсим первое. Профит в том что первое дерево не надо *трейсить* попиксельно потом.

Simon Kozlov: reply @Yuriy O’Donnell
Хм, то есть это чтобы трейсить не в каждом пикселе, а в каждом вокселе второго дерева, которых меньше?

Simon Kozlov: reply @Yuriy O’Donnell
И результат интерполировать?
Может в вертексах проще тогда? :)

Yuriy O’Donnell: reply @Simon Kozlov
Ага, результат получится примерно так LPV, но без гемороя с cascades.

Yuriy O’Donnell: reply @Simon Kozlov
Может и в вертексах :)

Simon Kozlov: reply @Yuriy O’Donnell
Тогда типа уже есть конкретная нормаль, и можно трейсить зная для какой геометрии все это
Кстати, а если в этом твоем вокселе второго дерева несколько объектов – тоже для них делать DI?
Т.е. усредненное что-то, независимое от рисующейся геометрии?

Yuriy O’Donnell: reply @Simon Kozlov
В вокселе можно просто point irradiance

Yuriy O’Donnell: reply @Simon Kozlov
ага, именно так

Simon Kozlov: reply @Yuriy O’Donnell
В вертексах можно зная геометрию…
Т.е. трейсить первое дерево в направлении нормали итд

Yuriy O’Donnell: reply @Simon Kozlov
Думаю примерно такая схема может вполне даже взлететь на mid-high-end железе…

Simon Kozlov: reply @Yuriy O’Donnell
Прикольно, прикольно. У нас в Роблоксе есть воксель-грид, у меня есть ощущение, что он во все это вполне вписывается
Если изменения редкие, штуки типа LPV можно вполне на CPU считать

Yuriy O’Donnell: reply @Simon Kozlov
Ага, такое можно попробовать на CPU :)

Simon Kozlov: reply @Yuriy O’Donnell
Тогда на совсем low-end все может работать

Yuriy O’Donnell: reply @Simon Kozlov
Но тогда можно прямо в lightmap запекать, а не в воксели для рендеринга.

Simon Kozlov: reply @Yuriy O’Donnell
Не, все же динамическое

Yuriy O’Donnell: reply @Simon Kozlov
А что мешает двигать обхъекты которые в лайтмапе? :)

Simon Kozlov: reply @Yuriy O’Donnell
Ну в смысле маппинг лайтмепа должен быть динамический

Yuriy O’Donnell: reply @Simon Kozlov
В смысле надо анврап автоматически делать?

Simon Kozlov: reply @Yuriy O’Donnell
Да

Yuriy O’Donnell: reply @Simon Kozlov
У вас, вроде, довольно простая геометрия.

Simon Kozlov: reply @Yuriy O’Donnell
Кубики разных размеров и воксельный грид
Паковать на атлас…
Мне кажется, в вертексах проще, в вокселях очень регулярные вертексы
А для динамических все равно надо volume texture

Yuriy O’Donnell: reply @Simon Kozlov
volume texture — очень расточительно с точки зрения памяти

Simon Kozlov: reply @Yuriy O’Donnell
Зависит от разрешения, но в общем да

Yuriy O’Donnell: reply @Simon Kozlov
Можно довольно влоб анврапить. Или если есть желание, можно попробовать нечто вроде http://msdn.microsoft.com/en-us/library/windows/desktop/bb206321(v=vs.85).aspx

Simon Kozlov: reply @Yuriy O’Donnell
Думаешь в реалтайме будет сносно работать?

Simon Kozlov: reply @Yuriy O’Donnell
У нас там сотни тысяч кубиков будут

Yuriy O’Donnell: reply @Simon Kozlov
хотя если на цпу… и sparse структура…
Вобщем, это очень увлекательная тема для исследования :)

Yuriy O’Donnell: reply @Simon Kozlov
Если они не деформируются сильно, я проблем особых не вижу.
Да даже если деформируются, тоже особо не вижу серьезных проблем.

Simon Kozlov: reply @Yuriy O’Donnell
Не, ну у нас _все_ динамическое. Террейн может как угодно измениться, кубики появиться и исчезнуть, даже статические итд итп

Yuriy O’Donnell: reply @Simon Kozlov
В воксели можно тоже (помимо) для движущихся объектов.

Simon Kozlov: reply @Yuriy O’Donnell
Да, я думать 3D текстуру + в вертексы для воксельной геометрии

Yuriy O’Donnell: reply @Simon Kozlov
Думаю можно построить normal cone, примерно как делают в tiled deferred shading. Чтобы потом трейсить меньше направлений.

Yuriy O’Donnell: reply @Simon Kozlov
в LPV освещённость всех вокселей, в SVOT только освещённость вокселей с геометрией

Zeux: reply @Yuriy O’Donnell
В смысле из proxy геометрии?

Yuriy O’Donnell: reply @Zeux
ага

Zeux: reply @Yuriy O’Donnell
Очень хочется динамическую геометрию! ;)
И мир во всем мире.

Yuriy O’Donnell: reply @Zeux
ну конечно хочется :)
и велосипед и пони

Yuriy O’Donnell: reply @Zeux
оно всё будет, но не в ближайшие 2 года, думаю
(в смысле повсеместно)

Это произошло на #gamedeff

  • coba
  • http://www.microsoft.com CEMEH

    Ага, как Юра и говорит – работает на next gen, на current get можно LPV. Я вот думаю, получится ли ваще на настоящем среднем PC с большими вокселями.

  • coba

    что для тебя средний PC?

  • http://www.microsoft.com CEMEH

    Ох. У меня нет среднего, есть несколько типичных. Лаптоп с Intel Moblie Chipset Express, что-нибудь с Intel HD Graphics и процентов 17 с чем-то лучше PS3/Xbox.