我在 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 依赖属性。
所以这个框架元素是像素着色器效果的目标。为简单起见,我使用在这里找到的灰度着色器效果。所以我将 GrayscaleEffect 应用于 MyFrameworkElement。你可以看到结果,它看起来不错。
直到我大幅增加 EndX 属性。
小线模糊,大线没问题!
但是如果我删除灰度效果,所有的线条都会看起来像它们应该的那样。
任何人都可以解释这种模糊的原因是什么?或者更好的是如何解决这个问题?