Skocz do zawartości

Rozmycie


ZyperPL

Rekomendowane odpowiedzi

Cześć!

 

Nie wiem czy potrzebny jest jakiś shader, czy coś innego. Ale potrzebuje efekt rozmycia obok krawędzi ekranu.

Da się coś takiego zrobić?

Nie chodzi mi o blur (że obiekty zostawiają smugę) tylko, żeby krawędzie były rozmyte.

 

Wolałbym nie używać Xenona, tylko jeśli da radę zrobić to jakoś na surface'ach.

 

Bardzo proszę o pomoc.

 

Pozdrawiam :P

Odnośnik do komentarza
Udostępnij na innych stronach

Jest jak najbardziej możliwe. Wyłączasz na starcie autodraw, i w stepie czy czymkolwiek innym, byle nie draw (bo się ci zapętli, oczywiście) - rysujesz wszystko (używasz do tego funkcji redraw). To ma na celu ominięcie rysowania wszystkiego po 2x razy, a ponadto cały "widok" masz sobie w surface'u.

Samo rozmycie, jako "rozmycie" polegać będzie na narysowania surface'a (wszystko wywołujesz w jakimś stepie, wybierz sobie), a potem z jakąś zmniejszoną alfą rysowanie "obok", czyli w górę, dół, lewo, prawo, czy jak już tam uważasz. To jest cała koncepcja. Przynajmniej ja to tak robię (np. w tym tds'sie z "nad czym aktualnie pracujesz") - działa bardzo szybko.

 

Z rozmywaniem ekranu po krawędziach, będzie trochę problematycznie. Gdyby istniało coś takiego jak "surface_set_alpha_from_sprite", albo "add_sprite_from_surface", było by to możliwe.

 

...znaczy, jest "możliwe" w pewnym sensie. Jeśli co stepa będziesz przerabiał surface na sprite, po czym jeszcze nakładał na to maskę o takiej samej rozdziejczości co ekran, zabijesz się o fpsy. - No i musisz jeszcze znaleźć funkcję które to umożliwiają, bo z tego co mi wiadomo chyba takich nie ma. ; )

 

 

///EDIT: Jednak, chyba mam pomysł. Tylko muszę coś sprawdzić. Po prostu daj mi trochę czasu. ; )

Odnośnik do komentarza
Udostępnij na innych stronach

Spoko.

Surface'y są strasznie skomplikowane, więc nie umiem się nimi zbytnio obsługiwać. Gdybyście mogli, to bym prosił w miarę zrozumiale wszystko opisane ;) (z komendami)

Proszę i dziękuję z góry.

Ok, nie chce sie znowu udzielac w rozmowe: co dla kogo jest latwe/trudne w gmie, ale czesto ludzie tak mowia, niw wiedzac co mowia.

Pewno jak miales 5 lat, nie lubiles pomidorow, czy czegos innego, a tak naprawde rzadko je dotykales jezykiem. Pierw sprobuj, pozniej mow. Jak znajdziesz dobry tutorial, zrozumiesz to raz dwa. Wiecej lini != trudniejszy problem.

Ja nie tykalem 3D myslac ze jest trudne, a pozniej wreszcie zrobilem 1(!) tutorial, i od razu zaczalem robic grywalne fajne gry. Tak samo z 39dll. "Meh, jakis przyklad znajde, to jest za trudne", patze, a to kilka logicznych linii kodu, i grasz online!

Odnośnik do komentarza
Udostępnij na innych stronach

Samo rozmycie, jako "rozmycie" polegać będzie na narysowania surface'a ... z jakąś zmniejszoną alfą rysowanie "obok", czyli w górę, dół, lewo, prawo
Tutaj podam drugi pomysł na rozmycie w gmie - wykorzystanie interpolacji przy rysowaniu. Rysujemy surface (z włączoną interpolacją) na dwa razy mniejszy surface, po czym przywracamy go do pierwotnego rozmiaru (powiększamy dwa razy). Później znowu zmniejszamy, znowu powiększamy itd. Można tutaj stosować różne kombinacje skali surfaców (zmniejszyć go dwa razy, potem zwiększyć dwa, zmniejszyć cztery, zwiększyć cztery itd.) i kombinować z nimi w celu uzyskania najlepszego stosunku jakośći do fpsu.

Jakiś sample który dla kogośtam robiłem kiedyś, w sumie sam nie pamiętam kogo:

http://dl.dropbox.com/u/25762547/blur.gmk

 

Fps tej techniki może nie powala (choć można to jeszcze zoptymalizować) ale jakość rozmycia jest myślę znacząco lepsza niż wersji z półprzezroczystymi surface'ami.

 

Gdyby istniało coś takiego jak "surface_set_alpha_from_sprite"
Istnieje:
GML
draw_set_blend_mode_ext(bm_zero, bm_inv_src_color);

draw_sprite(sprite, 0, 0, 0);

draw_set_blend_mode(bm_normal);

Rysujemy to oczywiście na surfacie (surface_set_target()).

 

Maska "sprite" powinna być cała czarna i wtedy jej kanał alpha zostanie przeniesiony na surfejsa (tam gdzie sprite jest przezroczysty na x% tam surface będzie przezroczysty na x%).

W sumie pisze te blendy z pamięci ale chyba się nie pomyliłem : p

Odnośnik do komentarza
Udostępnij na innych stronach

Co do blendingu, to można też:

GML
draw_set_blend_mode(bm_subtract);

draw_sprite(sprite, 0, 0, 0);

draw_set_blend_mode(bm_normal);

tylko że przy tym ustawieniu tam, gdzie sprite jest przezroczysty na x%, tam na surface'u będzie na (100-x)%.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...