Skocz do zawartości

Surface pixeluje sprity


Przejdź do rozwiązania Rozwiązane przez gnysek,

Rekomendowane odpowiedzi

Zrobiłem nowy surface o wymiarach pokoju i rysuje sprite na x/y. Obracając nim pixele przeskakują, gdzie na application surface tego nie robi [gif podglądowy]. 
Gra startuje w rm_init o właściwościach:
Room Settings: 1920x1080
Camera Properties: 1920x1080
Viewport Properties: 1920x1080

Po czym przechodzi na właściwe pokoje o właściwościach:
Room Settings: 960x540
Camera Properties: 960x540
Viewport Properties: 1920x1080

Zmiana rm_init na te same wartości co wszystkie pozostałe daje ten sam efekt 😕 
Próbowałem coś z aa_display, gpu_set_texfilter ale albo wywalało cały surface, albo rozmazywało wszystkie sprity. 


Pixelujemisprity.gif

(faktycznie dość słaba jakość tego gifa, ale na rękach - niebieskich plamach, widać o co mi chodzi. Po lewej piksele przeskakują, a po prawej nie)

Kod surface:
 

//surf = surface_create(room_width, room_height); // -> w create event
surface_set_target(surf)
draw_clear_alpha(0,0)
draw_sprite_ext(sprite_index, image_index, x, y, 1, 1, image_angle, c_white, 1);
surface_reset_target();

draw_surface(surf,0,0);

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Powiem, że nie mam pojęcia o co chodzi, bo u mnie rozmazuje jak należy:

 

image.png

 

Podsyłam mój testowy projekt, może przeglądając go znajdziesz różnice w ustawieniach (sprawdź też Game Options):

 

https://gmclan.org/up23_18_surface_test.html

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Tak, zapomniałem dodać, że w opcjach mam odhaczoną opcję "Interpolate colours between pixels" ze względu na pixelart. W Twoim przykładzie jest ta sama sytuacja, kiedy ją odhaczę.  Gdzieś czytałem, że to ze względu, że application_surface jest rysowana w większej rozdzielczości i skalowana do niższej. Nie wiem na ile to prawda i jak to faktycznie miało by działać i dlaczego akurat w ten sposób. Kod w tym wyjaśnieniu był mniej więcej taki (nie mogę tego teraz znaleźć): 
 

draw_surface_ext(application_surface,0,0, 0.5, 0.5,0,c_white,1);

- gdzie 0.5 to xscale/ysclae;

 

 

Zabawnie robi się wtedy, kiedy surface utworze o wymiarach spritu (sprite'u?... duszka? 😄) i obracam całym surface, a nie spritem. Wtedy przeskakiwanie pikseli nie występuje, a zachowuje się tak samo jak na application_surface.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy
  • Rozwiązanie

A widzisz, myślałem, że chcesz w drugą stronę. A jak sytuacja wygląda z włączonym app surface i ręczny rysowaniem go w Post Draw ? Ewentualnie sprawdź jaki jest rozmiar app_surface - może musisz go... zmienić, żeby pasował do rozmiaru 960x540 :)

Odnośnik do komentarza
Udostępnij na innych stronach

Zrobiłem surface o wymiarach x4 i przeskalowałem w dół i faktycznie daje to zamierzony efekt. Pytanie jak bardzo wpływa to na wydajność, bo jeden surface ok, ale jak się ma takich kilka? Będę chyba musiał wymyślić coś innego.

 

Cytat

zmienić, żeby pasował do rozmiaru 960x540 :)

Próbowałem, to samo 😕 

 

Cytat

sprawdź jaki jest rozmiar app_surface 

Zrobiłem surface_get_width/height(application_surface) i dało wymiar Viewport Properties (okno wyświetlania gry) czyli 1920x1080, a room i camera ma 960x540 🤔 Czyli faktycznie application_surface ma 2 razy bardziej zagęszczone pixele i pewnie przez to nie przeskakują... taki antyaliasing 

 

EDIT: 
Tak, kiedy zmienię wszystko na jednakową wartość, czyli 1920x1080 i application_surface ma zagęszczenie 1:1 to piksele też przeskakują 🙂

Odnośnik do komentarza
Udostępnij na innych stronach

  • 1 miesiąc temu...

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