Ich mache ein Sprite-basiertes Spiel und habe eine Reihe von Bildern, die ich in einer lächerlich großen Auflösung bekomme. Ich skaliere sie auf die gewünschte Sprite-Größe (zum Beispiel 64x64 Pixel), bevor ich sie in eine Spielressource konvertiere Sprite im Spiel, ich muss es nicht skalieren.
Wenn ich dieses kleine Sprite jedoch innerhalb des Spiels drehe (motorunabhängig), werden einige Zielpixel interpoliert und das Sprite sieht verschmiert aus.
Dies hängt natürlich sowohl vom Drehwinkel als auch vom Interpolationsalgorithmus ab, aber unabhängig davon gibt es nicht genügend Daten, um ein bestimmtes Zielpixel korrekt abzutasten.
Ich kann mir also zwei Lösungen vorstellen. Das erste besteht darin, das riesige Originalbild zu verwenden, es in die gewünschten Winkel zu drehen und dann alle resultierenden Variationen zu verkleinern und sie in einen Atlas zu legen, der den Vorteil hat, dass er recht einfach zu implementieren ist, aber naiv doppelt so viel Sprite verbraucht Platz für jede Umdrehung (jede Umdrehung muss in einen Kreis eingeschrieben sein, dessen Durchmesser die Diagonale des Rechtecks des ursprünglichen Sprites ist, dessen Fläche doppelt so groß ist wie die des ursprünglichen Rechtecks, vorausgesetzt, es handelt sich um quadratische Sprites).
Es hat auch den Nachteil, dass nur ein vordefinierter Satz von Rotationen verfügbar ist, was je nach Spiel in Ordnung sein kann oder nicht.
Die andere Möglichkeit wäre also, ein größeres Bild zu speichern und es beim Rendern zu drehen und zu verkleinern, was zu meiner Frage führt.
Was ist die optimale Größe für dieses Sprite? Optimale Bedeutung, dass ein größeres Bild keine Auswirkungen auf das resultierende Bild hat.
Dies hängt definitiv von der Bildgröße ab, der Anzahl der gewünschten Umdrehungen ohne Datenverlust bis zu 1/256, was der minimal darstellbare Farbunterschied ist.
Ich suche nach einer theoretischen allgemeinen Antwort auf dieses Problem, da das Ausprobieren einer Reihe von Größen zwar in Ordnung ist, aber alles andere als optimal ist.
Antworten:
Ich denke, was Sie versuchen, ist der 2D-Bildraum, der einer doppelten Rundung entspricht . Ich kann einen losen Beweis dafür konstruieren, dass es unmöglich ist , eine solche Zwischengröße zu finden, zumindest bei einfachen Downscaling-Algorithmen wie der linearen Interpolation.
Angenommen, wir haben festgestellt
N
, dass das Zwischenbild eine Größe hatN×N
, die größer als ist64×64
. Angenommen, wir wenden noch nicht einmal eine Drehung an (Winkel ist Null).Lassen Sie uns nun ein Bild erstellen, das nicht funktioniert.
Erstellen des Zwischenbilds
Betrachten Sie ein vollständig schwarzes Zwischenbild. Natürlich wird auch das endgültige Bild vollständig schwarz sein. Fügen Sie dann ein graues Pixel mit minimaler Intensität hinzu (R¸G, B = 1,1,1). Das endgültige Bild sollte immer noch vollständig schwarz sein. Fügen Sie ein weiteres graues Pixel hinzu, das das erste berührt. Erstellen Sie einen Kreis, bis das endgültige Bild nicht mehr vollständig schwarz ist.
Bild 1
Jetzt ist ein Pixel im endgültigen Bild grau (wenn wir für immer fortfahren würden, wäre das resultierende Bild vollständig grau, sodass offensichtlich irgendwann ein Pixel grau wird), und wenn wir das letzte Pixel entfernen, ist es wieder vollständig schwarz.
Erstellen des Originalbildes
Betrachten Sie das hypothetische Originalbild, das zu unserem Zwischenbild geführt hat. Ich kann nicht beweisen, dass es existiert, aber ich habe das starke Gefühl, dass es existiert. Wenn das Originalbild beispielsweise eine Größe hat
2N×2N
, kann dies sein:Bild 2
Wenn Sie Bild 2 auf die mittlere Größe verkleinern, erhalten Sie Bild 1.
Und nach der Hypothese erhalten
64×64
wir beim Herunterskalieren auf einen grauen Punkt im endgültigen Bild.Lassen Sie uns nun das letzte Pixel, das wir hinzugefügt haben, auseinander brechen und im ursprünglichen Cluster verteilen:
Bild 3
Dies ist unser Gegenbeispiel.
Wenn dieses Bild auf die endgültige Größe verkleinert wird, sollte es ein graues Pixel ergeben, da die von uns gestreuten Pixel noch näher am Cluster liegen und die globale Intensität mindestens genauso hoch ist.
Wenn dieses Bild auf die mittlere Größe verkleinert wird, sollte das spezielle Pixel fehlen, da es verstreut ist, sodass wir bei der zweistufigen Größenänderung ein vollständig schwarzes Bild erhalten.
Schlussfolgerung und zukünftige Gedanken
Ich hoffe, das überzeugt Sie davon, dass das, was Sie erreichen wollen, im allgemeinen Fall nicht funktioniert.
Mein Ansatz für Ihr Problem wäre, die beste Größe pro Bild zu berechnen : Beginnen Sie mit dem Originalbild und z.
N = 128
Versuchen Sie dann alle möglichen Winkel und berechnen Sie den maximalen Fehler. Wenn der maximale Fehler nicht zufriedenstellend ist, versuchen Sie esN = 256
usw., bis Sie die richtige Größe erhalten.quelle