我有一个相当简单的像素着色器设置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样本图片时,会产生以下内容:
当我将效果应用于XAML中的一个Image
时,我在屏幕上看到的这种行为与另一个Image
或其他任何内容相同。
注意如果前景和背景相反,图像是相同的,所以如果它不是“添加”,那么它至少是可交换的。我认为这是“添加”。
计算机通常是正确的,所以我认为这是用户错误,但为什么将alpha设置为零而不给我透明图像?如果是这样我如何获得透明图像? (我显然希望最终使用着色器执行更复杂的操作(特别是绿屏),但为了使其工作,我必须首先使用此着色器,所以不要只说“设置不透明度属性”。)。 p>
答案 0 :(得分:0)
Gah,stackoverflow比谷歌好。最重要的“相关问题”得到了答案。 Handling alpha channel in WPF pixel shader effect