2010-12-08 3 views
3

Попытка сделать эффект свечения в xna, но это не показывает свечение или любые изменения вообще. Кроме того, моя спина цвет фиолетовый вместо черного, и я не могу изменить, что либо:Проблема с xna shader

 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(); 
    } 
} 
+0

Какая ошибка вы получаете? – 2010-12-08 13:45:28

+0

Нет, он просто не работает, он показывает нормальный игровой процесс, за исключением черного заднего экрана, который становится фиолетовым. – Xyro 2010-12-08 16:22:31

ответ

2

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

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, но вам нужно попробовать, вы также можете посмотреть, как сделать цветной шейдер, как правило, дает хороший эффект.

Смежные вопросы