Wie ändere ich die Farbe eines Sprites?


7

In meinem Rhythmus-Spiel habe ich ein Notenobjekt, das je nach Notendiagramm eine andere Farbe haben kann. Ich könnte ein Sprite-Blatt mit all den verschiedenen Farbvarianten verwenden, die ich verwende, aber ich würde es vorziehen, dies zu parametrisieren. (Jedes Noten-Sprite besteht aus verschiedenen Farbtönen. Beispielsweise hat eine rote Note nur Rot, Hellrot und Dunkelrot.)

Wie kann ich ein Sprite neu einfärben?

Ich arbeite mit OpenGL, aber jeder Algorithmus oder jede mathematische Erklärung reicht aus. :) :)

Antworten:


8

Ich würde wahrscheinlich ein einfarbiges Bild (z. B. Ihr Noten-Sprite) mit Alphakanal verwenden und dann das gesamte Bild mit Ihrer Grundfarbe ausmalen. Also so etwas wie im folgenden Bild ( von Wikimedia Commons ):

Bild einer Musiknote

Wenn Ihre Farbe rot wäre, würden Sie die Note (alle schwarzen Teile) mit demselben Rot färben. Was Sie zusätzlich benötigen würden, ist ein Graustufenbild mit der Schattierung der Note. Kombinieren Sie dann die Schattierung mit der flachen Farbe, indem Sie Mischmodi wie Multiplizieren und / oder Bildschirm verwenden .

Ein anderer, wahrscheinlich einfacherer Ansatz wäre, nur ein Graustufenbild zu haben, in dem Sie jede Farbkomponente mit Ihrer ausgewählten Farbe multiplizieren würden. Wenn Sie also einen Grauwert von 0.5und eine rote Farbe RGB(1.0, 0.0, 0.0)haben, würde dies dazu führenRGB(0.5, 0.0, 0.0) für das angegebene Pixel ergeben.

Update: Hier ist ein Beispielbild, um zu veranschaulichen, was ich mit den Mischmodi meine:

Schichten mischen

Natürlich können Sie auch die Schattenebene verwenden, wenn Sie die Glanzlichter nicht benötigen (was im Grunde dem oben erwähnten einfacheren Ansatz entspricht).


2
Das ist so unangebracht, aber ich muss fragen - wie hast du das zweite Bild gemacht?
DMan

@ DMan Photoshop für die verschiedenen Notizbilder und dann Illustrator, um Sachen zu arrangieren;)
bummzack

Danke für Ihre Erklärung. :) Ist es möglich, die Mischung in einen Fragment-Shader zu machen? Oder ist es vorzuziehen, bei der OpenGL-Mischfunktion zu bleiben und die 3 Bilder separat zu rendern?
Mr_Qqn

Ich bin kein Shader-Experte, aber nach meinem begrenzten Wissen würde ich sagen, dass es kein Problem sein sollte. Alternativ können Sie auch die benötigten Bilder auf der CPU vorberechnen?
Bummzack

Ja, im Moment werde ich ein Sprite-Blatt mit allen Variationen erstellen.
Mr_Qqn

3

Erstellen Sie eine Graustufenversion (oder nur eine weiße Version) des Bildes, das Sie anzeigen möchten, mit einem geeigneten Alphakanal. Verwenden Sie die Scheitelpunktfarbe, um das Bild zu "färben".

Die Scheitelpunktfarbe multipliziert jeden Kanal, also weiß x rot = rot, 50% grau x rot = 50% rot und so weiter.


Das Problem dabei ist, dass die Schattierung bei Verwendung heller Farben (z. B. Gelb) nicht erkennbar ist.
Bummzack

Nicht sicher was du meinst. Schwarz oder sehr dunkelgrau im Graustufenbild multipliziert mit sehr hellem Gelb ist immer noch schwarz oder sehr dunkelgelb.
Ggambett

Übrigens, es tut mir leid, ich hatte den "wahrscheinlich einfacheren Ansatz" in Ihrer Antwort nicht gesehen.
Ggambett

1
Sie haben Recht mit der Multiplikation. Ich habe die Dinge durcheinander gebracht. Kaffeemangel, denke ich.
Bummzack

Vielen Dank für Ihre Antwort, aber da ich opengl 3 lerne, würde ich lieber die andere Methode verwenden. :)
Mr_Qqn
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.