0

描画テキストにぼかし効果を追加したい。と を使用SDL2SDL_TTFます。
SDL_Surface透明性があります。
シェーダーなしでそれを行う方法は? 以下は私が使用するアルゴリズムです。これは単純な平均です。

    Uint32 p;
    Uint8 r, g, b, a;       
    int x, y, px, py;
    int blur_sum_factor;
    for (y = 0; y < sfc_blur->h; y++)
    {
        for (x = 0; x < sfc_blur->w; x++)
        {
            double rd = 0.0, gd = 0.0, bd = 0.0, ad = 0.0;
            blur_sum_factor = 0;
            for (py = -blur_size; py <= blur_size; py++)
            {
                for (px = -blur_size; px <= blur_size; px++)
                {
                    int x1 = x + px;
                    int y1 = y + py;
                    if (x1 < 0 || x1 >= sfc_blur->w || y1 < 0 || y1 >= sfc_blur->h)
                        continue;
                    p = get_pixel32(sfc_blur, x1, y1);
                    SDL_GetRGBA(p, sfc_blur->format, &r, &g, &b, &a);
                    rd += r;
                    gd += g;
                    bd += b;
                    blur_sum_factor++;
                    ad += a;
                }
            }
            rd /= blur_sum_factor;
            gd /= blur_sum_factor;
            bd /= blur_sum_factor;
            ad /= blur_sum_factor;
            r = (Uint8)rd;
            g = (Uint8)gd;
            b = (Uint8)bd;
            a = (Uint8)ad;
            p = SDL_MapRGBA(sfc_blur_target->format, r, g, b, a);
            put_pixel32(sfc_blur_target, x, y, p);
        }
    }

その結果、テキストの周りに暗い領域があります。 ここに画像の説明を入力(見やすいように赤い背景 - 透明度のあるテキストにのみぼかしが適用されます。)

psシェーダーを使用したことがありません。そして、このタスクでは、シェーダーを使用できません (たとえ使用したかったとしても)。

4

1 に答える 1

0

この問題を解決しました。2 つの SDL_Surface を作成します。最初のテキストと、テキストとして背景色を使用した 2 番目のテキストです。そして、ぼやけたアルファ チャネルのみを作成します。

    for (y = 0; y < sfc_blur->h; y++)
    {
        for (x = 0; x < sfc_blur->w; x++)
        {
            double rd = 0.0, gd = 0.0, bd = 0.0, ad = 0.0;
            blur_sum_factor = 0;
            for (py = -blur_size; py <= blur_size; py++)
            {
                for (px = -blur_size; px <= blur_size; px++)
                {
                    int x1 = x + px;
                    int y1 = y + py;
                    if (x1 < 0 || x1 >= sfc_blur->w || y1 < 0 || y1 >= sfc_blur->h)
                        continue;
                    p = get_pixel32(sfc_blur, x1, y1);
                    SDL_GetRGBA(p, sfc_blur->format, &r, &g, &b, &a);
                    blur_sum_factor++;
                    ad += a;
                }
            }
            ad /= blur_sum_factor;
            p = get_pixel32(sfc_blur_target, x, y);
            SDL_GetRGB(p, sfc_blur_target->format, &r, &g, &b);
            a = (Uint8)ad;
            p = SDL_MapRGBA(sfc_blur_target->format, r, g, b, a);
            put_pixel32(sfc_blur_target, x, y, p);
        }
    }

次に、Gaussian Blur を追加してプロセスを並列化します。

于 2015-04-10T08:09:09.057 に答える