Ich bin auf seltsames Verhalten des Pixel-Shaders in WPF gestoßen.Unscharfes Bild nach dem Anwenden des Shader-Effekts
Dieses Problem ist 100% reproduzierbar, so schrieb ich kleines Demo-Programm. Sie können den Quellcode here herunterladen.
Die Wurzel allen Übels ist winzig Klasse betitelt 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));
}
}
Wie Sie dieses Rahmenelement macht 2 Zeilen sehen: untere Linie permanent Koordinaten aber obere Linie hängt von EndX Abhängigkeitseigenschaft hat.
Also dieses Framework-Element ist Ziel für Pixel-Shader-Effekt. Der Einfachheit halber verwende ich Graustufen-Shader-Effekt gefunden here. Also habe ich GrayscaleEffect auf MyFrameworkElement angewendet. Sie können das Ergebnis sehen, es sieht gut aus.
Bis ich drastisch erhöhen EndX Eigenschaft.
Kleine Linie ist verschwommen und große Linie ist in Ordnung!
Aber wenn ich Graustufeneffekt entfernen, werden alle Zeilen so aussehen, wie sie sollten.
Kann jemand erklären, was ist der Grund dafür zu verwischen? Oder noch besser, wie kann ich dieses Problem lösen?
Scheint wie eine Einschränkung eines BitmapEffect für große Werte. – LPL
@LPL Wenn Sie die zweite (untere) Zeile an die EndX-Eigenschaft binden und dann EndX auf 80000 setzen, ist alles in Ordnung. Ich meine, wir haben immer noch riesige Werte, beide Linien sind sehr lang, aber der Effekt funktioniert richtig. Oder ich habe deine Idee nicht verstanden, oder? –