Ich habe versucht, mit XNA an einem Spiel mit dem Aussehen eines 8-Bit-Spiels zu arbeiten, insbesondere mit dem NES als Leitfaden.
Das NES hat eine sehr spezifische Palette und jedes Sprite kann bis zu 4 Farben aus dieser Palette verwenden. Wie könnte ich das emulieren? Derzeit habe ich eine Textur mit definierten Werten, die als Indizes für ein Array von Farben dienen, die ich an die GPU übergebe. Ich stelle mir vor, es muss einen besseren Weg geben, aber vielleicht ist dies der beste Weg?
Ich möchte nicht einfach sicherstellen, dass ich jedes Sprite mit den richtigen Farben zeichne, weil ich die Palette dynamisch ändern möchte. Ich würde es auch vorziehen, die Textur nicht direkt mit der CPU zu ändern.
Wäre es zu langsam, eine zusammengesetzte Klasse zu erstellen, die bis zu 4 Objekte enthalten kann, die jeweils eine Farbe für das Sprite haben, und diese zu dem Sprite zu kombinieren, das gezeichnet wird. Jedes Sprite besteht also aus bis zu 4 Sprites, die kombiniert und dann gezeichnet werden.
Dann könnten Sie über diese Klasse 1 Farbe ändern und das gesamte Sprite würde sich ändern.
(Beachten Sie, dass ich XNA noch nicht durchgeführt habe, aber dies könnte einige Ideen bei Ihnen auslösen.)
quelle
Wenn Sie sich überhaupt nicht für die Speicherleistung interessieren, können Sie Ihre Sprites unkomprimiert speichern, sodass Pixel mit der Farbe 0 rein rot, 1 rein grün, 2 rein blau und 3 rein alpha sind.
Wenn Sie ein Sprite rendern möchten, legen Sie eine Matrix-Pixel-Shader-Konstante fest, die aus vier Vektoren besteht, die den Farben 0, 1, 2, 3 entsprechen. Führen Sie im Pixel-Shader den folgenden Code aus, um das Sprite-Texel neu einzufärben:
Dies funktioniert, weil ein Pixel, wenn es die Farbe 0 hat, rein rot ist und daher als endet
oder
Gleiches gilt für die Farben 1, 2 und 3.
Wenn Sie sich für die Speicherleistung interessieren, speichern Sie Ihre NES-Palette auf jeden Fall als unkomprimierte 256x1-RGB-Textur, stellen Sie die Texturfilterung auf den nächsten Nachbarn ein, speichern Sie Ihre Sprites als unkomprimierte 8-Bit-Einkanaltexturen und führen Sie Shader-Code wie diesen aus ::
quelle