Проблема с шейдером xna - PullRequest
       48

Проблема с шейдером xna

3 голосов
/ 08 декабря 2010

Попытка создать эффект свечения в xna, но он не показывает свечения или каких-либо изменений.Также мой цвет спины - фиолетовый вместо черного, и я тоже не могу его изменить:

        GraphicsDevice.Clear(Color.Black);
        GraphicsDevice.SetRenderTarget(bulletRenderTarget);
        spriteBatch.Begin();
        foreach (Bullet bullet in bulletList)
        {
            Texture2D bulletTexture = textures[bullet.bulletType];

            spriteBatch.Draw(
                bulletTexture,
                new Rectangle(
                    (int)bullet.position.X,
                    (int)bullet.position.Y,
                    bulletTexture.Width,
                    bulletTexture.Height
                ),
                null,
                Color.White,
                MathHelper.ToRadians(bullet.angle),
                new Vector2(
                    bulletTexture.Width / 2,
                    bulletTexture.Height / 2
                ),
                SpriteEffects.None,
                0
            );
        }
        spriteBatch.End();

        GraphicsDevice.SetRenderTarget(null);
        GraphicsDevice.Clear(Color.Black);
        postProcessEffect.CurrentTechnique = postProcessEffect.Techniques["Blur"];

        spriteBatch.Begin();
            spriteBatch.Draw(
            bulletRenderTarget,
            new Vector2(0, 0),
            Color.White
        );
        GraphicsDevice.BlendState = BlendState.Additive;
        foreach (EffectPass pass in postProcessEffect.CurrentTechnique.Passes)
        {
            pass.Apply();
            spriteBatch.Draw(
                bulletRenderTarget,
                new Vector2(0,0),
                Color.White
            );
        }

        DrawHud();
        foreach (BaseEntity entity in entityList)
        {
            entity.Draw(gameTime);
        }
        spriteBatch.End();

Я только пытаюсь заставить пули светиться.

 float BlurDistance = 0.002f;
 sampler ColorMapSampler : register(s1);

 float4 PixelShaderFunction(float2 Tex: TEXCOORD0) : COLOR
 {
  float4 Color;

  // Get the texel from ColorMapSampler using a modified texture coordinate. This
  // gets the texels at the neighbour texels and adds it to Color.
  Color  = tex2D( ColorMapSampler, float2(Tex.x+BlurDistance, Tex.y+BlurDistance));
  Color += tex2D( ColorMapSampler, float2(Tex.x-BlurDistance, Tex.y-BlurDistance));
  Color += tex2D( ColorMapSampler, float2(Tex.x+BlurDistance, Tex.y-BlurDistance));
  Color += tex2D( ColorMapSampler, float2(Tex.x-BlurDistance, Tex.y+BlurDistance));
  // We need to devide the color with the amount of times we added
  // a color to it, in this case 4, to get the avg. color
  Color = Color / 4; 

  // returned the blurred color
  return Color;
 }

 technique Blur
 {
  pass Pass1
  {
   PixelShader = compile ps_2_0 PixelShaderFunction();
  }
 }

1 Ответ

2 голосов
/ 08 декабря 2010

Причина, по которой он фиолетовый, заключается в том, что у вас есть

GraphicsDevice.Clear(Color.Black);
GraphicsDevice.SetRenderTarget(bulletRenderTarget);

, который должен быть наоборот, поэтому изменение его на

GraphicsDevice.SetRenderTarget(bulletRenderTarget);
GraphicsDevice.Clear(Color.Black);

устраняет проблему с пурпуром, чтобы исправить шейдеризмените следующее в fx файле

sampler ColorMapSampler : register(s0);

и измените свой spriteBatch.Begin() на

spriteBatch.Begin(SpriteSortMode.Immediate, null);

Некоторая дополнительная информация:

s0 указывает на первыйтекстура на графическом устройстве, которая поставляется с spriteBatch.Draw, если вы хотите использовать s1, вам нужно сначала установить ее на GraphicsDevice, используя:

GraphicsDevice.Textures[1] = bulletRenderTarget;

SpriteSortMode.Immediate просто заставляет spriteBatch.Draw немедленно нарисовать спрайт, если вы не установите его, он создаст пакет и отрисовает их все сразу, но это будет слишком поздно, потому что его нужно рисовать, когдаEffectPass применяется.

Что касается размытия, вы можете уменьшить значение BlurDistance, но вам придется попробовать, вы также можете посмотреть, как сделать шейдер Блума, обычно даетхороший эффект тоже.

...