我試圖將戰爭迷霧應用到屏幕上當前對玩家不可見的區域。我通過將一個RenderTarget
中的遊戲內容和戰爭迷霧中的遊戲內容渲染爲另一個,然後將它們與一個效果文件合併,該效果文件將遊戲RenderTarget
中的顏色和來自戰爭迷霧中的alpha渲染目標合併。 FOW RenderTarget
在FOW出現的地方是黑色的,而白色的地方不是。戰爭迷霧的使用效果
這是行得通的,但它將戰爭迷霧(未揭示的位置)染成白色,而不是黑色的預期顏色。
在應用效果之前,我將設備的後緩衝區清除爲白色。當我嘗試將它清除爲黑色時,根本沒有出現戰爭迷霧,我認爲這是與黑色alpha混合的產物。它適用於所有其他顏色,但是 - 給出的結果屏幕的顏色色調。
我該如何實現黑霧,同時仍然能夠在兩個渲染目標之間進行alpha混合?
用於應用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();
}
}
非常有用的答案。我有一個概念alpha和混合搞砸了。我的LightTarget RT現在在可見區域是透明的,在其他地方是完全不透明的黑色。這使我可以使用着色器的修改版本來繪製fow。而不是color.r *(1-fow.a)我使用fow.r *(1-fow.a)。 – 2010-05-18 22:35:08