2013-05-10 3 views
0

알파 채널을 매우 간단하게 반환하고 리턴합니다.사용자 정의 WPF ShaderEffect 알파 채널의 비정상적인 동작이 있습니다.

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 또는 그 뒤에있는 다른 것.

전경과 배경이 뒤바뀐 경우 이미지가 동일하므로 "덧붙여"가 아니라면 이는 적어도 교환 가능합니다. 나는 그것이 "추가"라고 생각한다.

일반적으로 컴퓨터가 옳다. 따라서 사용자 오류라고 가정하지만 왜 알파를 0으로 설정하면 투명 이미지가 제공되지 않습니까? 그렇다면 어떻게 투명 이미지를 얻을 수 있습니까? (분명히 결국 쉐이더와 더 복잡한 무언가를하고 싶습니다. (특히 그린 스크린), 작동시키기 위해서는 먼저이 쉐이더를 사용해야합니다. 그래서 "불투명도 속성 설정"이라고 말하지 마십시오.)

답변

관련 문제