8

私はまだ、HLSL シェーダーを使用して、ドロップ シャドウ、ベベルなどの Photoshop 風のフィルターを追加する画像処理プロジェクトに取り組んでいます。現在、HLSL でアウター グロー エフェクトを実装する方法を探しています。

私は現在、次のアイデアを試しています。

1) 現在のテクスチャをスケーリングしてグローを作成します (パラメータ: アウトラインのサイズを設定するglowSize)。

2) 横方向のぼかし

3) 縦にぼかし、ぼかしの色を光彩色に変え、その上にオリジナルのテクスチャを重ねる

グローをレンダリングするために、次のマルチパス HLSL シェーダーを使用しています。

float4 PS_Scale(VS_OUTPUT IN) : COLOR0
{
    float2 tex = IN.texture0;
    float2 scaleCenter = float2(0.5f, 0.5f);
    float2 scaleTex = (tex - scaleCenter) * glowSize + scaleCenter;
    return tex2D(foreground, scaleTex);
}

float4 PS_GlowH(VS_OUTPUT IN) : COLOR0
{
    float2 Tex = IN.texture0;

    float4 sum = float4(0.0, 0.0, 0.0, 0.0);
    sum += tex2D(secondForeground, float2(Tex.x - 4.0*blur, Tex.y))*0.05;
    sum += tex2D(secondForeground, float2(Tex.x - 3.0*blur, Tex.y))*0.09;
    sum += tex2D(secondForeground, float2(Tex.x - 2.0*blur, Tex.y))*0.12;
    sum += tex2D(secondForeground, float2(Tex.x - blur, Tex.y))*0.15;
    sum += tex2D(secondForeground, float2(Tex.x, Tex.y))*0.16;
    sum += tex2D(secondForeground, float2(Tex.x + blur, Tex.y))*0.15;
    sum += tex2D(secondForeground, float2(Tex.x + 2.0*blur, Tex.y))*0.12;
    sum += tex2D(secondForeground, float2(Tex.x + 3.0*blur, Tex.y))*0.09;
    sum += tex2D(secondForeground, float2(Tex.x + 4.0*blur, Tex.y))*0.05;

    return sum;
}

float4 PS_GlowV(VS_OUTPUT IN) : COLOR0
{
    float2 Tex = IN.texture0;

    float4 sum = float4(0.0, 0.0, 0.0, 0.0);
    sum += tex2D(secondForeground, float2(Tex.x, Tex.y - 4.0*blur))*0.05;
    sum += tex2D(secondForeground, float2(Tex.x, Tex.y - 3.0*blur))*0.09;
    sum += tex2D(secondForeground, float2(Tex.x, Tex.y - 2.0*blur))*0.12;
    sum += tex2D(secondForeground, float2(Tex.x, Tex.y - blur))*0.15;
    sum += tex2D(secondForeground, float2(Tex.x, Tex.y))*0.16;
    sum += tex2D(secondForeground, float2(Tex.x, Tex.y + blur))*0.15;
    sum += tex2D(secondForeground, float2(Tex.x, Tex.y + 2.0*blur))*0.12;
    sum += tex2D(secondForeground, float2(Tex.x, Tex.y + 3.0*blur))*0.09;
    sum += tex2D(secondForeground, float2(Tex.x, Tex.y + 4.0*blur))*0.05;

    float4 result = sum * opacity;
    result.rgb = float3(glowColor.r, glowColor.g, glowColor.b) / 255.0f;

    float4 src = tex2D(foreground, IN.texture0.xy);
    return result * (1-src.a) + src;
}

このコードの結果は、楕円のような単純な形状を使用する場合は問題ないように見えますが、テキストにシェーダーを適用すると機能しません。

上記シェーダーの出力

スケーリングに問題があることは明らかです。元のテクスチャをスケーリングしてアウトラインとして使用する方法がわかりません。それは可能ですか?HLSL で外側のグローまたはアウトライン フィルターを実装する方法について、他のアイデアはありますか?

前もって感謝します。

4

1 に答える 1

9

この状況では、スケーリング戦略を適用することはできません。スケーリングステップを破棄し、ぼかしステップと構成ステップのみを使用します。それが動作します。

ブラーシェーダーがどのようにグロー効果を作成するかをお見せしましょう。

A:オリジナル画像があります。

元の画像

B:画像の色を変更し、ブラーシェーダーを適用します。

ぼやけた画像

C:ぼやけた画像を元の画像と組み合わせます。

結果画像

グローサイズを制御する場合は、スケーリングではなく、カーネルサイズのブラーステップを使用します。ガウスぼかしを使用して、下の画像を作成しました。

  • カーネルサイズ5

ガウスサイズ5

  • カーネルサイズ10

ガウスサイズ10

  • カーネルサイズ15

ここに画像の説明を入力してください

于 2012-09-26T08:41:34.703 に答える