0

我正在维护一段使用 SharpDX 进行图形操作的遗留代码。部分代码采用锯齿状图案并对其进行模糊处理,从而为撕破的纸张创建锯齿状边缘效果。我们遇到了一个奇怪的错误,效果周围有一条微弱的白线。逐步浏览代码,我发现模糊操作显然是在边缘周围创建了一个小的透明边框。

模糊前 模糊后

这是用于定义模糊类的代码:

public class DXEffectBlur : DXEffect
{
    public DXEffectBlur(DXSurface Owner, DXImage Source0, float Sigma)
        : base(Owner)
    {
        szPixels = Source0.SizePixels;

        SharpDX.Direct2D1.Effects.GaussianBlur blur = new SharpDX.Direct2D1.Effects.GaussianBlur(surface.CurrentRender);

        blur.StandardDeviation = Sigma;
        blur.SetInput(0, Source0.Image, true);
        blur.Optimization = GaussianBlurOptimization.Quality;
        blur.BorderMode = BorderMode.Hard;

        effect = blur;
    }
}

模糊在以下代码块中被调用为模糊,以将效果写入表面:

using (SurfaceSupport ss = new SurfaceSupport(surface, ReadSource, true))
using (DXEffectBlur blur = new DXEffectBlur(surface, ss.Image, Sigma))
using (DXEffectUnPremultiply unmul = new DXEffectUnPremultiply(surface, blur))
using (DXLayer layer = new DXLayer(surface, rc, null, false, ss.Mask, 1F))
{
    surface.DrawImage(unmul, rc, 1F);
}

其中rc是覆盖我们表面的矩形,1F是不透明度。


有没有更好的方法来指定 SharpDX 中的模糊,使其不会使边缘半透明?我将继续研究代码,但今天我已经花了一个小时的时间,而且我对 SharpDX 甚至 DirectX 都不熟悉,所以我会感谢任何关于在哪里查看的指示。我已经尝试过使用默认为 Soft 的 BorderMode,但在模糊中设置为 Hard,但 Soft 只是使透明度边界更宽。

4

1 回答 1

0

在同事的帮助下,我找到了解决方法。在构造函数中,我添加了以下行:

 Owner.InterpolationMode = DXInterpolationMode.Fast;

如上所示,“Owner”是效果的 DXSurface。它被分配给 中的surface成员变量DXResource,这是链上几级的祖先,因此在此处更改它也会更改成员变量。

以前,设置为HighQuality. 使用该Pixel设置也可以。

于 2016-09-27T02:27:39.090 回答