【问题标题】:How to change the Colours of a specific Sprites Texture?如何更改特定 Sprites 纹理的颜色?
【发布时间】:2012-07-22 05:30:52
【问题描述】:

现在我在我的精灵类中使用了一个名为 SetTextureColour 的函数:

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

要将精灵纹理中每个白色像素的颜色更改为指定颜色,这可以正常工作,但我遇到的问题是它会更改共享该纹理的每个精灵的颜色,而不仅仅是单个精灵的颜色。有没有人有一个解决方案,这样我就可以只改变那个精灵纹理的像素,所以我可以使用为具有相同纹理的多个精灵指定不同颜色的函数。

提前致谢。

编辑:

根据建议,我尝试使用像素着色器来执行此操作,尽管在尝试这样做之前我从未使用过它们,但到目前为止我已经按照建议使用了 -

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, color.rgb)<0.001f)
  {
     color.rgb = new_color;
  } 

  return newColor;
} 

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

它是使用加载内容加载的,我也使用这个设置它的技术-

        Effect1.CurrentTechnique = Effect1.Techniques["PixelChange"];

然后我使用这两行设置值-

        Effect1.Parameters["key_color"].SetValue(Color.White.ToVector3());
        Effect1.Parameters["new_color"].SetValue(Color.Red.ToVector3());

但它似乎什么也没做,有没有人可以帮助我解决这个问题?正如我所说,这是第一次使用着色器,所以我可以使用一些帮助。

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

【问题讨论】:

  • 如果精灵需要在该纹理中具有不同的像素,则不能让精灵共享该纹理(如果您考虑一下,这很明显)。答案(也很明显)是使用单独的纹理。
  • 以为会是这样,但还是值得一试。谢谢。

标签: c# colors xna sprite textures


【解决方案1】:

你可以使用一个着色器来为你做这件事……

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()

你必须为你想要的每个 new_color 调用 sprite.Begin.. 但我认为比设置纹理数据更好......

PD:我正在即时编写代码...它需要一些额外的工作...例如您可以找到 inside the stock sample 的顶点着色器,但这些是基础知识 :)

【讨论】:

  • +1 如果您对着色器有一定的了解,那么着色器是个好主意
  • 正如你所建议的,我尝试实现一个着色器,但它没有成功,因为如果你检查我刚刚编辑的问题,你可以看到,你可以帮助我更多吗?谢谢。
  • 我已将链接更改为正确的示例,您可以在其中拥有 spritebatch 使用的 spriteeffect.fx 和 spriteeffect.cs...您只需修改它并且应该可以工作...
  • 感谢您的帮助,我现在让着色器工作,并将其发布为答案,再次感谢。
  • em...我知道您是该网站的新手,但我认为您应该将此答案标记为正确...
【解决方案2】:

感谢回答我问题的人和 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();
   }
}

要使用着色器,请使用 -

        Effect1.Parameters["key_color"].SetValue(Color.White.ToVector3());
        Effect1.Parameters["new_color"].SetValue(Color.Aqua.ToVector3());

key color 设置要搜索的颜色,新的颜色就是要替换的颜色,谢谢大家的帮助!

【讨论】:

    猜你喜欢
    • 2017-12-31
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 2023-03-11
    相关资源
    最近更新 更多