Efekty cieniowania GLSL: Jak wykonać rozmycie?

16

Mam pełne środowisko 2D, z duszkami poruszającymi się jako krajobraz, postacie itp.

Aby wyglądało bardziej nowocześnie, chcę wprowadzić efekt rozmycia ruchu, podobny do współczesnych gier FPS (np. Crysis) rozmycie podczas szybkiego przesuwania aparatu.

W przesuwniku bocznym pożądanym efektem jest pojawienie się tego lekkiego rozmycia, aby dać wyobrażenie o szybkim ruchu, gdy kamera się porusza. Gdyby ktoś mógł dać mi kilka wskazówek, jak to zrobić, zakładam, że w module cieniującym piksele byłbym wdzięczny.

Grimshaw
źródło
Zachowaj wiele kopii renderowanego bufora. Na przykład rozmyj cztery poprzednie klatki, aby utworzyć bieżącą klatkę. To powinno stworzyć pożądany efekt.
knight666
@ knight666 czy nie byłoby lepiej (pamięć na pewno, szybkość nie jestem pewien) zachować 1 dodatkowy bufor (nazwać to A) i mieszać ułamek (powiedzmy 0,75) z buforem wyjściowym (przechodząc do ekranu, nazwij to B), a następnie skopiuj B do A później. Stworzyłoby to średnią kroczącą, a zwiększenie rozmycia w ruchu nie kosztowałoby nic więcej.
Elva
1
Chciałem zrobić z tego komentarz, ale nie mogłem znaleźć przycisku komentarza. W każdym razie to, co mówi Dave O., jest prawdopodobnie najlepszym rozwiązaniem i tym, co jest używane w grach takich jak Crysis. To działa trochę tak. Podczas renderowania obiektu Renderuj prędkości obiektu do oddzielnego bufora. MRT sprawi, że będzie to nieco szybsze i istnieje wiele sposobów obliczania prędkości, ale chcesz uzyskać dodatkowy bufor, który ma prędkości dla całego bufora renderowania. Następnie w shaderze postprocesowym, opartym na prędkości każdego piksela, próbkujesz do bufora kolorów w przeciwnym kierunku do veloc
Arelius
Kod HLSL / Cg z listingu 27-1 wykorzystuje poprzednie równania w pełnoekranowym cieniowaniu pikselowym po przetworzeniu, aby obliczyć pozycję w przestrzeni świata obiektów renderowanych przy danym pikselu, używając bufora głębokości i odwrotności prądu matryca widok-projekcja. ... HLSL .... W twoim kodzie nie jest GLSL .....

Odpowiedzi:

6

Zachowaj kopię ostatniego bufora ramki. Pobierz wektor ruchu kamery i odwróć go. Narysuj scenę jak zwykle, a następnie narysuj ostatni bufor ramki z niewielkim przesunięciem (właśnie obliczona delta aparatu) i 0,75 alfa. Powtarzaj tyle razy, ile chcesz, aby uzyskać efekt rozmycia ruchu.

r2d2rigo
źródło
1
To podejście jest bardzo łatwe do wdrożenia, ale bardzo trudne do dostrojenia (może wyglądać jak obiekty pozostawiające ślady zamiast być zamazane). Innym prostym podejściem jest „rozmazanie” pikseli w kierunku ruchu kamery w odwróconym kierunku w cieniowaniu pikseli po przetworzeniu.
Dave O.
6
Głównym problemem związanym z tym podejściem jest to, że jest zależne od liczby klatek na sekundę - będzie wyglądać zupełnie inaczej, jeśli pracujesz z prędkością 20 klatek na sekundę, z tym, jak wygląda przy 100 klatkach na sekundę. Tak długo, jak zdajesz sobie z tego sprawę i osiągasz pożądany wynik przy prędkości klatek na sekundę, jest w porządku, ale musisz być tego świadomy.
Maximus Minimus
19

Polecam użycie tej metody: Motion Blur jako efekt przetwarzania końcowego

Bardzo prosty w implementacji, to ten, którego użyłem w mojej demo glsl Ruin island [link]

kragniz
źródło
Ta metoda jest znacznie lepsza niż mieszanie w poprzednich klatkach ...
Steven Lu
W obecnej chwili ta odpowiedź zawiera tylko link. Jeśli link się zepsuje w przyszłości, nikt nie będzie wiedział, jak rozwiązać problem. Spróbuj przynajmniej podać niezbędne informacje, które podaje link
Tak, zróbmy kopię Internetu, ponieważ ta kopia całkowicie się nie złamie: J
SasQ