Самый быстрый способ размыть все вокруг точки в постобработке

Я использую Ogre3D и его композиторов.

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

MIN ( (normalizedDistanceBetween(pixel, blurringPoint)/0.5), 1.0 )

Поэтому я предполагаю, что правильный путь — сначала создать полностью размытую версию сцены с помощью шейдера. Эта часть у меня уже есть.

Теперь, как смешать это размытое изображение с оригинальной сценой? Я вижу два пути:

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

Есть ли смысл во втором способе? Будет ли он иметь какой-либо заметный прирост производительности, чем первый? (Даже пару кадров в секунду?) Или создание дополнительного прохода RTT и текстуры снижает всю производительность, полученную за счет того, что не вычисляется (довольно простая) функция расстояния для каждого выходного пикселя? Я предполагаю, что размер экрана какой-то нормальный, например 1024x768, т.е. намного больше, чем текстура микширования 16x16. Или есть другой более простой метод?


person Cray    schedule 19.06.2012    source источник


Ответы (1)


Любая версия может иметь преимущество в производительности. Если вы не делаете что-то особенно неэффективное, оба способа должны быть достаточно быстрыми.

Если вы действительно обеспокоены этим, вы должны реализовать оба и сравнить их.


Если вы еще этого не сделали, вы можете ускорить свой эффект, создав размытый буфер с половинным разрешением. Для этого требуется хороший фильтр передискретизации, чтобы избежать алиасинга при чтении исходной сцены (я рекомендую по крайней мере [1,3,3,1] Гаусса и, возможно, шире, например [1,5,10,10,5,1]) .

На самом деле, если вы хотите особенно широкое максимальное размытие, вы можете повторить процесс, создав пирамиду изображения с несколькими разрешениями. (как только вы понизите разрешение оригинала, все станет намного дешевле, потому что половинное разрешение означает 1/4 пикселя)


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

person comingstorm    schedule 20.06.2012