WPF のピクセル シェーダーの奇妙な動作に遭遇しました。
この問題は 100% 再現可能であるため、簡単なデモ プログラムを作成しました。ソースコードはこちらからダウンロードできます。
すべての悪の根源は、MyFrameworkElement という名前の小さなクラスです。
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));
}
}
ご覧のとおり、このフレームワーク要素は 2 つの線をレンダリングします。下の線は永続的な座標を持ちますが、上の線は EndX 依存関係プロパティに依存します。
したがって、このフレームワーク要素は、ピクセル シェーダー効果のターゲットです。簡単にするために、ここにあるグレースケール シェーダー効果を使用します。そこで、MyFrameworkElement に GrayscaleEffect を適用しました。結果を見ることができます。
EndXプロパティを大幅に増やすまで。
細いラインはぼやけて、太いラインはスッキリ!
しかし、グレースケール効果を削除すると、すべての線が本来のように見えます。
このぼやけの理由を説明できる人はいますか? または、どうすればこの問題を解決できますか?