Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义WPF ShaderEffect alpha通道具有异常行为_Wpf_Directx_Shader_Hlsl - Fatal编程技术网

自定义WPF ShaderEffect alpha通道具有异常行为

自定义WPF ShaderEffect alpha通道具有异常行为,wpf,directx,shader,hlsl,Wpf,Directx,Shader,Hlsl,我有一个非常简单的像素着色器,将alpha channel设置为零并返回 sampler2D tex : register(s0); float4 PS(float2 uv : TEXCOORD) : COLOR { float4 color = tex2D(tex, uv); color.a = 0; return color; } 我认为这会导致应用它的图像完全不可见。然而,这似乎不是正在发生的事情。相反,生成的图像将在白色背景上不可见,但在黑色背景上将保持

我有一个非常简单的像素着色器,将alpha channel设置为零并返回

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示例图片时,会产生以下结果:

这与我在XAML中将效果应用于一个
图像
时在屏幕上看到的行为相同,后面还有另一个
图像
或其他任何内容

请注意,如果前景和背景颠倒,则图像是相同的,因此如果不是“添加”,则至少是可交换的。我想是“添加”


计算机通常是正确的,所以我假设这是用户的错误,但是为什么将alpha设置为零并没有给我一个透明的图像呢?如果是这样的话,我如何得到一个透明的图像?(很明显,我最终想对着色器做一些更复杂的事情(特别是绿色屏幕),但要让它工作,我必须先让这个着色器工作,所以不要只说“设置不透明度属性”)。

Gah,stackoverflow比google好。最重要的“相关问题”得到了答案