WPFでピクセルシェーダの奇妙な動作が発生しました。シェーダエフェクトを適用した後にぼかした画像
この問題は100%再現可能なので、私は小さなデモプログラムを書きました。ソースコードhereをダウンロードできます。下の線は永久的な座標を持っていますが、上の行はENDX依存関係プロパティに依存します:あなたはこのフレームワークの要素が2行をレンダリング見ることができるように
internal sealed class MyFrameworkElement : FrameworkElement
{
public double EndX
{
get
{
return (double)this.GetValue(MyFrameworkElement.EndXProperty);
}
set
{
this.SetValue(MyFrameworkElement.EndXProperty, value);
}
}
public static readonly DependencyProperty EndXProperty =
DependencyProperty.Register("EndX",
typeof(double),
typeof(MyFrameworkElement),
new FrameworkPropertyMetadata(0d, FrameworkPropertyMetadataOptions.AffectsRender));
protected override void OnRender(DrawingContext dc)
{
dc.DrawLine(new Pen(Brushes.Red, 2), new Point(0, 0), new Point(this.EndX, 100));
dc.DrawLine(new Pen(Brushes.Green, 3), new Point(10, 300), new Point(200, 10));
}
}
:
諸悪の根源は、小さなクラス題しMyFrameworkElementです。
このフレームワーク要素は、ピクセルシェーダー効果のターゲットです。簡単にするために、私はグレースケールのシェーダ効果hereを使用しています。そこで私はGrayscaleEffectをMyFrameworkElementに適用しました。あなたは結果を見ることができます、それは素敵に見えます。
私は劇的ENDX性を高めるまで。
小さなラインがぼやけていると、大きなラインは大丈夫です!
グレースケールエフェクトを削除すると、すべての行が表示されるようになります。
誰がこのボケの理由です何かを説明することはできますか? さらに、この問題をどのように解決できますか?
大きな値のBitmapEffectの制限のようです。 – LPL
@LPL 2番目(下位)の行をEndXプロパティにバインドしてEndXを80000に設定すると、すべてがOKになります。私たちはまだ大きな値を持っていますが、どちらの線も非常に長いですが、効果は適切に機能します。または私はあなたのアイデアを得ていませんでしたか? –