Skocz do zawartości
ZyperPL

Rozmycie

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

Udostępnij tego posta


Odnośnik do posta
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. ; )

Udostępnij tego posta


Odnośnik do posta
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.

Udostępnij tego posta


Odnośnik do posta
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!

Udostępnij tego posta


Odnośnik do posta
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

Udostępnij tego posta


Odnośnik do posta
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)%.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Dzięki wszystkim za pomoc.

Tyle, że nie skorzystam.

 

Nie dość, że strasznie to zżera zasoby procka to jeszcze ciężko to zrobić (tzn. tak, żeby krawędzie się tylko rozmazywały).

Dzięki, ale niestety :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

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

Tylko 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ę tutaj.

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×