Wie kann man gefälschte 3D-Verzerrungseffekte für ein 2D-Side-Scrolling-Spiel implementieren?

14

Ich bin mir nicht sicher, nach welchen Begriffen ich suchen soll oder wo ich anfangen soll, obwohl ich mir das als eine Art Nachbearbeitungseffekt vorstelle.

Ich habe Spiele wie Ich will der Boshy sein und du musst das Spiel gewinnen gesehen, die es schaffen, die Perspektive von 2D-Spielen zu verändern, um ihnen eine Art 3D-Effekt zu verleihen (siehe Bilder unten). Boshy lässt es im Grunde so aussehen, als ob Sie sich in einem Turm (Zylinder) befinden, während Sie das Spiel gewinnen müssen. Dadurch wird das Bild verzerrt, so dass es aussieht, als würden Sie auf einem alten CRT-Monitor spielen, insbesondere im leicht gerundeten Look.

  • Gibt es einen Begriff für diesen Effekt?
  • Was ist die Standardmethode zur Implementierung dieses Effekts (Terminologie)?
  • Wie würde ich einen solchen Effekt aus einer 20.000-Fuß-Sicht in einer Engine / einem Framework auf hohem Niveau wie Unity oder XNA / Monogame implementieren? (Detaillierter Code wird gerne angenommen, ist aber nicht erforderlich. Ich bin mir bewusst, dass die genauen Implementierungsdetails variieren können, aber detaillierte Informationen darüber, was getan werden muss, sind sehr willkommen.)

Ich will der Boshy sein Ich möchte der Boshy sein

Du musst das Spiel gewinnen Bildbeschreibung hier eingeben

SpartanDonut
quelle
Ja. Ich war immer neugierig, den genauen Begriff für die Technik zu kennen. Das Beste,
woran
Genau! Und das funktioniert nur für das letztere Beispiel
Spartan Donut

Antworten:

7

Dies kann als Nachbearbeitungseffekt implementiert werden. (Bei Verwendung von Unity / XNA / Dx / OGL / ...)

Geometrie-Methode

Erstellen Sie zunächst ein Netz, das dem gewünschten Verzerrungseffekt ähnelt. (z. B. Modellieren eines Halbzylinders (oder eines Kegels, einer Kugel, eines Würfels, ...), achten Sie darauf, die Texturkoordinaten festzulegen). Rendern Sie Ihr 2D-Spiel wie gewohnt, aber rendern Sie das Endergebnis in eine Textur. Rendern Sie dann die Verzerrungsgeometrie mit der soeben erstellten Textur. Sie können die Welt / Ansicht / Projektion verwenden oder die tatsächlichen Geometrie- / Texturkoordinaten ändern, um die Stärke der Verzerrung zu steuern. (Bild 1 zeigt das reguläre 2D-Spiel, Bild 2 zeigt die gleiche Textur, die auf eine Kugel projiziert wurde)

Spielbeispiel Beispiel auf eine Kugel projiziert (mit Mixer)

Verzerrungsmethode

Bildverarbeitungswerkzeuge bieten oft Verzerrungseffekte, die die Projektion nachahmen können (etwas wie optische Täuschungen). Beispielsweise wurde Bild 3 mit dem Ausbuchtungsfilter von Paint.Net generiert

Ausbuchtungsverzerrung.

(Eine Implementierung (OpenGL ES 2.0) dieses Verzerrungseffekts finden Sie im GPUImage- Projekt - siehe GPUImageBulgeDistortionFilter.)

Je nach Implementierung ist eine der beiden Methoden möglicherweise schneller oder passt besser zu Ihrem gewünschten Ergebnis. Da beide Implementierungen recht einfach sind, können Sie versuchen, beide zu implementieren und herauszufinden, welche für Sie am besten geeignet ist.

Miklas
quelle
Fantastische Antwort!
Tholle
1
Beide erfordern die Verarbeitung der gleichen Bildmenge. Die Projektion ist niemals schneller als nichts und die Kosten für die Bildverarbeitung sind in beiden Fällen gleich. - Die Methode "Verzerrung" ist schneller, da Sie die Scheitelpunkttransformation und -rasterung überspringen und dem Treiber mehr Freiheit geben, die Pixel zu iterieren, wobei der Polygonansatz spezifischer ist, in welcher Reihenfolge gezeichnet werden soll. Schließlich Polygone Halten Sie weniger Informationen über Ihren beabsichtigten Effekt bereit, greifen Sie auf eine generische Lösung zurück, die die Texturfilterhardware betont und eine Approximation anstelle des echten Filters erzeugt.
MickLH
@MickLH: Scheitelpunkte für eine solche Nachbearbeitungsprojektion können offline oder unter Last berechnet werden, wodurch sich ein sehr billiger Vertex-Shader mit Pass-Through ergibt. Für ein Ausbuchtungsfilter muss auch ein Vollbild-Quad gerendert und gerastert werden (außer wenn SpartanDonut Zugriff auf z. B. Compute-Shader hat), und für jedes Pixel muss der Offset berechnet und nicht interpoliert werden. Daher glaube ich, dass (abhängig von den verfügbaren Tools und der Implementierung) beide Methoden gleich schnell sein können. Ich habe meine Antwort aktualisiert, danke für Ihre Eingabe.
Miklas