在XNA中进行Alpha混合的问题

时间:2011-02-19 16:40:43

标签: xna

您好 我有一个背景和两个png精灵 我想使用提供的背景和使用XNA 3.1的sprite制作this effect 我做错了,因为我只得到this你注意到它不是我想做的效果 使用XNA 3.1中的alpha混合可以使用几行代码来实现此效果吗?一个实际的例子真的很棒!

2 个答案:

答案 0 :(得分:1)

首先,渲染包含您想要对纹理A透明的形状的纹理。 包含形状的纹理应该在透明背景上包含黑色形状 - 可以使用Photoshop等图像编辑软件轻松构建。

然后使用纹理A并使用效果(HLSL着色器)将其绘制到场景顶部:

output = float4(0, 0, 0, A.r);

在A较暗的情况下有效地使输出图像的alpha值降低。

图像将有清晰的部分,你在A上绘制形状,在其他地方都是黑色。

以下是着色器代码的详细信息:

sampler TextureSampler : register(s0);

float4 PS(float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
{
    float4 Color = tex2D(TextureSampler, texCoord); 

    Color = float4(0, 0, 0, Color.r);

    return Color;
}

technique Vicky
{
    pass P0
    {
        PixelShader = compile ps_2_0 PS();
    }
}

答案 1 :(得分:0)

如果你想要一个没有着色器的解决方案。

首先需要将战争纹理的雾化为黑色,透明部分为白色。

  1. 正常渲染地图和实体到RenderTarget2D
  2. 将背景清除为黑色
  3. 使用添加剂混合启动精灵批处理
  4. 渲染战争纹理雾
  5. 使用Multiply blend
  6. 启动新的sprite批处理
  7. 在整个屏幕上渲染地图RenderTarget2D