Я почему то думал, что суслик древний. А здесь молодой детина
Suslik
Пытаюсь тут поиграться твоим подходом к GI.
Собственно интересует как ты работаешь с mip-ами у себя.
Во-первых, как ты строишь эти самые mip-ы? Вот у тебя есть 4 пикселя. 2 пикселя от одного объекта, 2 пикселя от другого. Какую глубину ты оставляешь? Самую дальнюю/ближнюю? Что-то другое?
Во-вторых, как ты считаешь затенение. Я попытался сделать это следующим образом. Когда делаю gathering для сбора источников света иду вдоль луча. На каждый tap в луче увеличиваю квадратично расстояние и mip на единичку. В каждом tap-е считаю horizon based угол и сохраняю минимальный. Если точка очередного tap-а лежит не ниже этого угла - скипаю, иначе считаю от неё свет. Так вот, в результате я так понимаю у меня происходит перепрыгивание возвышенностей, и "тень" возникает не везде. Вот на скриншоте я обвел место, где я "проскочил" цилиндр:
И еще, ты помнится упоминал что то про квадрат глубины и неравенство Чебышева. Вот только как оно применимо в данном случае? Ведь у нас нет как таковой глубины, для которой мы будем считать перекрытие.
MrShoor
> Во-первых, как ты строишь эти самые mip-ы? Вот у тебя есть 4 пикселя. 2 пикселя
> от одного объекта, 2 пикселя от другого. Какую глубину ты оставляешь? Самую
> дальнюю/ближнюю? Что-то другое?
недавно я как раз баловался с подобным и теперь у меня сформировалось, как я считаю, чёткое понимание, потому что это правильный вопрос, но я нигде не встречал на него ответа. так вот, мипмапы встречаются двух типов: один типов мипмап строится, чтобы как можно точнее описать исходную геометрию в низком разрешении, а второй тип строится, чтобы как можно точнее эту геометрию _усреднить_ на разных уровнях. и для разных техник (а в случае GI — для разных стадий одного алгоритма), мипы необходимо строить по-разному.
мипы первого типа строятся вообще без усреднения. тексель каждого мипа строится, выбирая некоторым образом один из текселей, которым он лучше всего соответствует в мипе уровнем ниже. например, можно использовать checkerboard pattern, чтобы в чёрных клетках выбирать минимум глубины из усредняемых текселей, а в белых клетках — максимум. для мипов этого типа ты никогда не хочешь усреднять информацию при построении текселей более высокого мипа. этот тип мипмапов я использую для depth-aware upscaling'а. этот тип мипмапов используется только для чтения из центров текселей и не подходит для линейной интерполяции между текселями или мипами. если ты считаешь GI в fullres разрешении, то он тебе не нужен.
второй тип мипмапов получается усреднением текселей, но тут есть важный момент: усреднять можно только линейные величины. например, цвет — линеен, а глубина нелинейного буфера глубины — нет. поэтому чтобы глубину можно было усреднять, её необходимо линеаризовать. я для этого использую подход, очень похожий на VSM — усредняю первый и второй моменты, а далее при семплинге из них можно восстановить среднее значение глубины и стандартное отклонение, что позволяет получить мягкий результат на каждый семпл вместо бинарного больше/меньше. этот тип мипмапов используется в случаях, где ты интерполируешь информацию между текселями и мипами, то есть практически весь GI работает на мипах этого типа.
> Во-вторых, как ты считаешь затенение. Я попытался сделать это следующим образом. Когда делаю gathering для сбора источников света иду вдоль луча. На каждый tap в луче увеличиваю квадратично расстояние и mip на единичку. В каждом tap-е считаю horizon based угол и сохраняю минимальный. Если точка очередного tap-а лежит не ниже этого угла - скипаю, иначе считаю от неё свет.
я считаю похожим образом, но использую более продвинутую формулу, чем в стандартном horizon-based. похожая формула применялась в GTAO. сложность в том, как бинарный тест "если точка ниже горизонта, то А, если точка выше горизонта, то Б" заменить на недискретный вклад по типу VSM, где ты оцениваешь недискретную вероятность того, что точка выше или ниже горизонта. эта вероятность и оценивается через неравенство чебышева. у меня есть много идей, как это можно делать, но нет одного решения, которое работает идеально всегда.
Suslik
> очень похожий на VSM — усредняю первый и второй моменты, а далее при семплинге
> из них можно восстановить среднее значение глубины и стандартное отклонение
Ок. Здесь понятно.
> похожая формула применялась в GTAO.
Спс. Буду изучать что там. Я так понимаю это оно: http://iryoku.com/downloads/Practical-Realtime-Strategies-for-Acc… Occlusion.pdf ?
Если ткнешь куда конкретно нужно смотреть - буду благодарен.
> сложность в том, как бинарный тест "если
> точка ниже горизонта, то А, если точка выше горизонта, то Б" заменить на
> недискретный вклад по типу VSM, где ты оцениваешь недискретную вероятность
> того, что точка выше или ниже горизонта. эта вероятность и оценивается через
> неравенство чебышева.
Вот тут как раз вопрос. Как получить вероятность через неравенство Чебышева, когда у нас углы, а не глубина? Я просто видимо в математике слабоват и пока не догоняю. Оно я так понимаю объясняется в GTAO?
MrShoor
> Спс. Буду изучать что там. Я так понимаю это оно:
> http://iryoku.com/downloads/Practical-Realtime-Strategies-for-Acc…
> Occlusion.pdf ?
> Если ткнешь куда конкретно нужно смотреть - буду благодарен.
всё волшебство этого пейпера находится в формуле (7)MrShoor
> Как получить вероятность через неравенство Чебышева, когда у нас углы, а не
> глубина?
зная среднюю глубину, можно посчитать средний угол. зная среднее квадратичное отклонение глубины, можно посчитать среднее квадратичное отклонение угла. если смотреть в плоскости семплинга, то в ней глубина = тангенс угла * расстояние до семпла в плоскости. если рассматривать малые приращения, то тангенс примерно равен самому углу. то есть глубина — это расстояние в плоскости семплинга * угол. проблема здесь, скорее, в том, как использовать полученную вероятность. пейпер GTAO даёт один из вариантов, но я не считаю его самым лучшим.
Suslik
> всё волшебство этого пейпера находится в формуле
Спасибо.
> зная среднюю глубину, можно посчитать средний угол. зная среднее квадратичное
> отклонение глубины, можно посчитать среднее квадратичное отклонение угла. если
> смотреть в плоскости семплинга, то в ней глубина = тангенс угла * расстояние до
> семпла в плоскости.
А вот оно как! Логично.
> пейпер GTAO даёт один из вариантов
Спасибо, почитаю.
> но я не считаю его самым лучшим.
Ок, как поиграюсь со всем вышеописанным - вероятно приду сюда за вопросом как лучше. :)
один из самых суровых тестов для подобных скринспейс техник — это повесить мелкий светящийся объект над плоской землёй и сравнить освещение от него с освещением от аналитического точечного источника света. это освещение должно быть view-independent, среди прочего и, ясное дело, с минимумом шума. для этого не только необходимо убедиться, что формулы расчёта интеграла освещённости (те самые синусы и косинусы) работают правильно, но ещё необходимо правильным образом обрабатывать false occlusion, а это в свою очередь может повысить шумность изображения, а для мелких ярких объектов денойзить вторичное освещение труднее всего. короче, казалось бы, совсем простой тест, но на самом деле его вовсе не просто рассчитать точно.
Крутой доклад, спасибо что выложил! Есть чему поучиться. Люблю POE и теперь посмотрю на неё по другому.
Suslik
Насколько текущая реализация SSGI в PoE отличается от той, которую ты привёл в своём LegitEngine(в плане производительности и качества)?
АкронимЛета
в poe очень много происходит в более низком разрешении с последующим depth aware upsampling. поэтому все GI рендертаргеты меньше в 4х4 раза, что позволяет делать в 16 раз больше семплов при той же производительности. плюс в poe фиксированная камера, поэтому все магические константы (например, коэффициент миппирования с расстоянием, который задаёт баланс между артефактами и шумом) можно выбрать специально для такой камеры. в остальном примерно то же самое.
Тема в архиве.