Объемы распространения света: анизотропная фильтрация объемных данных

9

Я реализовал алгоритм Cascaded Light Propagation Volumes (без косвенного затенения) для рассеянного глобального освещения в реальном времени, подробно описано здесь и здесь . Это работает нормально, но я все еще пытаюсь исправить один артефакт в частности.

Краткое содержание

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

Алгоритм работает, сохраняя информацию о освещении в виде сферических гармоник в трехмерной сетке, где первоначально данные в каждой ячейке сетки поступают от рендеринга расширенной карты теней ( отражающей карты теней).), который также включает в себя цвет и нормальную информацию, кроме глубины. Идея состоит в том, что, по сути, все пиксели, видимые источником света, являются причиной первого отражения непрямого освещения, поэтому вы сохраняете требуемую информацию вместе с обычным буфером глубины, который вы используете для отображения теней, и отбираете все данные для инициализации трехмерной сетки. , Информация в трехмерной сетке затем распространяется итеративно (для каждой итерации), распространяя информацию в одной ячейке по всем ее 6 прямым соседям (сверху, снизу, слева, справа, сверху, снизу). Чтобы осветить сцену, используя информацию в сетке, вы применяете полноэкранный проход к вашей сцене, и для каждого растеризованного пикселя у вас есть доступное положение растеризованной поверхности в мировом пространстве (например, из G-Buffers в отложенном затенении), так что вы знать, к какой ячейке сетки принадлежит определенный пиксель на экране.

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

введите описание изображения здесь

проблема

При поиске ячеек на этапе освещения используется трилинейная интерполяция (с использованием аппаратных текстурных фильтров) для плавной интерполяции данных между центром ячейки, ее соседними ячейками и фактической поисковой координатой текстуры. По сути, эта интерполяция имитирует распространение информации об освещении в центре ячейки к конкретным пикселям вокруг центра, где информация ищется. Это необходимо, потому что в противном случае освещение будет выглядеть очень грубым и безобразным. Однако, поскольку трилинейная интерполяция не учитывает направление распространения света от информации освещения, закодированной в ячейке (помните, что это сферические гармоники), свет может быть неправильно распространен на искомый пиксель. Например, если излучение, закодированное в ячейке, распространяется только в направлении (1,0,0) ("

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

введите описание изображения здесь

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

Актуальный вопрос

Автор предлагает форму ручной анизотропной фильтрации, чтобы исправить это. Он дает градиент яркости (я предполагаю коэффициенты SH, взятые из текущей ячейки) в направлении нормали поверхности n, как:

введите описание изображения здесь

И говорится

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

Мои вопросы):

В уравнении функция c (x) представляется коэффициентами SH в точке (x). Таким образом, градиент яркости, похоже, вычисляется как обычный числовой производный как взвешенная разница коэффициентов SH в точках x - (n / 2) и x + (n / 2). Тем не менее, что такое c (x) в моем контексте? В настоящее время я предполагаю, что c (x) относится к трилинейно интерполированным коэффициентам на поверхности (x), но я совсем не уверен, так как я не знаю, как это должно дать вам больше информации о направлении распределение коэффициентов SH.

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

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

TravisG
источник

Ответы:

4

Центральное отличие было введено в статье AMD, когда они делали демо с кристаллами, летящими по туннелю, по памяти.

cФункция Не должно быть что - то точно, просто идея, например, светимость, так просто оценить SH , используя текущий нормальный.

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

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

Я обнаружил, что он работает в 70% случаев, но при неосторожном применении он может создавать очень странные эффекты черных дыр или изменения оттенков (розовый, зеленый ...) в очень темных областях, где в других случаях присутствует утечка света. Это потому, что у вас есть 3 LPV для каждого цвета, центральная разница имеет тенденцию давать разные результаты. Если вы способны, попробуйте использовать яркость в оттенках серого, чтобы оценить центральный разностный демпфер, и позже используйте общий коэффициент уменьшения для всех цветовых каналов.

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

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

Вы можете только поглотить это и попытаться смягчить проблемы, дав LPV менее сильное заключительное слово в последнем косвенном свете, используя постоянный член с весом (0,5?), И LPV может внести вклад в оставшиеся 0,5 косвенного светлый. Также попробуйте реализовать объем геометрии, это уменьшит проблему. И, наконец, главное отличие.

v.oddou
источник
В качестве улучшения более чем на 50% от постоянной температуры окружающей среды можно использовать методику, называемую «окружающая среда BRDF» (от Tri-Ace).
v.oddou