Das Bild unten zeigt zwei Sprites, die mit Punktabtastung auf einem Hintergrund gerendert wurden:
- Auf den linken Schädel wird keine Drehung / Skalierung angewendet, sodass jedes Pixel perfekt zum Hintergrund passt.
- Der rechte Schädel wird gedreht / skaliert, was zu größeren Pixeln führt , die nicht mehr achsenausgerichtet sind .
Wie könnte ich einen Pixel-Shader entwickeln, der das transformierte Sprite auf der rechten Seite mit achsenausgerichteten Pixeln der gleichen Größe wie der Rest der Szene rendert?
Dies könnte damit zusammenhängen, wie die Sprite-Skalierung in alten Spielen wie Monkey Island implementiert wurde, da dies der Effekt ist, den ich erreichen möchte, aber mit hinzugefügter Rotation.
Bearbeiten
Gemäß den Vorschlägen von kaoD habe ich versucht, das Problem als Nachbearbeitung anzugehen. Der einfachste Ansatz bestand darin, zuerst auf ein separates Renderziel zu rendern (heruntergerechnet, um der gewünschten Pixelgröße zu entsprechen) und es dann beim zweiten Rendern zu vergrößern. Es hat meine Anforderungen oben angesprochen.
Zuerst habe ich es versucht Linear -> Point
und das Ergebnis war folgendes:
Es gibt keine Verzerrung, aber das Ergebnis sieht unscharf aus und es verliert die meisten Glanzlichterfarben. Meiner Meinung nach bricht es den Retro-Look, den ich brauchte.
Das zweite Mal habe ich es versucht Point -> Point
und das Ergebnis war folgendes:
Trotz der Verzerrung denke ich, dass dies für meine Bedürfnisse gut genug sein könnte, obwohl es als Standbild besser aussieht als in Bewegung.
Zur Demonstration hier ein Video des Effekts, obwohl YouTube die Pixel herausgefiltert hat:
Ich werde die Frage jedoch noch einige Tage offen lassen, falls jemand eine bessere Sampling-Lösung findet, die das gestochen scharfe Aussehen beibehält und gleichzeitig die Verzerrung beim Bewegen verringert.
quelle
SpriteBatch
erfordert die Verwendung des Sofortmodus, sodass sich die Mühe nicht lohnt. Ich werde damit gehen :)Antworten:
Sie sollten Ihren Shader anwenden, nachdem Ihr Sprite gedreht wurde.
Wenn die gesamte Szene noch nicht schattiert wurde und Ihre Sprites tatsächlich pixelig sind, benötigen Sie eine Art Post-FX-Filter für Ihre gesamte Szene. Die Mittelung von Pixelbereichen funktioniert einwandfrei. Es ist nicht genau das, was Sie beabsichtigen (es wird beim Bewegen / Drehen etwas schwanken), aber es könnte den Trick tun.
Die einzige Möglichkeit, diesen Retro-Look wahrheitsgetreu zu halten, besteht darin, Ihre Sprite-Rotationen selbst zu zeichnen. Es hat nichts damit zu tun, wie die Skalierung implementiert wurde: Die Auflösung war tatsächlich schlecht. Apropos, haben Sie es mit extrem niedrigen Auflösungen versucht? Es könnte auch den Trick machen und wird natürlicher aussehen, da es tatsächlich den Effekt verursacht hat, den Sie suchen. Und es ist billig! Sehr günstig! Tatsächlich ist es billiger als das, was Sie bereits haben (weniger Fragment-Shader-Ausführungen).
Der Effekt ist in Ihrem Beispielbild ruiniert, da Ihre Auflösung im Vergleich zu Ihren Sprites hoch ist, sodass Sie die realen Pixel in der Szene sehen können.
quelle
SpriteBatch
. Aber ein Post-FX könnte wirklich funktionieren. Für den Anfang werde ich versuchen, mit linearer Abtastung auf ein Renderziel zu rendern und dann das gesamte Renderziel mit Punktabtastung auf den Backbuffer zu rendern.