Я пытаюсь применить туман войны к областям на экране, которые в настоящее время не видны игроку. Я делаю это, предоставляя игровое содержимое в одном RenderTarget
и туман войны в другой, а затем я объединять их с файлом эффекта, который берет цвет из игры RenderTarget
и альфа из тумана войны. FOW RenderTarget
черный, где появляется FOW, а белый - там, где нет.Использование эффекта для тумана войны
Это действительно работает, но оно окрашивает туман войны (нераскрытые местоположения) в белый цвет вместо намеченного цвета черного.
Перед тем, как применить эффект, я очищаю буферный блок устройства до белого. Когда я пытаюсь очистить его до черных, вообще не появляется туман войны, который, как я полагаю, является продуктом альфа-смешивания с черным. Тем не менее, он работает для всех других цветов, придавая результирующему экрану оттенок этого цвета.
Как архивировать черный туман, сохраняя при этом возможность альфа-смешивания между двумя объектами рендеринга?
Код рендеринга для применения 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();
}
Файл эффект я использую, чтобы применить 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();
}
}
Очень полезный ответ. У меня были понятия альфы и смешивания. Мой LightTarget RT теперь прозрачен в видимых областях и полностью непрозрачен черным везде. Это позволяет мне использовать модифицированную версию вашего шейдера, чтобы нарисовать фову. Вместо color.r * (1-fow.a) Я использую fow.r * (1-fow.a). –