从 Windows.UI.Color 转换为 System.Numerics.Vector4 的正确且快速的方法

Correct and fast way to convert from a Windows.UI.Color to System.Numerics.Vector4

我应该如何从 Windows.UI.Color 转换为 System.Numerics.Vector4?

Colors.White应该是Vector4.One,但是其他颜色呢?我需要这个,因为 Win2D 的方法 CanvasSpriteBatch.DrawFromSpritesheet 接受 Vector4(色调)作为颜色参数。

我认为这个函数可能是这样的:

    private static Vector4 ColorToVector4(Color Color)
    {
        // a, r, g, b purely nominal
        return new Vector4(a, r, g, b);
    }

Sooo...如果 Vector4.One 应该是白色,那么我猜 Vector4.Zero 应该是黑色且 alpha 为零。 Windows.UI.Color 似乎将 ARGB 值保存为字节,每个值都在 0-255 之间。所以只需将字节转换为数值并除以 255.

类似

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;
}

用于精灵批次的 Vector4 色调是 4 个浮点数,RGBA。源位图中的颜色乘以色调值。

因此 Vector4.One 为您提供与源位图中相同的颜色。 Vector4(2,1,1,1) 会将其染成红色。

此代码会将颜色转换为 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);
}

(我会安排使用此信息更新 Win2D 文档)