OpenGL 2D-Rasterisierungs-Subpixel-Übersetzungen


7

Ich habe eine kachelbasierte 2D-Engine, bei der die Projektionsmatrix eine orthografische Ansicht der Welt ist, ohne dass eine Skalierung angewendet wird. Also: Eine Pixelstruktur wird in gleicher Größe auf dem Bildschirm gezeichnet.

Das alles funktioniert gut und sieht gut aus, aber wenn die Kamera eine Subpixel-Bewegung macht, erscheinen kleine Linien zwischen den Kacheln. Ich kann Ihnen im Voraus sagen, was das Problem nicht behebt:

  • GL_NEAREST Texturinterpolation
  • GL_CLAMP_TO_EDGE

Das Problem wird behoben, indem die Kamera am nächsten Pixel verankert wird, anstatt eine Subpixel-Übersetzung durchzuführen. Ich kann damit leben, aber die Kamerabewegung wird ruckartig. Irgendwelche Ideen, wie man dieses Problem behebt, ohne auf den Rundungstrick zurückzugreifen, den ich derzeit mache?


Speichern Sie zufällig mehrere Kacheltexturen in einer großen Textur? Ich erinnere mich an ein ähnliches Problem, das durch OpenGL-Rendering von Pixeln aus benachbarten Kacheltexturen verursacht wurde. Am Ende habe ich es gelöst, indem ich jede Kachel auf ihre eigene Textur verschoben habe. Es ist allerdings eine Weile her, ich bin mir nicht sicher, ob das Problem mit GL_NEARESToder nur mit aufgetreten ist GL_LINEAR.
reko_t

Ich tue es, aber keine der vorgeschlagenen Lösungen für dieses spezielle Problem (GL_NEAREST) ​​hilft im geringsten. Auch die Rundungsfehler für Texturen würden bedeuten, dass ich benachbarte Pixel sehe, aber was ich sehe, ist der Hintergrund des Sprites, was mich zu der Idee führt, dass dies ein allgemeines Rasterungsproblem sein könnte.
Armin Ronacher

Antworten:


1

Um ein Ruckeln der Kamera zu vermeiden, sollten Sie die Gleitkommakoordinatenkamera beibehalten, aber die OpenGL- Projektion auf das nächste Pixel klemmen .


Wie funktioniert das? Die Projektionsmatrix wird nur einmal als orthografisches Projekt eingerichtet, es werden keine Änderungen in den Frames darauf angewendet.
Armin Ronacher

Tut mir leid, mir ist klar, dass ich überhaupt nicht klar bin. Ich wollte damit sagen, dass Sie versuchen sollten, die Ansichts- und Projektionsmatrizen so anzupassen, dass sie auf das nächste Pixel geklemmt werden, diese geklemmten Werte jedoch nicht in den Kameraparametern speichern, da sonst Fehler auftreten und Jitter auftreten. Wenn Sie dies bereits tun und die Kamera immer noch zittert, müssen wir mehr über Ihre Grafiken wissen: Handelt es sich um Pixelkunst oder schattierte Zeichnungen? Wie groß sind deine Modelle?
Sam Hocevar

Es ist ein 2d-Plattformer. Ich klemme gerade das Rendering auf Pixel, was gut funktioniert. Wenn ich das endgültige Bild nehme und Photoshop verwende, um das Bild um einen beliebigen Subpixelbetrag nach oben oder unten zu verschieben, erhalte ich genau das, was ich möchte -> sanfte Bewegung. Ich kann das in OGL tun, wenn ich es in einen FB rendere und dann übersetze. Wenn ich es mit der Modellansichtsmatrix mache, erscheinen Lücken zwischen Kacheln.
Armin Ronacher

Runden Sie auch Ihre Weltobjektkoordinaten, bevor Sie sie ebenfalls an OGL senden? Ich mache genau das für ein isometrisches Spiel und es funktioniert gut.
Sam Hocevar

0

Sie können diesen Blog-Beitrag über die Verwendung doubleanstelle von floatOpenGL-Matrizen sehen. Ich hatte ähnliche Probleme auf dem PC mit OpenGL, daher ist es nicht iPhone / OpenGL ES-spezifisch, obwohl der Blog-Beitrag OpenGL ES auf dem iPhone erwähnt.


Könnte der Down-Voter zumindest sein Down-Voting erklären? Meine Antwort ist informativ und schlägt eine Lösung für das Problem von OP vor.
jv42

0

Es kann sein, dass Sie bei der Berechnung der Koordinaten der Ecken der einzelnen Kacheln an Genauigkeit verlieren. Sie denken beispielsweise, dass sich der untere rechte Scheitelpunkt von Kachel 0 genau an der gleichen Stelle befindet wie der untere linke Scheitelpunkt von Kachel 1, aber tatsächlich nicht. Eine Idee, dies zu beheben, besteht darin, zu Beginn ein temporäres Koordinatengitter zu berechnen und dann die entsprechende Position beim Erstellen der Kachelgeometrie zu kopieren. Ist das sinnvoll?

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.