如何将多个着色器效果应用于 DrawingVisual?

How to apply multiple shader effects to a DrawingVisual?

我有一个 DrawingVisual 对象 (dv) 并在对其 DrawingContext (dc) 进行复杂转换后绘制图像。在dc.Close() 之后,我想运行 dv 对象上的多个着色器效果。首先是自定义 Tint 效果,然后是模糊效果。稍后我还想添加亮度、饱和度等校正。如何应用效果? DrawingVisual 只允许一种效果。是否可以将它嵌套到另一个对象中,并对其应用第二个效果?然后是新巢,第三效果等等?或者类似的东西?最终对象 - 在效果之后 - 必须是最后一个 RenderTargetBitmap Render() 的源。

代码隐藏部分:

DrawingVisual dv = new DrawingVisual();
DrawingContext dc = dv.RenderOpen();
...
dc.DrawImage(...);
dc.Close();

[Apply Effects Required]

BitmapSource render = dv.RenderVisualAsBitmap(...); // custom RenderTargetBitmap rendering

此致, 佐尔坦

您可以使用嵌套的 ContainerVisuals:

var dv = new DrawingVisual { Effect = new BlurEffect() };

using (var dc = dv.RenderOpen())
{
    dc.DrawRectangle(Brushes.Red, new Pen(Brushes.Green, 5), new Rect(100, 100, 100, 100));
}

var cv = new ContainerVisual { Effect = new DropShadowEffect() };
cv.Children.Add(dv);

// more ContainerVisual here

var rtb = new RenderTargetBitmap(300, 300, 96, 96, PixelFormats.Default);
rtb.Render(cv);