Я пытаюсь реализовать реальный Motion Blur, используя OpenGL, но без буфера накопления (из-за этого не работает на моей видеокарте). Вот моя идея для реализации:
Есть ли более простой / быстрый / более оптимизированный способ, чем этот? Или это лучшее решение?
То, что NicolBolas говорит в своих комментариях, является правильным: чтобы получить реальное размытие движения, вы должны применить векторное размытие, которое контролируется скоростью каждого фрагмента; вычислите скорость экрана каждой вершины и передайте ее в виде еще одной униформы фрагментному шейдеру. Затем примените векторное размытие в направлении и расстоянии от скорости фрагмента.
Так как это будет размыто с другими фрагментами, вы столкнетесь с проблемой упорядочения прозрачности. Следовательно, вы должны применять это как эффект постобработки, в идеале с очищенными слоями глубины. Вы можете сэкономить на сложности сортировки по глубине, используя резервирование ранее визуализированных кадров для слияния, что по сути является предложенным вами методом кадрового буфера с добавлением векторного размытия.
Есть два основных подхода к этому:
Нетрудно сказать, какой из этих методов будет работать лучше. Недостатком метода (2) является то, что вы делаете много проходов, а значит, много накладных расходов. Метод (1) будет ограничен при чтении текстур. Хотя в методе (1) вы все равно в конечном итоге читаете все данные, которые вы бы использовали в методе (2), в методе (1) вы сможете использовать несколько строк кэша для выборок из памяти текстур.
Таким образом, два наиболее важных фактора, которые определяют производительность здесь:
а) сколько у вас «подкадров»
б) Насколько велик ваш экран и, следовательно, насколько велики будут текстуры для чтения и записи.