Размытое изображение после применения шейдерного эффекта

Я столкнулся со странным поведением пиксельного шейдера в 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.

Маленькая линия размыта, а большая линия в порядке!

Но если я уберу эффект оттенков серого, все линии будут выглядеть так, как должны.

Кто-нибудь может объяснить, в чем причина такого размытия? Или еще лучше, как я могу решить эту проблему?

5
задан Alex Zhevzhik 25 July 2012 в 11:54
поделиться