5

WPF では、OuterGlowBitmapEffect はサポートされなくなり、Net4.0 でレンダリングされなくなりました。DropShadow には少し共通点があり、私の場合は受け入れられません。私の最初の目標は、AeroGlass ウィンドウで黒の ClearType テキストの背景を白くぼかして、暗いシーンでも読みやすくすることです。fx と HLSL で遊び始めました。非常に興味深く強力ですが、それでも OuterGlowBitmapEffect に近づくことはできません。

アイデアを反映する私の現在のダミーバージョン:

sampler2D  Sampler : register(S0);
#define PI 3.14f
float4 main(float2 uv : TEXCOORD) : COLOR
{
    float4 px = tex2D(Sampler, uv);

    /*
    if (px.a > 0.9)
    {
        return px;
    }
    */

    const float d = 3;

    int cnt = 0;
    float a = 0;
    for (float x = -0.1*d; x < 0.1*d; x += 0.05*d)
    {
        a += tex2D(Sampler, uv + float2(x, 0)).a;
        a += tex2D(Sampler, uv + float2(0, x)).a;
        a += tex2D(Sampler, uv + x).a;
        cnt += 3;
    }
    a /= cnt;

    float4 s = a;

    float4 r = float4(px.rgb*px.a + s.rgb*(1-px.a), max(px.a, a));

    return r;
}

ところで: DropShadowEffect の HLSL ソースを取得して参照として使用できますか? 誰かが OuterGlowEffect アルゴリズムを任意の言語で教えてくれますか?

注: Windows 7 の Aero Glass タイトル バーには、タイトルを読みやすくする効果があります。それはまさに、ウィンドウの他の部分のテキストに必要なものです (DwmExtendFrameIntoClientArea が適用されます)。エアロ グラス ウィンドウ タイトル

4

1 に答える 1

3

一般的な考え方は、最初に白いテキストをレンダリングしてからぼかします。最後に、ぼやけた白いテキストを黒いテキストの背景画像として使用します。

シェーダーは正しいぼかしですが、やや非効率的です (x=0 の冗長サンプルなど)。水平方向のぼかしと垂直方向のぼかしの 2 つのパスを使用して、適切な大きなぼかしを作成できます。HLSL コード:

float4 PS_BlurHorizontal( float2 Tex : TEXCOORD0 ) : COLOR0
{
    float Color = 0.0f;

    Color += tex2D(sampler, float2(Tex.x - 3.0*blurSizeX, Tex.y)) * 0.09f;
    Color += tex2D(sampler, float2(Tex.x - 2.0*blurSizeX, Tex.y)) * 0.11f;
    Color += tex2D(sampler, float2(Tex.x - blurSizeX, Tex.y)) * 0.18f;
    Color += tex2D(sampler, Tex) * 0.24f;
    Color += tex2D(sampler, float2(Tex.x + blurSizeX, Tex.y)) * 0.18f;
    Color += tex2D(sampler, float2(Tex.x + 2.0*blurSizeX, Tex.y)) * 0.11f;
    Color += tex2D(sampler, float2(Tex.x + 3.0*blurSizeX, Tex.y)) * 0.09f;

    return Color;
}

float4 PS_BlurVertical( float2 Tex : TEXCOORD0 ) : COLOR0
{
    float Color = 0.0f;

    Color += tex2D(sampler, float2(Tex.x, Tex.y - 3.0*blurSizeY)) * 0.09f;
    Color += tex2D(sampler, float2(Tex.x, Tex.y - 2.0*blurSizeY)) * 0.11f;
    Color += tex2D(sampler, float2(Tex.x, Tex.y - blurSizeY)) * 0.18f;
    Color += tex2D(sampler, Tex) * 0.24f;
    Color += tex2D(sampler, float2(Tex.x, Tex.y + blurSizeY)) * 0.18f;
    Color += tex2D(sampler, float2(Tex.x, Tex.y + 2.0*blurSizeY)) * 0.11f;
    Color += tex2D(sampler, float2(Tex.x, Tex.y + 3.0*blurSizeY)) * 0.09f;

    return Color;
}
// weights: 0.09 + 0.11 + 0.18 + 0.24 + 0.18 + 0.11 + 0.9 = 1
// By default, weigths are symmetrical and sum up to 1,
// but they don't necessarily have to.
// You can change the weights to create more fancy results.

これらの 2 つの 7 サンプル パスは、7x7 のガウス ブラーをシミュレートします (49 サンプルではなく 14 サンプル)。より多くのサンプルを使用して結果を改善する (ぼかしを広くする) か、ウェイトを調整してよりソフトな外観を作成することができます。

于 2012-06-28T22:22:28.493 に答える