2D размытие в движении
Я думаю о том, чтобы бросить размытие движения в мою 2D-программу, но сомневаюсь в результатах моего текущего алгоритма.
Мой подход выглядит следующим образом:
- Нарисуй в буфер.
- Когда пришло время обновить передний буфер, смешайте задний буфер с передним буфером.
- Повторение
Эффект "размытия в движении", очевидно, вызывает смешивание, так как движущиеся объекты оставят след затухания.
Это явно не очень требовательно к аппаратному обеспечению, двойная буферизация будет выполняться в любом случае, и единственным дополнительным шагом является альфа-смешивание, которое является простым вычислением. Однако трассы будут очень резкими и совсем не размытыми, что может показаться немного странным. Я мог бы сделать размытие окна на заднем буфере до шага смешивания, но мне кажется, что это может быть очень обременительным для систем низкого уровня, таких как Nintendo DS.
Есть ли какие-либо решения, которые позволили бы мне сделать это более эффективно или дать лучший результат?
3 ответа
На самом деле вы должны визуализировать много промежуточных кадров и смешать их в один результат. Скажем, например, что ваша частота кадров составляет 50 кадров в секунду. Вы, вероятно, получили бы разумный результат, если бы вы рендерились внутри со скоростью 500 кадров в секунду и смешивали группы из десяти кадров вместе, прежде чем показывать это пользователю.
Подход, который вы используете в данный момент, имитирует постоянство, как если бы вы рендерили на старую ЭЛТ с медленным люминофором. Это не то же самое, что размытие движения. Если длительность вашего кадра составляет 20 мс (1000/50), то размытый кадр движения состоит из визуализаций, охватывающих продолжительность кадра 20 мс, причем все с одинаковым альфа-взвешиванием. Постоянное решение состоит из визуализаций 20, 40, 60, 80, 100 мс назад, постепенно исчезающих.
Насколько мне известно, нет никакого реального способа сделать это более эффективно. Это настолько эффективно, насколько это возможно. Это выглядит довольно хорошо, если частота кадров хорошая и движение не слишком резкое.
Лучше всего было бы нарисовать для каждого пикселя полупрозрачную линию от новой позиции к старой. Это не тривиальный расчет, однако.
Это может быть не очень острым на всех. Все зависит от используемой функции смешивания. Например, 0,1/0,9 для предыдущего / текущего изображения соответственно обеспечит некоторый слабый след.
Я мог бы добавить, что именно так происходит размытие движения в OpenGL (через буфер накопления)