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

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

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

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

1

Решение

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

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

3

Другие решения

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

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

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

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

0

По вопросам рекламы [email protected]