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.
SpriteBatch
erfordert die Verwendung des Sofortmodus, sodass sich die Mühe nicht lohnt. Ich werde damit gehen :)