XNA中的alpha混合问题

XNA中的alpha混合问题,xna,Xna,嗨 我有一个背景和两个png精灵 我想使用XNA 3.1使用提供的背景和精灵制作 我做错了什么,因为我只是在你注意到的时候得到的,这不是我想要的效果 在xna3.1中使用alpha混合,用几行代码就可以达到这个效果吗?一个实际的例子会非常好 首先,渲染包含要对纹理A透明的形状的纹理。 包含形状的纹理应该包含透明背景上的黑色形状——使用Photoshop等图像编辑软件可以轻松构建 然后使用效果(HLSL着色器)在场景顶部绘制纹理,该效果可执行以下操作: output = float4(0, 0,

嗨 我有一个背景和两个png精灵 我想使用XNA 3.1使用提供的背景和精灵制作 我做错了什么,因为我只是在你注意到的时候得到的,这不是我想要的效果

在xna3.1中使用alpha混合,用几行代码就可以达到这个效果吗?一个实际的例子会非常好

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

然后使用效果(HLSL着色器)在场景顶部绘制纹理,该效果可执行以下操作:

output = float4(0, 0, 0, A.r);
在A较暗的位置,有效地降低输出图像的alpha

图像将有清晰的部分,你在一张纸上画出你的形状,其他地方都是黑色的

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

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();
    }
}

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

然后使用效果(HLSL着色器)在场景顶部绘制纹理,该效果可执行以下操作:

output = float4(0, 0, 0, A.r);
在A较暗的位置,有效地降低输出图像的alpha

图像将有清晰的部分,你在一张纸上画出你的形状,其他地方都是黑色的

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

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();
    }
}

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

您首先需要将战争之雾纹理设置为黑色,透明部分设置为白色

  • 将贴图和实体正常渲染为RenderTarget2D
  • 将背景清除为黑色
  • 开始添加混合雪碧
  • 渲染战争之雾纹理
  • 使用Multiply blend开始新的雪碧批次
  • 在整个屏幕上渲染地图RenderTarget2D

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

    您首先需要将战争之雾纹理设置为黑色,透明部分设置为白色

  • 将贴图和实体正常渲染为RenderTarget2D
  • 将背景清除为黑色
  • 开始添加混合雪碧
  • 渲染战争之雾纹理
  • 使用Multiply blend开始新的雪碧批次
  • 在整个屏幕上渲染地图RenderTarget2D

  • 所以,我需要用纹理2D来代替?不,形状应该是黑色的,背景是白色的。只需反转白色形状的图像。从技术上讲,您可以使用链接的第一个图像,但必须执行
    output.rgb=float4(0,0,0,1-A.r)改为在着色器中。好的,那么,最好使用我在渲染目标中绘制所有“灯光”形状。这可以吗?而且要清楚,你不能只在场景顶部绘制形状。你必须先将它们绘制到一个纹理上,然后根据我的回答,使用一个使红色通道成为alpha通道的着色器在场景顶部绘制该纹理。@Vicky:尝试将你的
    SpriteBlendMode
    设置为
    Additional
    ,因此,我需要像这样使用Texture2D?不,形状应该是黑色的,背景是白色的。只需反转白色形状的图像。从技术上讲,您可以使用链接的第一个图像,但必须执行
    output.rgb=float4(0,0,0,1-A.r)改为在着色器中。好的,那么,最好使用我在渲染目标中绘制所有“灯光”形状。这可以吗?而且要清楚,你不能只在场景顶部绘制形状。按照我的回答,你必须先将它们绘制到纹理上,然后使用使红色通道成为alpha通道的着色器在场景顶部绘制该纹理。@Vicky:尝试将你的
    SpriteBlendMode
    设置为
    Additional