0

画像を表示する WPF アプリケーションにコントロールがあります。ShaderEffectウェブで見つけたコードから書いたものを使用しています。ShaderEffectクラスは次のとおりです。

public class BrightContrastEffect : ShaderEffect {

    public static readonly DependencyProperty BrightnessProperty = 
        DependencyProperty.Register( "Brightness", typeof( double ), typeof( BrightContrastEffect ), 
                                     new UIPropertyMetadata( 0.0, PixelShaderConstantCallback( 0 ) ) );

    public static readonly DependencyProperty ContrastProperty = 
        DependencyProperty.Register( "Contrast", typeof( double ), typeof( BrightContrastEffect ), 
                                     new UIPropertyMetadata( 0.0, PixelShaderConstantCallback( 1 ) ) );

    public static readonly DependencyProperty InputProperty = 
        ShaderEffect.RegisterPixelShaderSamplerProperty( "Input", typeof( BrightContrastEffect ), 0 );

    public float Brightness {
        get { return (float) GetValue( BrightnessProperty ); }
        set { SetValue( BrightnessProperty, value ); }
    }

    public float Contrast {
        get { return (float) GetValue( ContrastProperty ); }
        set { SetValue( ContrastProperty, value ); }
    }

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

    public BrightContrastEffect() {
        PixelShader = m_shader;
        UpdateShaderValue( InputProperty );
        UpdateShaderValue( BrightnessProperty );
        UpdateShaderValue( ContrastProperty );

    }

    private static PixelShader m_shader = new PixelShader() { 
        UriSource = new Uri( @"pack://application:,,,/CustomControls;component/bricon.ps" ) 
    };

}

DirectX SDK を使用してコンパイルされた PixelShader のコードを次に示します。

sampler2D input : register(s0);
float brightness : register(c0);
float contrast : register(c1);

float4 main(float2 uv : TEXCOORD) : COLOR
{
    float4 color = tex2D(input, uv); 
    float4 result = color;
    result = color + brightness;
    result = result * (1.0 + contrast) / 1.0;

    return result;
}

Imageプログラムにコントロールを表示するフォームがあり、そのEffectプロパティは上記のクラスのインスタンスに設定されています。画像の隣には 4 つのボタンがあり、そのうちの 1 つは一定のステップで明るさを上げ、もう 1 つは同じ固定のステップで明るさを下げ、3 つ目は同様にコントロールを上げ、4 つ目はコントラストを下げます。

私の問題は、このコードがコントラストを変更するだけでなく、画像の不透明度も変更しているため、画像の背後にあるものが透けて見え始めることです。そして、その背後には白い背景以上のものがあります。

画像の不透明度を変更しないようにするにはどうすればよいですか? PixelShaderが書かれている言語については何も知りません。

トニー

編集: これは、この ShaderEffect を使用するコントロールの XAML です。

<Grid Background="{Binding Path=Background, RelativeSource={RelativeSource AncestorType={x:Type cs:Channel}}}" 
      MouseLeftButtonDown="MouseLeftButtonDownHandler" 
      MouseLeftButtonUp="MouseLeftButtonUpHandler"
      MouseMove="MouseMoveHandler"
      Name="ChannelGrid">

    <Canvas Name="ChannelCanvas">
        <Rectangle Canvas.Left="0"
                   Canvas.Top="0"
                   Fill="Black"
                   Height="{Binding ElementName=ChannelCanvas, Path=ActualHeight}"
                   Name="MapHider"
                   Width="{Binding ElementName=ChannelCanvas, Path=ActualWidth}" />

        <Image Canvas.Left="0" 
               Canvas.Top="0"
               Height="{Binding ElementName=ChannelCanvas, Path=ActualHeight}" 
               Name="CanvasImage" 
               Stretch="Fill" 
               Width="{Binding ElementName=ChannelCanvas, Path=ActualWidth}">
            <Image.Effect>
                <cs:BrightContrastEffect Brightness="{Binding Mode=TwoWay, Path=Brightness, RelativeSource={RelativeSource AncestorType={x:Type cs:Channel}}}"
                                         Contrast="{Binding Mode=TwoWay, Path=Contrast, RelativeSource={RelativeSource AncestorType={x:Type cs:Channel}}}" />
            </Image.Effect>
        </Image>
        <Rectangle Fill="Transparent" 
                   Name="LicensePlateRectangle"
                   Stroke="Red" 
                   StrokeThickness="1"
                   Visibility="Hidden" />
    </Canvas>
    <Canvas>
        <!-- This canvas is overlaid over the previous canvas and is used to place 
             the rectangle that implements the drag selection box. -->
        <Rectangle Name="ZoomRectangle" 
                   Stroke="White" 
                   StrokeThickness="1" 
                   StrokeDashArray="5 5" 
                   StrokeDashCap="Square" 
                   Visibility="Hidden" />
    </Canvas>
    <ComboBox Background="Transparent"
              BorderBrush="{DynamicResource ComboBoxBorder}"
              FontSize="18" 
              Foreground="{DynamicResource ComboBoxForeground}" 
              HorizontalAlignment="Center" 
              Margin="0,5,0,0" 
              MinHeight="25" 
              Name="CameraPicker" 
              Panel.ZIndex="1" 
              SelectionChanged="Picker_SelectionChanged"
              VerticalAlignment="Top" 
              Visibility="Hidden" />
    <Border BorderBrush="{DynamicResource ControlBorder}"
            BorderThickness="1"
            HorizontalAlignment="Center" 
            Margin="0,5,0,0" 
            MinHeight="35" 
            MinWidth="35"
            Name="NameBorder"
            Padding="5,0"
            Panel.ZIndex="1"
            VerticalAlignment="Top"
            Visibility="Hidden">
        <cs:OutlinedText Fill="White" 
                         FontSize="18" 
                         FontWeight="Bold"
                         HorizontalAlignment="Center" 
                         MinHeight="25" 
                         MinWidth="25"
                         x:Name="CameraName" 
                         Stroke="Black" 
                         StrokeThickness="1"
                         VerticalAlignment="Center" 
                         Visibility="Hidden" />
    </Border>
</Grid>
4

1 に答える 1

1

ピクセル シェーダーを変更して、常に alpha = 1 を返すようにします。

この行を変更する

    return result;

    return float4(result.r, result.g, result.b, 1.0);

正確な構文はわかりませんが、アイデアはわかります。:)

于 2012-07-25T20:07:50.180 に答える