Я столкнулся со странным поведением пиксельного шейдера в 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.
Маленькая линия размыта, а большая линия в порядке!
Но если я уберу эффект оттенков серого, все линии будут выглядеть так, как должны.
Кто-нибудь может объяснить, в чем причина такого размытия? Или еще лучше, как я могу решить эту проблему?