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;
    }
}

ぼかしは、次のコード チャンクで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にも慣れていないので、どこを見ればよいか教えていただければ幸いです. 私はすでに、BorderMode をいじってみました。デフォルトは Soft ですが、ぼかしでは Hard に設定されますが、Soft は透明度の境界線を広げます。

4

1 に答える 1

0

同僚の助けを借りて、回避策を見つけました。コンストラクター内に、次の行を追加しました。

 Owner.InterpolationMode = DXInterpolationMode.Fast;

上記のように、「所有者」はエフェクトの DXSurface です。surfaceこれは、チェーンの数レベル上の先祖である のメンバー変数に割り当てられるため、DXResourceここで変更するとメンバー変数も変更されます。

以前は、設定は でしたHighQuality。設定を使用するPixelこともできます。

于 2016-09-27T02:27:39.090 に答える