我遇到了WPF中像素着色器的奇怪行爲。應用了着色器效果後的模糊圖片
這個問題是100%可重複的,所以我寫了一個小的演示程序。你可以下載源代碼here。
所有罪惡的根源是微小的類名爲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依賴屬性。
所以這個框架元素是像素着色器效果的目標。爲了簡單起見,我使用找到的灰度着色器效果here。所以我將GrayscaleEffect應用於MyFrameworkElement。你可以看到結果,它看起來不錯。
直到我增加EndX性能急劇下降。
小線是模糊的大線是好的!
但是,如果我刪除灰度效果,所有行將看起來應該如此。
任何人能解釋這是什麼不清楚的原因是什麼? 甚至更好,我該如何解決這個問題?
似乎是一個BitmapEffect對於巨大值的限制。 – LPL 2012-07-25 13:35:58
@LPL如果將第二條(較低)行綁定到EndX屬性,然後將EndX設置爲80000,則一切都會好的。我的意思是,我們仍然有巨大的價值,兩條線都很長,但效果正常。或者我沒有明白你的想法,是嗎? – 2012-07-25 14:09:14