Я реализовал алгоритм 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, а также ссылается на эту статью, в которой показаны выводы градиента, но сейчас я не могу сделать из них никаких полезных выводов.