Jak wdrożyć fałszywe efekty 3D, takie jak zniekształcenia, w grze 2D z przewijaniem?

14

Nie jestem pewien, jakie są odpowiednie hasła do wyszukiwania, a nawet od czego zacząć, ale wyobrażam sobie, że to jakiś efekt przetwarzania końcowego.

Widziałem takie gry, jak I Wanna Be The Boshy i You Have To Win Game, które potrafią zmodyfikować perspektywę gier 2D, aby dać im rodzaj efektu 3D (patrz zdjęcia poniżej). Boshy w zasadzie sprawia, że ​​wygląda jakbyś był w wieży (cylindrze), podczas gdy musisz wygrać. Gra zniekształca obraz, tak że wygląda na to, że grasz na starym monitorze CRT, a konkretnie w lekko zaokrąglonym wyglądzie.

  • Czy istnieje termin na ten efekt?
  • Jaki jest standardowy sposób realizacji tego efektu (terminologia)?
  • Jak mógłbym wdrożyć taki efekt w silniku / frameworku wysokiego poziomu, takim jak Unity lub XNA / Monogame z perspektywy 20 000 stóp? (szczegółowy kod z radością przyjęty, ale nie konieczny - zdaję sobie sprawę, że dokładne szczegóły implementacji mogą się różnić, ale szczegółowe informacje o tym, co należy zrobić, byłyby bardzo mile widziane)

Chcę być Boshy Chcę być Boską

Musisz wygrać grę wprowadź opis zdjęcia tutaj

SpartanDonut
źródło
Tak. Zawsze ciekawiło mnie dokładne określenie tej techniki. Najlepsze, co mogę wymyślić, to „stary efekt ekranu telewizyjnego”
Tofu_Craving_Redish_BlueDragon
Dokładnie! I to działa tylko na ten drugi przykład
SpartanDonut

Odpowiedzi:

7

Można to zaimplementować jako efekt przetwarzania końcowego. (W przypadku korzystania z Unity / XNA / Dx / OGL / ...)

Metoda geometrii

Zacznij od utworzenia siatki przypominającej efekt zniekształceń, który chcesz osiągnąć. (np. model półcylindra (lub stożek, kulę, sześcian, ...), upewnij się, że ustawiłeś współrzędne tekstury). Renderuj grę 2D jak zwykle, ale renderuj końcowy wynik w teksturę. Następnie renderuj geometrię zniekształceń za pomocą właśnie utworzonej tekstury. Możesz użyć świata / widoku / projekcji lub zmodyfikować rzeczywiste współrzędne geometrii / tekstury, aby kontrolować siłę zniekształcenia. (zdjęcie 1 pokazuje zwykłą grę 2D, zdjęcie 2 pokazuje tę samą teksturę rzutowaną na kulę)

Przykład gry Przykład rzutowany na kulę (przy użyciu blendera)

Metoda zniekształceń

Narzędzia do przetwarzania obrazu często oferują efekty zniekształceń, które mogą emulować projekcję (trochę jak złudzenia optyczne). Na przykład obraz 3 został wygenerowany przy użyciu filtra wypukłości z Paint.Net

Zniekształcenie wypukłości.

(Możesz znaleźć implementację (OpenGL ES 2.0) tego efektu zniekształceń z projektu GPUImage - patrz GPUImageBulgeDistortionFilter)

W zależności od implementacji dowolna metoda może być szybsza lub zapewniać lepsze dopasowanie do pożądanego wyniku. Ponieważ obie implementacje są dość proste, możesz spróbować wdrożyć obie i przekonać się, która z nich jest dla Ciebie najlepsza.

Miklas
źródło
Fantastyczna odpowiedź!
Tholle
1
Oba wymagają przetworzenia tej samej ilości obrazu. Projekcja nigdy nie będzie szybsza niż nic , a przetwarzanie obrazu kosztuje tak samo. - Metoda „zniekształceń” jest szybsza, ponieważ pomijasz transformację wierzchołków i rasteryzację, a także dajesz kierowcy większą swobodę iteracji pikseli, przy czym podejście do wielokąta jest bardziej szczegółowe na temat kolejności rysowania. Wreszcie wielokąty przechowują mniej informacji o zamierzonym efekcie, uciekają się do ogólnego rozwiązania, które kładzie nacisk na sprzęt do filtrowania tekstur i daje przybliżenie zamiast prawdziwego filtra.
MickLH
@MickLH: Wierzchołki do takiej projekcji końcowej można obliczyć offline lub przy obciążeniu, uzyskując bardzo tani tranzytowy moduł cieniujący. W przypadku filtra wypukłego należy również wyrenderować i zrasteryzować czterokrotnie ekran (z wyjątkiem sytuacji, gdy SpartanDonut ma dostęp np. Do shaderów obliczeniowych), a dla każdego piksela zamiast interpolacji należy obliczyć przesunięcie. Dlatego uważam (w zależności od dostępnych narzędzi i implementacji) obie metody mogą być równie szybkie. Zaktualizowałem swoją odpowiedź, dziękuję za Twój wkład.
Miklas