C# 如何更改特定精灵纹理的颜色?

C# 如何更改特定精灵纹理的颜色?,c#,colors,xna,sprite,textures,C#,Colors,Xna,Sprite,Textures,现在,我在我的sprite类中使用一个名为SetTextour的函数: public void SetTextureColour(Color Colour) { Color[] data = new Color[Texture.Width * Texture.Height]; Texture.GetData(data); for (int i = 0; i < data.Length; i++) {

现在,我在我的sprite类中使用一个名为SetTextour的函数:

    public void SetTextureColour(Color Colour)
    {
        Color[] data = new Color[Texture.Width * Texture.Height];
        Texture.GetData(data);

        for (int i = 0; i < data.Length; i++)
        {
            if (data[i] == Color.White)
            {
                data[i] = Colour;
            }
        }
        Texture.SetData(data);
    }
然后使用这两行设置值-

        Effect1.Parameters["key_color"].SetValue(Color.White.ToVector3());
        Effect1.Parameters["new_color"].SetValue(Color.Red.ToVector3());
但这似乎没什么用,有没有可能有人能帮我?正如我所说,这是第一次使用着色器,因此我可以使用一些辅助工具


最后一件事,效果是在spriteBatch.Begin中使用的,因此这不是没有应用效果的问题。

您可以使用一个着色器来为您执行此操作

sampler texture : register(s0);
float3 key_color = float3(1,1,1);
float3 new_color;

float4 pixel_shader_that_replaces_color(in float4 color:COLOR0, in float2 coords:TEXCOORDS) : COLOR0
{
      float4 color = tex2D(texture, coords);
      if (distance(key_color, color.rgb)<0.001f)
      {
         color.rgb = new_color;
      } 
      return color;
} 
你必须给雪碧打电话。从你想要的每种新颜色开始。。但我认为这比设置纹理数据要好


警察局:我正在写代码。。。它需要一些额外的工作。。。就像你可以找到的顶点着色器一样,但这些是最基本的:)

感谢回答我问题的人和facepunch上的人的帮助,我找到了解决方案-

sampler TextureSampler : register(s0);
float3 key_color;
float3 new_color;

float4 ChangePixel(float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
  {
    float4 newColor = tex2D(TextureSampler, texCoord);

  if (distance(key_color, newColor.rgb)<0.001f)
  {
     newColor.rgb = new_color;
  } 

  return newColor * color;
} 

technique PixelChange
{
    pass Pass0
    {
       PixelShader = compile ps_2_0 ChangePixel();
   }
}

关键颜色设置要搜索的颜色,新颜色是要替换的颜色,谢谢大家的帮助

你不能让精灵共享一个纹理,如果他们需要在该纹理中有不同的像素(如果你仔细想想,这是很明显的)。答案(也很明显)是使用单独的纹理。我想应该是这样,但无论如何还是值得一试。谢谢。+1如果你对着色器有一个有效的了解,那么着色器是个好主意。正如你所建议的,我尝试实现一个着色器,但它不起作用,如果你检查我刚刚编辑的问题,你能帮我解决更多问题吗?谢谢。我已将链接更改为正确的示例,其中您有spritebatch使用的spriteeffect.fx和spriteeffect.cs。。。你只需要修改它,应该可以工作…谢谢你的帮助,我现在已经让着色器工作了,并将其作为一个答案发布,再次感谢。嗯。。。我看到你是这个网站的新手,但我认为你应该把这个答案标记为正确的。。。
sampler texture : register(s0);
float3 key_color = float3(1,1,1);
float3 new_color;

float4 pixel_shader_that_replaces_color(in float4 color:COLOR0, in float2 coords:TEXCOORDS) : COLOR0
{
      float4 color = tex2D(texture, coords);
      if (distance(key_color, color.rgb)<0.001f)
      {
         color.rgb = new_color;
      } 
      return color;
} 
 effect.SetValue("key_color", Color.White.ToVector3());
 effect.SetValue("new_color", yourcolor.ToVector3());
 spritebatch.Begin(-...., , ,, effect);
     // Inside this all your texture pixels with Color.White will be replaced to newColor
 spritebatch.End()
sampler TextureSampler : register(s0);
float3 key_color;
float3 new_color;

float4 ChangePixel(float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
  {
    float4 newColor = tex2D(TextureSampler, texCoord);

  if (distance(key_color, newColor.rgb)<0.001f)
  {
     newColor.rgb = new_color;
  } 

  return newColor * color;
} 

technique PixelChange
{
    pass Pass0
    {
       PixelShader = compile ps_2_0 ChangePixel();
   }
}
        Effect1.Parameters["key_color"].SetValue(Color.White.ToVector3());
        Effect1.Parameters["new_color"].SetValue(Color.Aqua.ToVector3());