Skocz do zawartości

Maska przycinająca z photoshopa - Overlay


Rekomendowane odpowiedzi

Męczę się z tym już od kilku dni, ale dalej nie mogę tego rozgryźć, więc proszę Was o pomoc :rolleyes:

 

Chodzi mi o najzwyklejszą maskę przycinającą, taką jaka jest w photoshopie. Potrzebuję jej, żeby zrobić oświetlenie.

Chcę osiągnąć mniej więcej taki efekt:

 

final.jpg

 

ale na razie wychodzi mi tylko coś takiego:

 

clipping_mask_now.jpg

 

Czyli światło ma padać na wszystko inne poza tłem.

Co na razie mam? Na razie mam trzy surfaces, jedna na której rysuję tło, druga na której rysuję maskę światła ( draw_clear_alpha(c_black, 0.5) oraz tam gdzie jest źródło światła to rysuję np białe koło) oraz trzecią, na której rysuję wszystko inne przy pomocy view_surface_id[0] czyli tilesety, obiekty itd. a przynajmniej tak mi się wydaje, ponieważ kiedy nie rysuję tła, to w miejsce tła nie jest rysowane nic i po prostu pozostają poprzednie klatki (wyłączyłem rysowanie application_surface oraz w ustawieniach roomu wyłączyłem „clear Background with Windows colour” oraz „clear display buffer with windows colour”).

Próbowałem różnych kombinacji image_blend_ext itd, ale nie udało mi się uzyskać efektu maski przycinającej. Poza tym pytanie o wydajność: trzy warstwy wielkości view z kanałem alpha i image_blend - w przypadku 2D na PCcie raczej bez problemu, ale na Androidzie to już raczej średnio?

 

Drodzy forumowicze, ma ktoś pomysł na to jak zrobić maskę przycinającą? Jak ktoś z okolic Krakowa to mogę obiecać piwko ;)

Odnośnik do komentarza
Udostępnij na innych stronach

Jasne, tutaj przygotowałem mniej więcej to co teraz mam, zdaję sobie sprawę jak źle to jest napisane, ale na razie tylko sprawdzam jak to działa

Clipping Mask

jak widać światło pada nie tylko na te tilesety i obiekty ale i również na tło, akurat w tym przykładzie rysuję w trochę inny sposób to wszystko.

Jeżeli dalej ciężko mnie zrozumieć to może podrzucę screena z photoshopa:

 

Zrzut%20ekranu%202016-02-11%20o%2003.10.58.png

 

oraz jak to w photoshopie wygląda:

 

Zrzut%20ekranu%202016-02-11%20o%2001.42.54.jpg

 

Btw, nie wiem czemu, ale specjalnie zrobiłem grafikę do tego przykładu, jak ktoś ją chce to proszę bardzo.

Odnośnik do komentarza
Udostępnij na innych stronach

Istnieje sposób (teoretycznie, o ile GM działa tak, jak myślę, że działa)

Wyłącz automatyczne rysowanie

Stwórz surface o rozmiarach okna gry (nazwijmy go s_main)

Na początku każdej klatki gry czyść go używając draw_clear_alpha

Rysuj na nim wszystko poza tłem (czyli światła też rysuj)

Stwórz surface o rozmiarach okna gry (nazwijmy go s_mask)

Na początku każdej klatki gry maluj go na czarno

Rysuj na nim wszystko co rysujesz normalnie (bez tła i świateł), ale z ustawionym blendingiem bm_subtract

Na surface s_main rysuj s_mask z blendingiem bm_subtract

Pozostało tylko rysować w oknie gry: najpierw tło, potem s_main

Jeżeli tylko bm_subtract odejmuje też alphę z surface'ów, to powinno działać.

Odnośnik do komentarza
Udostępnij na innych stronach

Właśnie próbuję zaimplementować twój sposób Amaterasu, ale mam jedno pytanie: w jaki sposób się właśnie wywołuje rysowanie "wszystkiego"? Chodzi mi o rysowanie tilesetów, obiektów itd? Bo view_current_id[0] to chyba nie to. To jest chyba w ogóle mój największy problem -> jak uzyskać surface, który będzie zawierał tilesety i obiekty, a w miejsce tła będzie miał alpha równe zero.

Odnośnik do komentarza
Udostępnij na innych stronach

Tak jak napisał Lord, żeby narysować wszystkie obiekty, tilesety, itp. musisz po prostu ręcznie wywołać ich metody rysujące i renderować wszystko po kolei do surface. Dlatego sugeruję znacznie prostszy sposób:

  1. Ustawiasz tło rooma na jednolity kolor, którego nie będziesz używał w grze, np. krzyczący fiolet.
  2. Grafikę tła tak jak teraz renderujesz do tekstury, którą przekazujesz do shadera.
  3. Rysujesz application_surface z shaderem.
  4. W shaderze sprawdzasz, czy kolor piksela = kolor tła ustawionego w roomie.

    • Jeśli tak, rysujesz Twoje tło (przekazane w teksturze) z ambientem.
    • Jeśli nie, rysujesz tak jak dotychczas, czyli podstawowa tekstura z ambientem i światłami.

Tutaj masz zmodyfikowany projekt. Oczywiście wadą takiego rozwiązania jest fakt, że musisz się pilnować, żeby w swoich grafikach nie użyć nigdzie koloru tła, bo wytnie Ci tam dziurę.

 

clippingmask.jpg

Odnośnik do komentarza
Udostępnij na innych stronach

Wow, dzięki Maximal, o coś takiego mi właśnie chodziło. Tylko muszę lekko zmodyfikować ten shader, bo jest mały problem z przezroczystością, ale myślę, że już to ogarnę (jeśli jest pixel przezroczysty i za nim tylko tło, to nakłada się on na kolor tła rooma). I jeszcze jedno pytanie na koniec: czy sposób rysowania tych warstw itd. w obiekcie mainDraw ma ekhem... rozum i godność człowieka :D, czy koniecznie należy to zoptymalizować jakoś, bo robię to w sposób nieefektywny?

Odnośnik do komentarza
Udostępnij na innych stronach

Faktycznie, z przezroczystością jest problem. Tutaj niestety już nie ma wyjścia i musisz kombinować, np. z rysowaniem wszystkich przezroczystych elementów na oddzielnej warstwie.

 

Co do logiki Twojego renderingu to jest w porządku, ale polecam Ci poczytać o tym jak dokładnie działa GM-owy pipeline graficzny i co się dzieje w poszczególnych eventach, bo może Ci się to przydać później. O tu jest wpis na blogu YoYo Games.

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