NukeBoards

Pomoc - SUb-Pixel Positioning Pixel Shader

kamiledi15 - 26-02-2018, 19:07
: Temat postu: SUb-Pixel Positioning Pixel Shader
Mam prośbę, znalazłem taki temat:
https://community.clickteam.com/threads/44644-Sub-Pixel-Positioning-Pixel-Shader
Potrzebuję zrobić płynny ruch chmur, które lecą sobie jednostajnie w jedną stronę bardzo powoli. Ten efekt zapewnia płynny ruch przy bardzo niskich prędkościach, ale w tym przykładzie jest przypisany do ruchu myszą i w żaden sposób nie mogę tego przerobić. Umiałby ktoś pomóc?
msg - 26-02-2018, 19:33
:
Ale żeby nie umieć z przykładu dwóch akcji przepisać?

https://www.dropbox.com/s...ioning.mfa?dl=1


jarlfenrir - 26-02-2018, 20:14
:
msg napisał/a:
Ale żeby nie umieć z przykładu dwóch akcji przepisać?

https://www.dropbox.com/s...ioning.mfa?dl=1

Obrazek
To nie jest kwestia przepisania, a zrozumienia o co chodzi w przykładzie :P
Dlaczego na końcu drugiej akcji dałeś dzielenie przez 100.0? Nie rozumiem do czego to tu jest.
msg - 26-02-2018, 20:55
:
Dla przesuwania o współrzędną X to szerokość obrazka, a więc obszar, w którym ma działać efekt.
kamiledi15 - 26-02-2018, 23:07
:
No nie wiem, jak dla mnie to to nie wygląda za dobrze. Ułamek sekundy stoi w miejscu, wykonuje przeskok o piksel, znowu ułamek sekundy stoi, znowu robi przeskok... Czy to samo, co w path movement z prędkością 1. Jednak przykład ruchu myszą był znacznie płynniejszy. Czy tylko ja to widzę?
msg - 26-02-2018, 23:32
:
kamiledi15 napisał/a:
Czy tylko ja to widzę?

Tak. Albo masz za duży kontrast na monitorze. Ewentualnie sterownik zdecydował, że nie będzie obsługiwał efektów i patrzysz na coś innego niż ja.

https://youtu.be/7f10brZPgUw Zwolniłem ruch do pełnej sekundy na piksel. Widać jak brzegi płynnie zanikają.

kamiledi15 napisał/a:
Jednak przykład ruchu myszą był znacznie płynniejszy.

Akurat tu wydaje mi się, że winę ponosi łagodna krawędź obiektu, który był użyty w przykładzie. Moja chmurka ma ostrą krawędź bez AA, żeby pokazać, że efekt zachodzi. Może wpływać to na subiektywny odbiór efektu.
kamiledi15 - 26-02-2018, 23:48
:
Cytat:
Zwolniłem ruch do pełnej sekundy na piksel.

A jak to zrobiłeś? Ja mogę wstawić filmik, jak u mnie ten ruch skacze, ale jeśli go spowolniłeś jeszcze bardziej, to może dlatego na twoim wygląda lepiej.
msg - 26-02-2018, 23:49
:
kamiledi15 napisał/a:
A jak to zrobiłeś?

Zamiast:
timer / 300.0
Dałem:
timer / 1000.0

Oba wyglądają równie płynnie.
kamiledi15 - 27-02-2018, 00:08
:
W takim razie nie wiem, dlaczego u Ciebie to wygląda zupełnie inaczej. Proszę, to mój filmik:
https://www.youtube.com/watch?v=ZKl3l0g1W0k
Najpierw z timerem/1000, potem na 300, potem pokazuję, jak wygląda przykład z forum Clickteamu. Różnica jest ogromna.
Może mieć jakieś znaczenie, że ja używam darmowej wersji CF? Ogólnie to pracuję w MMFie 2, ale Twój przykład wymusza używanie CF.

[ Dodano: 27-02-2018, 00:15 ]
Dobra, chyba to wina tej darmowej wersji CF, bo przykład z myszą też na niej działa skokowo. Spróbuję przepisać Twój kod do mojej gry w MMF2.

[ Dodano: 27-02-2018, 00:29 ]
Eureka, miałem rację. Wygląda na to, że darmowy CF nie obsługuje tego efektu, ale w MMF2 wszystko działa dobrze. Co prawda rozmywanie brzegów nie wygląda idealnie, bo lewa i prawa krawędź chmury lekko pulsują, ale jest to mało widoczne i znacznie lepsze, niż ruch skokowy. Dzięki wielkie za pomoc.
msg - 27-02-2018, 00:36
:
Jak rozmyjesz chmurę gaussem to nawet w ruchu skokowym nie będzie widać przemieszczenia.
kamiledi15 - 27-02-2018, 00:38
:
Chyba takie rozmywanie nie wyglądałoby dobrze przy mojej grafice. Ale spoko, tak już wygląda nieźle. Jak ktoś nie przyłoży nosa do monitora, to nie zauważy.

