GLSL-Shader-Effekte: Bewegungsunschärfe

16

Ich habe eine vollständige 2D-Umgebung, in der Sprites als Landschaft, Charaktere usw. herumlaufen.

Um das Bild auf dem neuesten Stand der Technik zu halten, möchte ich einen Bewegungsunschärfe-Effekt implementieren, ähnlich wie bei modernen FPS-Spielen (z. B. Crysis), wenn die Kamera schnell bewegt wird.

In einem Seitenscroller ist der gewünschte Effekt, dass diese leichte Unschärfe den Eindruck einer schnellen Bewegung erzeugt, wenn sich die Kamera bewegt. Wenn mir jemand Tipps dazu geben könnte, gehe ich davon aus, dass ich in einem Pixel-Shader dankbar bin.

Grimshaw
quelle
Behalten Sie mehrere Kopien Ihres gerenderten Puffers. Verwischen Sie beispielsweise vier der vorherigen Bilder, um das aktuelle Bild zu erstellen. Das sollte den gewünschten Effekt erzielen.
Ritter666
@ knight666 Wäre es nicht besser (Speicher sicherlich, Geschwindigkeit bin ich nicht sicher), 1 zusätzlichen Puffer zu behalten (nenne es A) und dann einen Bruchteil (sagen wir 0,75) davon mit dem Ausgabepuffer zu mischen (zum Bildschirm gehen, Nennen Sie es B) und kopieren Sie anschließend B nach A. Dies würde zu einem rollierenden Durchschnitt führen und eine zunehmende Bewegungsunschärfe würde nichts mehr kosten.
Elva
1
Ich wollte dies zu einem Kommentar machen, konnte aber den Kommentar-Button nicht finden. Was Dave O. sagt, ist wahrscheinlich, dass Sie die beste Wahl sind und was in Spielen wie Crysis verwendet wird. Das funktioniert ein bisschen so. Rendern Sie während des Objektrenderns die Objektgeschwindigkeiten in einem separaten Puffer. MRT wird dies etwas beschleunigen, und es gibt mehrere Möglichkeiten, die Geschwindigkeiten zu berechnen. Sie möchten jedoch einen zusätzlichen Puffer erhalten, der die Geschwindigkeiten für den gesamten Renderpuffer enthält. Dann tasten Sie in einem Post-Process-Shader, basierend auf der Geschwindigkeit bei jedem Pixel, in der entgegengesetzten Richtung des Veloc in den Farbpuffer ein
Arelius
Der HLSL / Cg-Code in Listing 27-1 verwendet die vorherigen Gleichungen in einem Vollbild-Pixel-Shader zur Nachbearbeitung, um die Weltraumposition der auf einem bestimmten Pixel gerenderten Objekte unter Verwendung des Tiefenpuffers und der Umkehrung des Stroms zu berechnen Ansichtsprojektionsmatrix. ... HLSL .... In Ihrem Code ist es nicht GLSL .....

Antworten:

6

Behalten Sie eine Kopie des letzten Framebuffers. Holen Sie sich den Kamera-Bewegungsvektor und invertieren Sie ihn. Zeichnen Sie Ihre Szene wie gewohnt, und zeichnen Sie dann den letzten Framebuffer mit einem leichten Versatz (das gerade berechnete Kamera-Delta) und 0,75 Alpha. Wiederholen Sie diesen Vorgang so oft Sie möchten, um den Bewegungsunschärfeeffekt zu erzielen.

r2d2rigo
quelle
1
Dieser Ansatz ist sehr einfach zu implementieren, lässt sich jedoch nur schwer optimieren (es kann aussehen, als ob Objekte Spuren hinterlassen, anstatt verschwommen zu sein). Ein anderer ebenfalls einfacher Ansatz besteht darin, Pixel in der umgekehrten Kamerabewegungsrichtung in einem Post-Processing-Pixel-Shader zu "verwischen".
Dave O.
6
Das Hauptproblem bei diesem Ansatz ist, dass es von der Framerate abhängt - es sieht ganz anders aus, wenn Sie mit 20 fps arbeiten, als wenn Sie mit 100 fps arbeiten. Solange Sie sich dessen bewusst sind und das gewünschte Ergebnis bei der Framerate erzielen, läuft es in Ordnung, aber Sie müssen sich dessen bewusst sein.
Maximus Minimus
19

Ich würde die Verwendung dieser Methode empfehlen: Bewegungsunschärfe als Nachbearbeitungseffekt

Sehr einfach zu implementieren, es ist das, was ich in meiner glsl-Demo verwendet habe. Ruin island [link]

kragniz
quelle
Diese Methode ist Blending in früheren Frames weit überlegen ...
Steven Lu
Diese Antwort enthält derzeit nur einen Link. Wenn die Verbindung in der Zukunft unterbrochen wird, wird niemand wissen, wie er sein Problem tatsächlich lösen kann. Versuchen Sie zumindest, die wesentlichen Informationen
Ja, machen wir eine Kopie des Internets, denn diese Kopie wird an keinem Tag
kaputt gehen