Я использую Ogre3D и его композиторов.
В принципе, мне интересно, какой самый быстрый способ размыть все вокруг динамической точки в окне просмотра. Точка задается координатами 2D-экрана. Чем дальше пиксель от этой точки, тем более размытым он должен быть. Чтобы дать вам представление о том, насколько сильное размытие должно быть, если точка размытия находится точно в середине экрана, края должны быть максимально размыты. Таким образом, коэффициент размытия пикселя можно рассматривать как
MIN ( (normalizedDistanceBetween(pixel, blurringPoint)/0.5), 1.0 )
Поэтому я предполагаю, что правильный путь — сначала создать полностью размытую версию сцены с помощью шейдера. Эта часть у меня уже есть.
Теперь, как смешать это размытое изображение с оригинальной сценой? Я вижу два пути:
- Введите исходную и размытую версию в шейдер композитора, пусть он рассчитает расстояние и результат по приведенной выше формуле, смешайте, используя результат.
- Настройте дополнительный проход рендеринга в текстуру, который будет использовать приведенную выше формулу для рендеринга «смешивания текстуры». Смысл в том, что микшируемая текстура может быть намного меньше экрана, даже может быть 16х16, на результат это особо не повлияет. Затем введите исходную сцену, размытую версию и текстуру микширования в окончательный шейдер компоновщика, который будет просто выбирать значение из текстуры микширования для каждого пикселя и использовать его для смешивания двух версий сцены вместе.
Есть ли смысл во втором способе? Будет ли он иметь какой-либо заметный прирост производительности, чем первый? (Даже пару кадров в секунду?) Или создание дополнительного прохода RTT и текстуры снижает всю производительность, полученную за счет того, что не вычисляется (довольно простая) функция расстояния для каждого выходного пикселя? Я предполагаю, что размер экрана какой-то нормальный, например 1024x768, т.е. намного больше, чем текстура микширования 16x16. Или есть другой более простой метод?