HamsterMan Opublikowano 10 Lutego 2016 Udostępnij Opublikowano 10 Lutego 2016 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: ale na razie wychodzi mi tylko coś takiego: 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 Więcej opcji udostępniania...
I am Lord Opublikowano 10 Lutego 2016 Udostępnij Opublikowano 10 Lutego 2016 Hmm a mógłbyś zrobić source z takim efektem? Za bardzo nie potrafię wywnioskować jak to działa z twojego opisu. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
HamsterMan Opublikowano 11 Lutego 2016 Autor Udostępnij Opublikowano 11 Lutego 2016 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: oraz jak to w photoshopie wygląda: 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 Więcej opcji udostępniania...
I am Lord Opublikowano 11 Lutego 2016 Udostępnij Opublikowano 11 Lutego 2016 Próbowałem coś wykombinować nic nie doradzę :/ Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
lew_leo Opublikowano 11 Lutego 2016 Udostępnij Opublikowano 11 Lutego 2016 a możne tak dodać jeszcze jednego sprita w niebieskim kolorze i użyć któregoś z blend mode? wtedy masz jeden od świateł a drugi od koloru Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Amaterasu Opublikowano 12 Lutego 2016 Udostępnij Opublikowano 12 Lutego 2016 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 Więcej opcji udostępniania...
HamsterMan Opublikowano 12 Lutego 2016 Autor Udostępnij Opublikowano 12 Lutego 2016 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 Więcej opcji udostępniania...
I am Lord Opublikowano 12 Lutego 2016 Udostępnij Opublikowano 12 Lutego 2016 tło można wyłączyć w opcjach room editora, wtedy będzie przeźroczyste, instancje wiadomo with (all) draw_self() ale tilesy to nie wiem. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Maximal Opublikowano 13 Lutego 2016 Udostępnij Opublikowano 13 Lutego 2016 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: Ustawiasz tło rooma na jednolity kolor, którego nie będziesz używał w grze, np. krzyczący fiolet. Grafikę tła tak jak teraz renderujesz do tekstury, którą przekazujesz do shadera. Rysujesz application_surface z shaderem. 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ę. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
HamsterMan Opublikowano 13 Lutego 2016 Autor Udostępnij Opublikowano 13 Lutego 2016 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 Więcej opcji udostępniania...
Maximal Opublikowano 14 Lutego 2016 Udostępnij Opublikowano 14 Lutego 2016 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 Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę