J'essaie d'appliquer du brouillard de guerre sur des zones de l'écran qui ne sont pas visibles pour le lecteur. Je le fais en rendant le contenu du jeu dans un RenderTarget
et le brouillard de la guerre dans un autre, puis je les fusionne avec un fichier d'effets qui prend la couleur du jeu RenderTarget
et l'alpha de la brume de la guerre rend la cible. Le FOW RenderTarget
est en noir lorsque le FOW apparaît et en blanc dans le cas contraire.Utiliser l'effet pour le brouillard de guerre
Cela fonctionne, mais il colore le brouillard de la guerre (les emplacements non révélés) en blanc au lieu de la couleur prévue du noir.
Avant d'appliquer l'effet, je vide le backbuffer de l'appareil en blanc. Quand j'essaie de le faire passer au noir, il n'apparaît pas du brouillard de la guerre, ce que je suppose être un produit de l'alpha mélangé avec le noir. Cela fonctionne pour toutes les autres couleurs, cependant - donnant à l'écran résultant une teinte de cette couleur.
Comment puis-je archiver un brouillard noir tout en étant capable d'effectuer un mélange alpha entre les deux cibles de rendu?
Le code de rendu pour l'application du FOW:
private RenderTarget2D mainTarget;
private RenderTarget2D lightTarget;
private void CombineRenderTargetsAndDraw()
{
batch.GraphicsDevice.SetRenderTarget(null);
batch.GraphicsDevice.Clear(Color.White);
fogOfWar.Parameters["LightsTexture"].SetValue(lightTarget);
batch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend);
fogOfWar.CurrentTechnique.Passes[0].Apply();
batch.Draw(
mainTarget,
new Rectangle(0, 0, batch.GraphicsDevice.PresentationParameters.BackBufferWidth, batch.GraphicsDevice.PresentationParameters.BackBufferHeight),
Color.White
);
batch.End();
}
Le fichier effet que je utilise pour appliquer la FOW:
texture LightsTexture;
sampler ColorSampler : register(s0);
sampler LightsSampler = sampler_state{
Texture = <LightsTexture>;
};
struct VertexShaderOutput
{
float4 Position : POSITION0;
float2 TexCoord : TEXCOORD0;
};
float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
float2 tex = input.TexCoord;
float4 color = tex2D(ColorSampler, tex);
float4 alpha = tex2D(LightsSampler, tex);
return float4(color.r, color.g, color.b, alpha.r);
}
technique Technique1
{
pass Pass1
{
PixelShader = compile ps_2_0 PixelShaderFunction();
}
}
Réponse très utile. J'ai eu un les concepts de l'alpha et du mélange foiré. My LightTarget RT est maintenant transparent dans les zones visibles, et complètement noir opaque partout ailleurs. Cela me permet d'utiliser une version modifiée de votre shader pour dessiner le fow. Au lieu de color.r * (1-fow.a) j'utilise fow.r * (1-fow.a). –