[ Dodano: 27-02-2018, 02:16 ]
Ok, a mógłbyś mi jeszcze coś podpowiedzieć? Gdy chmura wyjedzie z ekranu, to powinna się teleportować z drugiej strony ekranu i znowu zacząć płynąć. Nie do końca mi to wychodzi. Przede wszystkim, gdy mam np. 4 chmury, to wszystkie zaczynają z pozycji X = 0, więc wszystkie nakładają się na lewy róg ekranu i stamtąd płyną, co wygląda dość głupio. Zmieniłem to w prosty sposób - zmieniając pozycję X na Int(timer/200.0)+500, lub +800 itd, wtedy każda chmura startuje w innym miejscu. Ale, gdy wyjedzie z ekranu i ma się teleportować z krawędzi, to teleportuje się tam, gdzie zaczęła, czyli na środek ekranu. Masz pomysł, jak to zrobić? Pewnie to prosta sprawa, ale nie do końca łapię, jak to działa. Ewentualnie zamiast teleportować chmury, mógłby jej się po prostu odwrócić kierunek ruchu, teoretycznie wpadłem na to, jak to zrobić, bo wystarczy dać minusy przed 200.0, ale jeśli ustawię chmurze punkt startowy na środku ekranu, to po zmianie kierunku teleportuje się, więc to też bez sensu.
msg - 27-02-2018, 09:47
:
https://www.dropbox.com/s..._multi.mfa?dl=1



to '100.0' w akcji odpowiedzialnej za ustalenie stopnia efektu też można by ustalić na:
OWidth( "Active" )
kamiledi15 - 27-02-2018, 10:36
:
Próbuję przeportować ten kod do MMFa, ale MMFowi nie podoba się ten Owidth. Próbowałem znaleźć, co to jest, czy to może jakiś stworzony przez Ciebie Alterable Value (bo Starting Offset już znalazłem, że tak), ale OWidth chyba nie. Domyślam się, że to szerokość obiektu? MMF2 nie chce tego zaakceptować.

[ Dodano: 27-02-2018, 10:53 ]
Dobra, chyba się udało. Musiałem zmienić ręcznie Owidth na ręczne wpisanie szerokości każdej chmury. Dodatkowo zamiast Frame Width wpisałem ręcznie długość ekranu, bo jeśli ramka ma długość np. 12 tysięcy, no to chmura by się resetowała dopiero po dojechaniu do końca całej ramki, a mi chodzi o krawędź ekranu. Teraz chyba jest ok, dzięki.

[ Dodano: 27-02-2018, 11:02 ]
Jednak coś jest jeszcze nie tak. Kod na Start of Frame jest taki jak u Ciebie, na Always zmieniłem tak, jak napisałem wyżej:
Cytat:
(Int(timer/300.0)+Alterable Value A( Active 85 )) mod (1024+229)-229
Set effect parameter f_XShift to (((timer/300.0) mod 1.0)/100.0)

Alterable Value A to to samo, co u Ciebie Starting Offset. 1024 to szerokość ekranu, 229 to szerokość obiektu. Jeśli zamiast 300 dam np. 100, żeby przetestować i żeby chmura szybko jechała - działa dobrze. Ale jeśli dam 200 lub 300, żeby jechała wolno - to się psuje - chmura stoi w miejscu i się trzęsie. Co robię źle?

[ Dodano: 27-02-2018, 16:56 ]
Teraz jestem w pracy, więc tego nie sprawdzę, ale generalnie chcę, żeby chmury miały odhaczone "Follow the frame". Czyli chodzę sobie po planszy, a chmury są stale wpisane w tło i lecą sobie niezależnie od moich działań. Tak więc teleport chmury powinien następować po wyjechaniu za kamerę, a nie za całą ramkę. Nie miałem czasu sprawdzić, czy moja zmiana na 1024 tutaj wystarczy, bo sprawdzałem to tylko na początku etapu i tam działało dobrze (zanim ruszy się kamera), ale tak jak napisałem, tylko przy wyższych prędkościach, przy niższych chmura się blokuje i nie wiem czemu. Piszę to tylko, żebyś mógł to uwzględnić, gdybyś miał czas sprawdzić, co skopałem.
jarlfenrir - 27-02-2018, 17:16
:
Zamiast odznaczać chmurom follow the frame ja preferuję rozwiązanie z warstwami. Dajesz chmury na warstwę niżej, niż właściwa część gry i dla chmurowej warstwy określasz XCoefficient i YCoeficcient na 0.
kamiledi15 - 27-02-2018, 17:19
:
No dobra, później spróbuję. Może mi to załatwi problem z trzęsącą się chmurą :D Tylko co wtedy z długością ekranu? Frame Width chyba nie może zostać, skoro to długość całej ramki? Czyli ma zostać, tak jak ja zrobiłem, 1024? Nie jestem teraz pewien, co spowodowało ten efekt trzęsienia - czy to przez zmianę Owidth na ręczne wpisanie długości obiektu, czy przez zmianę Frame Width na 1024 - dałem szybszą prędkość chmury, żeby przetestować, czy się dobrze teleportuje, a potem się dopiero okazało, że na niższej prędkości się psuje.