Schon wieder DX Graphics: Figur einfärben?



  • Hat jemand eine Idee, wie ich Figuren in verschiedene Spielerfarben einfärben kann? - Ich nicht. 😃

    Ne, also Ernsthaft:
    Ich benutze zur Grafikausgabe Sprite-Funktionen und ich überleg mir gerade, wie ich eine Figur an einer bestimmten Stelle z.B. Blau einfärben kann. Wenn ich das über die Farbkanäle mache, wird die komplette Figur eingefärbt. Dieses Verfahren nutze ich bereits für andere Sachen, aber bei den Figuren sollen ja nur bestimmte Teile (z.B. alles was weiß oder was auch immer ist) eingefärbt werden.
    Es wäre nämlich ein ziemlich großer Aufwand, jedes Bild in allen Farben anzufertigen. Früher hab ich das mit der GDI beim Spielstart einmal gemacht, aber ich sehe (im Moment jedenfalls) keine Möglichkeit die GDI zu nutzen (siehe anderer Thread).



  • *push* 😕



  • Alle nicht einzufärbende Stellen der Textur per Alphakanal durchsichtig machen, dann ein Pass mit AlphaBlending und Färbung rendern.



  • Alle nicht einzufärbende Stellen der Textur per Alphakanal durchsichtig machen

    Wie kann ich das machen, ohne ein zweites Bild als Maske zu verwenden?



  • Ich hör hier immer "Bild", wobei du doch eigentlich mit Texturen arbeiten müsstest. Die Textur muss ein Format mit Alphakanal haben.



  • Natürlich sind es Texturen, aber sie stellen eben ein komplettes Bild da. Du darfst nicht vergessen, ich arbeite ausschließlich mit Sprite-Funktionen, das wird ein 2D-Spiel.
    Also um mal ein Beispiel zu geben, so lade ich meine Textur:

    D3DXCreateTextureFromFileEx(lpDevice, "Grafik/Figur.bmp", D3DX_DEFAULT, D3DX_DEFAULT, 1, 0, D3DFMT_A8R8G8B8,
    D3DPOOL_DEFAULT, D3DX_FILTER_NONE, D3DX_FILTER_NONE, 0xFFFF00FF, NULL, NULL, &circleTexture);
    

    0xFFFF00FF ist der ColorKey, alles was Pink ist, wird komplett ausgeblendet.
    Bis dahin ist nichts besonders.
    Ich brauche jetzt aber noch eine zweite Farbe, die nicht ausgeblendet wird, sondern beim Rendern umgefärbt wird. Ich will ja nicht das komplette Bild färben, das könnte ich mit dem letzten Parameter (Funktion unten) machen. Ich benutze folgenden Code zum rendern:

    lpSprite->Draw(circleTexture, NULL, NULL, NULL, NULL, &D3DXVECTOR2(x, y), 0xFFFFFFFF);
    


  • Ich kenne deine Sprite Klasse nicht. Wenn du natürlich für das Ausblenden des Colorkeys schon die Alpha verbrätst, kannst du sie schlecht auch noch für das Einfärben nehmen. Ist dies der Fall?

    Bye, TGGC



  • Ja das ist der Fall. Ich kann zwar beim Blitten nochmal nen ARGB Wert angeben, aber dadurch wird ja die ganze Figur verändert. Und den ColorKey brauch ich natürlich.
    Anscheinend komme ich wohl nicht drum herum, für jede Textur nochmal eine Maske zu erstellen, die ich dann mit der Spielerfarbe drüberlege.



  • Ich weiß nicht wie es mit den ganzen Formaten aussieht aber Photoshop kann ja soweit ich weiß "unbegrenzt" viele Kanäle erstellen. Vielleicht gibt es ja ein Format was mehrere Alphakanäle benutzen kann. Wenn nicht gäbe es ja noch die Möglichkeit ein eigenes Format zu schreiben wobei dann da nen eigener Loader zugehört. Vielleicht dann auf dem TGA Format aufbauend nur + 2. Alphakanal.



  • Ich habe gesagt es geht schlecht, nicht das es unmöglich ist. Mehrere Alphakanäle würde ich nicht nehmen, dann müsstest du die selbst orgnisieren und dann auch per PS auslesen, da es AFAIK keine Hardware gibt, die sowas unterstützt.

    Aber man könnte evtl. mit den Renderstates was hintricksen. z.b. Einmal Halbtransparentes per Modulate2x einblenden und dann wieder per Alphatest ausblenden.



  • Dann werd ich glaub ich doch Masken nehmen, die sind ja recht schnell erstellt. Irgendwo muss das Ergebnis ja auch noch in einem akzeptablen Verhältnis zum Aufwand stehen... 😕

    thx


Anmelden zum Antworten