我有一个带有白色轮廓的弹出纹理,我希望白色轮廓根据当前主题改变颜色。
不幸的是,SpriteBatch.Draw()
用我想要的色调调用所有不透明的像素,而我想要的是只着色(在这种情况下)白色像素。
我有一个带有白色轮廓的弹出纹理,我希望白色轮廓根据当前主题改变颜色。
不幸的是,SpriteBatch.Draw()
用我想要的色调调用所有不透明的像素,而我想要的是只着色(在这种情况下)白色像素。
使用两个纹理怎么样?一个只包含白色边框(所有其他像素都是透明的),一个包含弹出纹理。然后,您可以使用 将色调应用于边框纹理SpriteBatch.Draw(borderTex,borderTex.Bounds,tintColor)
,并执行附加SpriteBatch.Draw(tex,tex.Bounds,Color.White)
以在结果顶部对弹出纹理进行 blit。这样做的好处是您的绘图操作不受 CPU 限制(就像您发布的解决方案一样),因为 SpriteBatch 可以利用您的GraphicsDevice (GPU)。
So I ended up doing it this way, even though it's not that efficient. Thankfully I do it only once and during the LoadContent().
texture = content.Load<Texture2D>("popup");
Color[] colors = new Color[texture.Width * texture.Height];
texture.GetData(colors);
for (int i = 0; i < colors.Length; i++)
{
if (colors[i] == Color.White)
{
colors[i] = PhoneTheme.Current.PhoneAccentColor;
}
}
texture.SetData(colors);