【问题标题】:How do I modify the SharpDX Gaussian Blur operation to not make the edges transparent?如何修改 SharpDX 高斯模糊操作以不使边缘透明?
【发布时间】:2016-09-27 10:27:39
【问题描述】:

我正在维护一段使用 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;
    }
}

模糊在以下代码块中以 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 只是让透明度的边界更宽。

【问题讨论】:

    标签: c# directx sharpdx gaussianblur


    【解决方案1】:

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

     Owner.InterpolationMode = DXInterpolationMode.Fast;
    

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

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

    【讨论】:

      猜你喜欢
      • 2011-09-27
      • 1970-01-01
      • 2012-05-02
      • 2015-12-16
      • 2020-10-09
      • 2020-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多