2010-12-08 8 views
3

Vous essayez d'obtenir un effet de lueur dans xna, mais il ne montre aucune lueur ou aucun changement. Aussi ma couleur dos est violet au lieu de noir et je ne peux pas changer cela soit:Problème avec le shader 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(); 

Je suis seulement essayer d'obtenir les balles à briller.

shaders:

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

Quelle est l'erreur que vous obtenez? –

+0

Aucun, ça ne marche pas ça montre le gameplay normal sauf pour le backscreen noir, qui devient violet – Xyro

Répondre

2

La raison pour laquelle il est violet est parce que vous avez

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

qui devrait être l'inverse, changeant ainsi que dans

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

fixe le violet problème, pour corriger le shader changer la suite dans le fichier fx

sampler ColorMapSampler : register(s0); 

Et changer votre spriteBatch.Begin() en

spriteBatch.Begin(SpriteSortMode.Immediate, null); 

Quelques infos supplémentaires:

les s0 des points à la première texture sur le dispositif graphique, qui est celui qui a fourni par spriteBatch.Draw, si vous voulez pour utiliser s1 vous devez le définir sur le GraphicsDevice d'abord en utilisant:

GraphicsDevice.Textures[1] = bulletRenderTarget; 
Le SpriteSortMode.Immediate

force le spriteBatch.Draw à dessiner le sprite immédiatement, si vous ne le définissez pas il va créer un lot et les dessiner tous à la fois, mais ce sera trop tard car il doit être dessiné quand le EffectPass est en cours d'application. En ce qui concerne le flou, vous pouvez réduire la valeur de BlurDistance, mais vous devez essayer, vous pouvez également regarder comment faire un shader bloom, donne généralement un bel effet aussi.

+0

Merci pour tout ça, pourriez-vous élaborer sur le registre et le spritesortmode, qu'est-ce que ça fait exactement? Aussi comment puis-je réduire mon flou, je l'ai seulement brouillé parce que je voulais que les balles brillent, mais maintenant mes balles brillent et floutent – Xyro

+0

@Quincy Ajouté à la réponse – Doggett

+0

Merci, j'espère que la floraison semble un peu mieux:) – Xyro