Вопрос

Я подумываю о включении размытия в движении в свою 2D-программу, но сомневаюсь в результатах моего текущего алгоритма.

Мой подход на данный момент выглядит так:

  • Рисовать в задний буфер.
  • Когда время обновлять передний буфер, смешайте задницу на переднем буфере.
  • Повторить

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

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

Есть ли какие-либо решения, которые позволят мне сделать это более эффективно или получить лучший результат?

Это было полезно?

Решение

На самом деле вам придется визуализировать множество промежуточных кадров и смешать их в один результат.Скажем, например, что ваша выходная частота кадров составляет 50 кадров в секунду.Вероятно, вы получите приемлемый результат, если будете выполнять внутренний рендеринг со скоростью 500 кадров в секунду и смешивать группы из десяти кадров вместе, прежде чем показывать их пользователю.

Подход, который вы используете в данный момент, имитирует постоянство, как если бы вы выполняли рендеринг на старую ЭЛТ с медленным люминофором.На самом деле это не то же самое, что размытие в движении.Если продолжительность вашего кадра составляет 20 мс (1000/50), то кадр с размытием в движении состоит из изображений, охватывающих продолжительность кадра 20 мс, и все с одинаковым альфа-взвешиванием.Решение по сохранению состоит из рендеринга 20, 40, 60, 80, 100 мс назад, постепенно исчезающего.

Другие советы

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

Лучше всего было бы нарисовать для каждого пикселя полупрозрачную линию от новой позиции к старой позиции.Однако это не тривиальный расчет.

Возможно, оно вообще не очень острое.Все зависит от используемой функции смешивания.Например, 0,1/0,9 для предыдущего/текущего изображения соответственно обеспечат некоторый слабый след.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top