OpenGL Dynamic Object Motion Blur

Я следовал учебному пособию по GPU Gems 3 о том, как размыть изображение в зависимости от движения камеры. Однако я хочу реализовать размытие на основе движения объекта. Решение представлено в статье (см. Цитату ниже), однако мне интересно, как именно это реализовать.

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

Если это действительно правильный метод, то почему я не могу просто передать проекцию модель-вид? Я бы предположил, что они будут одинакового значения?

GPU Gems 3 Motion Blur

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

1 ответ

Решение

Проверьте мое исследование, которое я провел несколько месяцев назад по этой теме: http://www.stevenlu.net/files/motion_blur_2d/Fragment_shader_dynamic_blur.pdf

(обновление от 20 декабря 2014 г.: теперь обслуживается моим веб-сайтом, который переродился в наиболее экономичную форму Amazon EC2, пожалуйста, не бейте по ней слишком сильно...)

http://www.stevenlu.net/files/motion_blur_2d/60_noblur.gif http://www.stevenlu.net/files/motion_blur_2d/60.gif

К сожалению, я не использовал текстурированные объекты при создании этого материала, но использую ваше воображение. Я работаю над игровым движком, поэтому, когда он наконец увидит свет в виде игры, вы можете быть уверены, что я приду и выложу здесь панировочные сухари. В первую очередь рассматривается, как реализовать этот эффект в 2D, и в тех случаях, когда объекты не перекрываются. На самом деле не существует хорошего способа использовать фрагментный шейдер для "сметания" сэмплов для получения "точного" размытия. В то время как эффект приближается к пиксельному совершенству по мере увеличения количества отсчетов, геометрия, которая должна быть сформирована для охвата области развертки, должна быть собрана вручную с использованием некоторых "уродливых" методов.

В полном 3D довольно сложно определить, по каким пикселям будет перемещаться динамический объект в течение кадра. Даже со статической геометрией и движущейся камерой решение, предложенное в статье Gems от GPU, неверно, если быстро перемещаться мимо вещей, потому что оно не может решить эту проблему, требуя смешивания области, выделяемой чем-то движущимся...

Тем не менее, если это приближение, которое игнорирует развертку, является достаточным (и может быть), то, что вы можете сделать, чтобы распространиться на динамические объекты, это принять во внимание их движение. Вам, конечно, нужно будет проработать детали, но посмотрите на строки 2 и 5 во втором блоке кода в статье, на которую вы ссылаетесь: это текущая и предыдущая "позиции" пиксельного пространства на экране. Вам просто нужно как-то передать матрицы, которые позволят вам вычислить предыдущую позицию каждого пикселя с учетом динамического движения вашего объекта.

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

Другие вопросы по тегам