gpt4 book ai didi

c# - 使用 war 迷雾的效果

转载 作者:太空狗 更新时间:2023-10-29 17:56:41 25 4
gpt4 key购买 nike

我正在尝试将 war 迷雾应用到屏幕上玩家当前不可见的区域。为此,我将游戏内容渲染到一个 RenderTarget 中,将 war 迷雾渲染到另一个中,然后将它们与从游戏 RenderTarget 中获取颜色的效果文件合并> 和来自 war 迷雾渲染目标的 alpha。 FOW RenderTarget 在 FOW 出现的地方是黑色的,在没有出现的地方是白色的。

这确实有效,但它将 war 迷雾(未显示的位置)着色为白色,而不是预期的黑色。

在应用效果之前,我将设备的后备缓冲区清除为白色。当我尝试将其清除为黑色时,根本没有出现 war 迷雾,我认为这是 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();
}
}

最佳答案

我没有深入研究 XNA,目前无法设置它来检查 4.0 的 CTP,但是从阅读文档来看,您似乎在加倍努力。根据我的理解,BlendState.AlphaBlend 导致 SpriteBatch 对绘制的每个 Sprite 进行 alpha 混合。

根据documentation它使用默认设置

ColorSourceBlend = Blend.One,
AlphaSourceBlend = Blend.One,

ColorDestinationBlend = Blend.InverseSourceAlpha,
AlphaDestinationBlend = Blend.InverseSourceAlpha,

其中应该有以下 impact :

One: Each component of the color is multiplied by (1, 1, 1, 1).

InverseSourceAlpha: Each component of the color is multiplied by the inverse of the alpha value of the source. This can be represented as (1 − As, 1 − As, 1 − As, 1 − As), where As is the alpha destination value.

因此,如果您正在使用 Blend.AlphaBlend,您应该能够将后台缓冲区清除为黑色,然后只渲染您的 map Sprite ,直接降低应该淡化的 alpha。这应该简单地淡化被 FOW“覆盖”的贴图像素,使其与后台缓冲区的黑色进行 alpha 混合。

如果您想采用着色器方法,您可以在两个渲染目标之间的着色器中进行 alpha 混合。我对你关于你到底想如何混合的解释有点困惑。你说你想要 alpha 混合,但是你的 FOW 渲染目标在有雾的地方是黑色的,在没有雾的地方是白色的。如果您使用 alpha 来控制混合,则根据您想要的外观,您的雾颜色在整个渲染目标上应该是统一的(或适当的纹理)。假设您想要黑雾,整个渲染目标的颜色应该是 (0, 0, 0),并且 alpha 值应该根据您想要显示它的位置而改变。

使用这种方法,您可以将着色器更改为如下所示:

float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
float2 tex = input.TexCoord;

float4 color = tex2D(ColorSampler, tex);
float4 fow = tex2D(LightsSampler, tex);

// color * inverse of FOW alpha + FOW * FOW alpha
return float4(color.r * (1-fow.a) + fow.r * fow.a,
color.g * (1-fow.a) + fow.g * fow.a,
color.b * (1-fow.a) + fow.b * fow.a,
1);
}

我已经有一段时间没有编写 HLSL 着色器了,但我确信可以更轻松地编写它。无论哪种方式,如果 FOW 是黑色的(并且后台缓冲区被清除为黑色,并且您没有将各种 alpha 混合 Sprite 堆叠在一起 - 请参阅 Joel 的回答),该方法与直接设置 alpha 没有什么不同根据是否有 FOW 映射 sprite。

关于c# - 使用 war 迷雾的效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2854012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com