OpenGL Motion Blur без накопительного буфера

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

  • Иметь фиксированный массив (временно) пустых кадровых буферов и текстур для каждого "размытия"
  • Всякий раз, когда встречается новый кадр, переместите первый элемент в конец и вместо этого выполните рендеринг в этот кадровый буфер
  • Рендеринг их всех: первый кадр с непрозрачностью 1 /n, второй с 1 / (n / 2) и т. Д. До последнего, имеющего 1.

Есть ли более простой / быстрый / более оптимизированный способ, чем этот? Или это лучшее решение?

2 ответа

То, что NicolBolas говорит в своих комментариях, правильно: чтобы получить реальное размытие движения, вы должны применить векторное размытие, которое контролируется скоростью каждого фрагмента; вычислите скорость экрана каждой вершины и передайте ее в качестве еще одной униформы фрагментному шейдеру. Затем примените векторное размытие в направлении и расстоянии от скорости фрагмента.

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

Есть два основных подхода к этому:

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

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

а) Сколько у вас "подкадров" б) Насколько велик ваш экран и, следовательно, насколько велики будут текстуры для чтения и записи.

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