从 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 文档)
我应该如何从 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 文档)