0

現在、私のスプライトクラスで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"];

次に、これらの2行を使用して値を設定します-

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

しかし、それは何もしないようです、誰かがこれで私を助けることができる可能性はありますか?私が言ったように、シェーダーを使用するのはこれが初めてなので、いくつかの援助を使用することができました。

最後に、エフェクトはspriteBatch.Beginで使用されるため、エフェクトが適用されていないかどうかは問題ではありません。

4

2 に答える 2

2

あなたはあなたのためにそれをするシェーダーを使うことができます...

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

spriteを呼び出す必要があります。必要なnew_colorごとに開始します。ただし、テクスチャデータを設定するよりも優れていると思います。

PD:私はその場でコードを書いています...それはいくつかの追加の作業が必要です...あなたがストックサンプルの中に見つけることができる頂点シェーダーのように、しかしこれらは基本です:)

于 2012-07-24T13:40:42.350 に答える
0

私の質問に答えてくれた人々とフェイスパンチの人たちの助けのおかげで、私は解決策を持っています-

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

キーカラーは検索する色を設定し、新しい色はそれを置き換える色です。皆さんの助けに感謝します!

于 2012-07-24T23:10:16.277 に答える