自定义WPF ShaderEffect alpha通道具有不寻常的行为

问题描述:

我有一个相当简单的像素着色器集alpha通道为零并返回。自定义WPF ShaderEffect alpha通道具有不寻常的行为

sampler2D tex : register(s0); 

float4 PS(float2 uv : TEXCOORD) : COLOR 
{ 
    float4 color = tex2D(tex, uv); 
    color.a = 0; 
    return color; 
} 

我会认为这会导致它应用到的图像完全看不见。然而这不是看起来正在发生的事情。相反,生成的图像将在白色背景中变得不可见,但是在黑色背景下它将保持不变。看起来这个着色器在某种程度上导致了在前景和背景之间调用“添加”功能。

例如,以下代码加载前景和背景图像,将上述着色器效果应用于前景,将它们呈现为位图,并将位图写入文件。

public sealed partial class MainWindow 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    void Button_Click(object sender, RoutedEventArgs e) 
    { 
     const int width = 1024; 
     const int height = 768; 
     var sz = new Size(width, height); 

     var background = new Image { Source = new BitmapImage(new Uri(@"c:\background.jpg")) }; 
     background.Measure(sz); 
     background.Arrange(new Rect(sz)); 

     var foreground = new Image { Source = new BitmapImage(new Uri(@"c:\foreground.jpg")), Effect = new Alpha() }; 
     foreground.Measure(sz); 
     foreground.Arrange(new Rect(sz)); 

     var target = new RenderTargetBitmap(width, height, 96d, 96d, PixelFormats.Default); 
     target.Render(background); 
     target.Render(foreground); 

     var jpg = new JpegBitmapEncoder(); 
     jpg.Frames.Add(BitmapFrame.Create(target)); 
     using (var fileStream = File.OpenWrite(@"c:\output.jpg")) 
     { 
      jpg.Save(fileStream); 
     } 
    } 
} 

// Standard ShaderEffect stuff here, nothing exciting. 
public sealed class Alpha : ShaderEffect 
{ 
    static readonly PixelShader Shader = new PixelShader{UriSource = new Uri("pack://application:,,,/Alpha.ps", UriKind.RelativeOrAbsolute)}; 

    public static readonly DependencyProperty InputProperty = RegisterPixelShaderSamplerProperty("Input", typeof(Alpha), 0); 

    public Alpha() 
    { 
     PixelShader = Shader; 
     UpdateShaderValue(InputProperty); 
    } 

    public Brush Input 
    { 
     get { return (Brush)GetValue(InputProperty); } 
     set { SetValue(InputProperty, value); } 
    } 
} 

这产生了当施加到两个Win7的样品图像的以下:

Looks like an "add" transform, right?

这是相同的行为我在屏幕上看到,当我应用效果在XAML一个Image ,另一个Image或其他背后的东西。

注意图像是相同的,如果前景和背景相反,所以如果它不是“添加”,它至少是可交换的东西。我认为这是“添加”。

电脑通常是正确的,所以我认为这是用户错误,但为什么设置阿尔法为零不给我一个透明的图像?如果有,我如何获得透明图像? (我显然希望最终做一些更复杂的着色器(特别是绿屏),但为了让它起作用,我必须先让着色器工作,所以不要只说“设置不透明度属性”)。

Gah,*比谷歌好。最高的“相关问题”有答案。 Handling alpha channel in WPF pixel shader effect