GLSL Shader Effects: Як зробити розмиття руху?


16

У мене повноцінне 2D-середовище, з спрайтами, як пейзаж, персонажі тощо.

Щоб зробити його більш сучасним, я хочу реалізувати ефект розмиття руху, подібний до сучасних FPS-ігор (тобто Crysis) при швидкому переміщенні камери.

У бічній прокрутці бажаний ефект має це незначне розмиття, яке дає уявлення про швидкий рух, коли камера рухається. Якщо хтось міг би дати мені кілька порад щодо цього, я вважаю, що в піксельній шейдері я буду вдячний.


Зберігайте кілька копій наданого буфера. Наприклад, розмийте чотири попередні кадри, щоб створити поточний кадр. Це повинно створити потрібний ефект.
knight666

@ knight666 не було б краще (пам'ять звичайно, швидкість я не впевнений) зберігати 1 додатковий буфер (називаємо це A) і замішувати частину (скажімо, 0,75) цього з вихідним буфером (перехід на екран, назвіть це B), а потім скопіюйте B в A згодом. Це створило б ковзну середню величину, а збільшення розмитості руху не коштуватиме нічого зайвого.
Ельва

1
Я мав намір зробити це коментарем, але не зміг знайти кнопку коментаря. У будь-якому випадку, те, що каже Дейв О., - це, мабуть, найкраще ставити і що використовувати в іграх, як Crysis. Це працює трохи так. Під час візуалізації об'єкта рендеруйте швидкості об'єкта в окремий буфер. MRT зробить це трохи швидше, і існує кілька способів обчислити швидкість, але ви хочете в кінцевому підсумку отримати додатковий буфер, який має швидкості для всього буфера візуалізації. Потім в шейдері після обробки, виходячи зі швидкості на кожен піксель, ви відбираєте пробу в кольоровий буфер у зворотному напрямку швидкості
Арелій

Код HLSL / Cg у Лістингу 27-1 використовує попередні рівняння у повноекранному піксельному шейдері після обробки для обчислення положення світового простору об'єктів, виведених у заданому пікселі, використовуючи буфер глибини та обернення потоку матриця перегляду-проекції ... HLSL .... У вашому коді це не GLSL .....

Відповіді:


6

Зберігайте копію останнього фреймбуфера. Отримайте вектор руху камери та переверніть його. Намалюйте свою сцену, як зазвичай, а потім намалюйте останній фреймбуфер з невеликим зміщенням (дельта камери, яку ви тільки що обчислили) та 0,75 альфа. Повторіть стільки разів, скільки хочете, щоб надати ефекту розмиття руху.


1
Такий підхід дуже простий у здійсненні, але він дуже тонкий у налаштуванні (він може виглядати як предмети, що залишають сліди, а не розмиті). Інший також простий підхід - "мазати" пікселі у напрямку перевернутої камери в піксельному шейдері після обробки.
Дейв О.

6
Основна проблема цього підходу полягає в тому, що він залежить від частоти кадрів - він буде виглядати зовсім інакше, якщо ви працюєте з 20 кадрів в секунду, як це виглядає, якщо ви працюєте зі 100 кадрів в секунду. Поки ви знаєте про це і отримуєте бажаний результат у кадрі, який ви працюєте, це нормально, але вам це потрібно знати.
Максим Мінімус

19

Я рекомендую використовувати цей метод: Розмиття руху як ефект після обробки

Дуже простий у здійсненні, це той, який я використовував у моєму glsl demo Ruin Island [посилання]


Цей метод набагато перевершує змішування у минулих кадрах ...
Стівен Лу

Як і зараз, ця відповідь просто забезпечує посилання. Якщо зв'язок розірветься в майбутньому, ніхто не дізнається, як реально вирішити свою проблему. Постарайтеся хоча б включити важливу інформацію, яку надає посилання

Так, давайте зробимо копію Інтернету, тому що ця копія повністю не зламається жодного дня: J
SasQ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.