Wie soll ich von Windows.UI.Color nach System.Numerics.Vector4 konvertieren?

Colors.White sollte Vector4.One sein, aber für die anderen Farben? Ich brauche das, weil die Win2D-Methode CanvasSpriteBatch.DrawFromSpritesheet einen Vector4 (Farbton) als Farbparameter akzeptiert.

Ich denke, diese Funktion könnte sein wie:

    private static Vector4 ColorToVector4(Color Color)
    {
        // a, r, g, b purely nominal
        return new Vector4(a, r, g, b);
    }
0
Francesco Bonizzi 27 Dez. 2015 im 22:59

2 Antworten

Beste Antwort

Die für Sprite-Chargen verwendeten Vector4-Farbtöne sind 4 Floats, RGBA. Die Farbe in der Quellbitmap wird mit dem Farbtonwert multipliziert.

Vector4.One gibt Ihnen also die gleiche Farbe wie in der Quellbitmap. Vector4 (2,1,1,1) färbt es rot.

Dieser Code konvertiert eine Farbe in einen Vector4:

private static Vector4 ToVector4(Color color)
{
    return new Vector4(
        (float)Color.R / 255.0f,
        (float)Color.G / 255.0f,
        (float)Color.B / 255.0f,
        (float)Color.A / 255.0f);
}

(Ich werde dafür sorgen, dass die Win2D-Dokumentation mit diesen Informationen aktualisiert wird.)

2
Damyan 28 Dez. 2015 im 17:40

Sooo ... Wenn Vector4.One weiß sein sollte, dann sollte Vector4.Zero schwarz mit null Alpha sein. Windows.UI.Color scheint ARGB-Werte als Bytes zu enthalten, die jeweils einen numerischen Wert zwischen 0 und 255 haben. Konvertieren Sie das Byte einfach in seinen numerischen Wert und dividieren Sie es durch 255.

Etwas wie

private static Vector4 ColorToVector4(Color Color)
{
  return new Vector4(
                 ColorToFloat(Color.A), 
                 ColorToFloat(Color.R), 
                 ColorToFloat(Color.G), 
                 ColorToFloat(Color.B));
}

private static float ColorToFloat(byte col)
{
  return BitConverter.ToInt16(new byte[1] { col }, 0) / 255f;
}
0
Simo Erkinheimo 27 Dez. 2015 im 21:57